2

我是编译主题的新手,刚刚开始了自下而上解析的练习。

我一直坚持以下问题。

为以下语法构建一个 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 上,DFA 中的下一个状态是:

 I1:

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

从我目前了解到的情况来看,这不是 SR 冲突吗?因为解析器不知道是减少还是移位,因为它没有前瞻变量?所以这不应该是 LR(0) 语法吗?

但是我正在阅读的 PDF 已经构建了 LR(0) 表。那么PDF中有错误还是我在理解这个概念的地方出错了?

4

2 回答 2

3

你用 . 扩充了语法E' -> E。通常,您会使用类似 的产生式进行扩充E' -> E $,其中 $ 是语法中不会出现的(终端)符号,表示输入结束。

所以 I1 实际上是


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

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

于 2014-02-26T08:28:38.513 回答
2

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

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

希望这可以帮助!

于 2014-02-25T07:46:03.093 回答