【问题标题】:How to prove left-recursive grammar is not in LL(1) using parsing table如何使用解析表证明左递归语法不在LL(1)中
【发布时间】:2015-02-26 12:42:43
【问题描述】:

我有一个语法,想证明它不在 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) 中呢?

【问题讨论】:

  • 如果语法不明确(至少一个句子有不止一个解析树),那么该语法不在LL(1)中。现在我应该如何在这里表示解析表?
  • 我知道左递归语法,模棱两可的语法不提供 ll(1) 语言。但我需要使用解析表来显示这个...如何?
  • Follow of (A)={ first of S'} ={a,用 S' 替换 epsilon 我必须写下 S 和 S'} 的后续,即 {a,$} 请建议我我错了。
  • 您的 FIRST()FOLLOW() 计算根据更正的 CFG 是正确的。我将不得不检查语法以及 LL(1) 解析表的此类规则。

标签: parsing compiler-construction automation formal-languages ll


【解决方案1】:

首先,您会在删除左递归的语法上找到 FIRST 和 FOLLOW。因此,如果您尝试创建 LL(1) 解析表,肯定不会有任何 2 个条目,因为左递归被删除并且语法是明确的。

Grammar[ 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)

【讨论】:

  • 我们能说它是否会是 ELL(k) 吗?
【解决方案2】:

对于这个左递归语法:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 2022-08-09
    • 1970-01-01
    • 2010-09-12
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多