Parsing 如何使用解析表证明左递归语法不在LL(1)中

Parsing 如何使用解析表证明左递归语法不在LL(1)中,parsing,compiler-construction,automation,formal-languages,ll,Parsing,Compiler Construction,Automation,Formal Languages,Ll,我有语法,并想证明它不在LL(1)中: 由于它是一个左递归文法,为了找到第一个和后续集合,我消除了左递归,得到: 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

我有语法,并想证明它不在LL(1)中:

由于它是一个左递归文法,为了找到第一个和后续集合,我消除了左递归,得到:

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)中呢

首先,您将首先查找并遵循删除左递归的语法。所以,若您试图创建LL(1)解析表,那个么肯定不会有任何2个条目,因为左递归被删除,并且语法是明确的

语法[S->SA | A->A]不是LL(1),因为存在左递归。要通过构造LL(1)解析表来证明这一点,您需要首先找到并遵循此语法,而不需要修改它

从底部开始A->A,首先给出(A)={A}

S->A,给出第一个(S)=第一个(A)={A}

S->SA,给出第一个=第一个,我认为问题出现在这里。在这种递归调用中,规则说先计算,直到它发生变化,也就是说,直到元素添加到第一个中,才继续计算。一旦它停止改变,这就是你的答案

因此FIRST(S)=FIRST(S)={a},您尽可能多次地调用FIRST(S),它不会改变。 解析表:

      a
------------ 
S   S->SA
    S->A
-------------
A   A->a 

(S,a)有两个条目。因此,对于这种左递归语法,它不是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,$}
因此,对于上述情况,我们实际上是在检查修改的左递归语法的
LL(1)
(因为它是相同的)。 但对于以下左递归语法:-

E -> E+n/n
我们不能修改该语法,它将改变
+
运算符的关联性

所以,我们唯一要做的就是检查LL(1),而不修改

(E->E+n/n ).

因此,我们可以说
E->E+n/n
不是
LL(1)

如果语法不明确(至少一个句子有多个语法树),那么语法就不在LL(1)中。现在我应该如何在这里表示解析表?我知道左递归语法,模糊语法没有给出ll(1)语言。但是我需要使用解析表来说明这一点…如何?Follow of(A)={first of S'}={A,将epsilon替换为S'I have write Follow of S and S'},即{A,$}请告诉我哪里错了。你的
first()
FOLLOW()
根据修正的CFG计算正确。我必须检查ll(1)解析表的语法以及这些规则。我们能说它是否是ll(k)吗?
(E->E+n/n ).