什么是前瞻符号?
What is the lookahead symbol?
语法中(例如LL(1)),1表示lookahed符号。实际上我不明白这个符号是什么。为了理解,我需要一个简单实用的例子。
LL(1) 语法可帮助您立即决定要使用哪个 语法规则。这个前瞻标记意味着您只需从您正在阅读的当前字符中读取下一个字符。
LL(1) 语法帮助您将复杂性降低到 O(n)
并且在解析输入时没有回溯。
令%
为您正在阅读的字符,输入字符串为( a + a )
一个 LL(1) 语法:
S -> F (Rule1)
S -> ( S + F ) (Rule2)
F -> a (Rule3)
解析 Table 是:
( ) a + $
S 2 - 1 - -
F - - 3 - -
那么你有:
%( a + a )
(读取字符串的开头,lookahead是(,所以根据解析table决定应用Rule2)
抽象语法树现在是:
S
/ / | \ \
( S + F )
然后你消耗(
。然后你继续以同样的方式。
第 2 步:
S
/ / | \ \
( S + F )
|
F
|
a
第 3 步:
S
/ / | \ \
( S + F )
| |
F a
|
a
您可以看到 Wikipedia 示例,它以完全相同的方式使用堆栈而不是抽象语法树。
语法中(例如LL(1)),1表示lookahed符号。实际上我不明白这个符号是什么。为了理解,我需要一个简单实用的例子。
LL(1) 语法可帮助您立即决定要使用哪个 语法规则。这个前瞻标记意味着您只需从您正在阅读的当前字符中读取下一个字符。
LL(1) 语法帮助您将复杂性降低到 O(n)
并且在解析输入时没有回溯。
令%
为您正在阅读的字符,输入字符串为( a + a )
一个 LL(1) 语法:
S -> F (Rule1)
S -> ( S + F ) (Rule2)
F -> a (Rule3)
解析 Table 是:
( ) a + $
S 2 - 1 - -
F - - 3 - -
那么你有:
%( a + a )
(读取字符串的开头,lookahead是(,所以根据解析table决定应用Rule2)
抽象语法树现在是:
S
/ / | \ \
( S + F )
然后你消耗(
。然后你继续以同样的方式。
第 2 步:
S
/ / | \ \
( S + F )
|
F
|
a
第 3 步:
S
/ / | \ \
( S + F )
| |
F a
|
a
您可以看到 Wikipedia 示例,它以完全相同的方式使用堆栈而不是抽象语法树。