我是汇编主题的新手,刚刚开始练习底部解析。

我陷入了以下问题。

为以下语法构建一个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
.

到目前为止,我所学到的不是这是一个s-r冲突吗? 因为解析器不知道是否将其转变为它 没有展示前瞻性变量? 所以这不应该是lr(0)语法?

但我正在阅读的PDF已经建立了LR(0)表。 所以PDF有一个错误,或者我错了一些理解这个概念的地方?

有帮助吗?

解决方案

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

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

希望这有帮助!

其他提示

您将语法增强为E' -> E。通常情况下,您可以使用生成的生产等生成,其中$是在语法中否则不会出现的(终端)符号,并表示输入结束。

所以i1实际上是


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

并且没有冲突。(并且我认为语法 LR(0)。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top