我有一个语法,并想证明它不在LL(1)中:
S->SA|A
A->a
由于它是一个左递归语法,为了找到第一个和后面的集合,我删除了左递归并得到了:
S->AS'
S'->AS'|Empty
A->a
first of A={a} follow of S={$}
first of s'={a,ε} follow of S'={$}
first of S={a} follow of A={a,$}
但是当我填写解析表时,我没有得到任何包含2个条目的单元格。那么如何证明给定的语法不在LL(1)中呢?
答案 0 :(得分:1)
首先,您要找到FIRST并关注已删除左递归的语法。因此,当然,如果您尝试创建LL(1)解析表,则不会有任何2个条目,因为删除了左递归并且语法是明确的。
语法[S-> SA | A A-> a]不是LL(1),因为存在左递归。要通过构造LL(1)解析表来证明它,你需要在不修改它的情况下找到这个语法的FIRST和FOLLOW。
从底部A-> a开始,给出FIRST(A)= {a}
S-> A,给出FIRST(S)= FIRST(A)= {a}
S-> SA,给出FIRST(S)= FIRST(S),我认为问题出现在这里。在这种递归调用中,规则表示计算FIRST(S)直到它改变,即直到元素被加入FIRST(S)继续计算。一旦它停止改变,你就回答
因此FIRST(S)= FIRST(S)= {a},您可以多次调用FIRST(S),它不会改变。 解析表:
a
------------
S S->SA
S->A
-------------
A A->a
因此(S,a)有两个条目。因此,它不是LL(1)
答案 1 :(得分:0)
对于此左递归语法:
S->SA|A
A->a
我们可以消除左递归,因为它会产生与上一个左递归语法相同的结果。
S->AS'
S'->AS'|Empty
A->a
first of A={a} follow of S={$}
first of s'={a,ε} follow of S'={$}
first of S={a} follow of A={a,$}
因此,实际上,对于上述情况,我们正在检查LL(1)
是否有修改的Left递归语法(相同)。
但是要遵循左递归语法:-
E -> E+n/n
我们无法修改该语法,它将改变+
运算符的关联性。
因此,我们唯一要做的就是检查LL(1)而不修改
(E->E+n/n ).
因此,我们可以说E->E+n/n
不是LL(1)
。