什么是前瞻符号?

时间:2015-04-04 08:29:31

标签: compiler-construction grammar

在语法中(例如 LL(1)), 1 表示外观符号。在实践中,我不明白这个符号是什么。要理解,我需要一个简单实用的例子。

1 个答案:

答案 0 :(得分:4)

LL(1)语法可帮助您立即决定使用哪种语法规则。这个前瞻标记意味着您只需要从正在阅读的当前字符中读取下一个字符。

LL(1)语法可以帮助您将复杂性降低到O(n),并且在解析输入时没有回溯。

Wikipedia Example

%成为您正在阅读的字符,输入字符串为( a + a )

LL(1)语法:

S -> F (Rule1)

S -> ( S + F ) (Rule2)

F -> a (Rule3)

解析表是:

    (   )   a   +   $
S   2   -   1   -   -
F   -   -   3   -   -

然后你有:

%( a + a )(读取字符串的开头和lookahead是(因此决定根据解析表应用Rule2)

抽象语法树现在是:

            S
        / / | \ \
       (  S + F  )

然后你消耗(。而你继续以同样的方式。

第2步:

            S
        / / | \ \
       (  S + F  )
          |
          F
          |
          a

第3步:

            S
        / / | \ \
       (  S + F  )
          |   |
          F   a
          |
          a

您可以看到使用堆栈的Wikipedia示例,而不是完全相同的抽象语法树。