判断语法是否为LR(0)

时间:2014-02-25 07:29:51

标签: parsing compilation grammar lr bottom-up

我是编辑主题的新手,刚开始进行Bottom -up解析练习。

我坚持以下问题。

为后续语法构建LR(0)解析表:

1) E –> E + T
2) E –> T
3) T –> (E)
4) T –> id


I0 :

   E' –> .E
   E –> .E + T
   E –> .T
   T –> .(E)
   T –> .id
在E上的下一个状态是:

 I1:

    E' -> E.
    E  -> E. + T
从我到目前为止所学到的不是这个S-R冲突? 因为解析器不会知道是否减少或移位 没有预见变量? 所以这不应该是LR(0)语法?

但我正在阅读的PDF构建了LR(0)表。 那么PDF中是否存在错误,或者我在理解概念时出错?

2 个答案:

答案 0 :(得分:2)

您使用E' -> E扩充了语法。通常情况下,你会使用类似E' -> E $的生成来扩充,其中$是一个(终端)符号,在语法中不会出现,并表示输入结束。

所以I1实际上是


E' -> E. $
E  -> E. + T

并没有冲突。 (我相信语法 LR(0)。)

答案 1 :(得分:1)

这确实是一种转移/减少冲突。这个语法不是LR(0)。您也可以看到这个,因为它不是前缀;语法包含多个彼此前缀的字符串,因此它不能是LR(0)。

也就是说,您仍然可以构造所有LR(0)配置集并生成LR(0)自动机。由于转移/减少冲突,它不会是确定性的。因此,你可能是正确的,并且讲义是正确的。

希望这有帮助!