我在理解以下适用于第一组LL(1)解析器的规则时遇到了一些问题:
b) Else X1 is a nonterminal, so add First(X1) - ε to First(u).
a. If X1 is a nullable nonterminal, i.e., X1 =>* ε, add First(X2) - ε to First(u).
Furthermore, if X2 can also go to ε, then add First(X3) - ε and so on, through all Xn until the first nonnullable symbol is encountered.
b. If X1X2...Xn =>* ε, add ε to the first set.
如何在b)如果X1非终结,它不能将ε添加到First(u)?所以,如果我有
S-> A / a
A-> b / ε
F(A) = {b,ε}
F(S) = {b,ε,a}
这不正确?小点a和b也令人困惑。
答案 0 :(得分:0)
它说的是句子形式中你可以期待的终端是什么,这样你就可以在最左边的派生中用S
替换AB
。因此,如果A
派生ε
,那么在最左边的派生中,您可以将A
替换为ε
。所以现在你依赖B
并说出来。考虑这个示例语法:
S -> AB
A -> ε
B -> h
所以,如果有一个只有一个字符/终端"h"
的字符串,你开始通过检查是否有任何最左边的派生使用上面的语法派生字符串来验证这个字符串是否有效,那么你可以安全地将S
替换为AB
,因为A
将派生ε
而B
将派生h
。
因此,上述语法识别的语言不能包含空ε
字符串。如果语言中包含ε
,B
也应该派生ε
。所以现在非终端A
和B
都派生ε
,因此S
派生ε
。
也就是说,如果有一些作品S->ABCD
,并且所有非终端A,B,C and D
都派生ε
,则只有S
也可以派生ε
因此ε
将在FIRST(S)
。
你给出的第一套是正确的。我认为你很困惑,因为制作S->A
在rhs上只有一个终结符A
,而A
派生ε
。现在根据b)
FIRST(S) = {FIRST(A) - ε, a,} = {b, a}
这是不正确的。由于rhs只有一个终端,因此存在以下可能性S -> A -> ε
,指出FIRST(S) has ε
或S
可以派生出一个空字符串ε
。