LL(1)语法可以有多个以相同的非终端开头的规则吗?

时间:2014-02-11 18:35:21

标签: parsing grammar context-free-grammar ll

给定由

定义的语法G.
A -> Ca
B -> Cb
C -> e|f

这个语法LL(1)?

我意识到我们可以将它压缩成一行,但这不是这个问题的重点。

主要是,LL(1)语法是否有多个以相同的非终端开头的规则?

作为后续问题,我如何构建上述语法的解析表?

我已经解决了以下问题:

FIRST(A) = {e,f}
FIRST(B) = {e,f}
FIRST(C) = {a,b}

FOLLOW(A) = {}
FOLLOW(B) = {}
FOLLOW(C) = {a,b}

我看了this post,但不明白他们是如何从FIRSTs和FOLLOWs到桌子的。

2 个答案:

答案 0 :(得分:2)

你给出的语法不是LL(1),因为两个作品A→Ca和A→Cb之间存在第一/第一冲突。

通常,具有相同非终结符的多个制作的语法将以LL(1)开头,因为您将获得FIRST / FIRST冲突。有这个属性的语法是LL(1),尽管它们基本上是退化的情况。例如,考虑以下语法:

  

A→Ea

     

A→Eb

     

E→ε

这里,非终结符号E仅扩展为空字符串ε,因此实际上并不存在。因此,上述语法是LL(1),因为两个产品之间没有FIRST / FIRST冲突。要看到这一点,这是解析表:

     a  b  $
A    Ea Eb -
E    ε  ε  -

希望这有帮助!

答案 1 :(得分:1)

我在2个案例中解决了你的问题:

第一种情况,如果终端是{a,b,e,f} enter image description here

第二种情况,如果终端是{a,b,f}而e是epsilon

enter image description here

所以没有多重条目这是LL(1)。

了解更多信息: 请看下面的解释和示例:

enter image description here

enter image description here

祝你好运