第一组LL(1)解析器

时间:2017-02-08 09:39:08

标签: ll

我在理解以下适用于第一组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 non­nullable 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也令人困惑。

1 个答案:

答案 0 :(得分:0)

它说的是句子形式中你可以期待的终端是什么,这样你就可以在最左边的派生中用S替换AB。因此,如果A派生ε,那么在最左边的派生中,您可以将A替换为ε。所以现在你依赖B并说出来。考虑这个示例语法:

S -> AB
A -> ε
B -> h

所以,如果有一个只有一个字符/终端"h"的字符串,你开始通过检查是否有任何最左边的派生使用上面的语法派生字符串来验证这个字符串是否有效,那么你可以安全地将S替换为AB,因为A将派生εB将派生h

因此,上述语法识别的语言不能包含空ε字符串。如果语言中包含εB也应该派生ε。所以现在非终端AB都派生ε,因此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可以派生出一个空字符串ε