使用简单求和和乘法语法进行反向推导的问题

时间:2011-04-09 16:04:07

标签: compiler-construction grammar sablecc

我无法理解如何使用自下而上的解析器,例如输入字符串1 + 2 * 3,从“底部”转到“顶部”。

这是我正在使用的语法(我说它是正确的,因为它是在Crafting编译器中找到的那个)

E = E plus T
  | T;

T = T times integer
  | integer;

这是我的反向推导:

int(1)
T(1)
E(1)
E(1) plus int(2)
E(1) plus T(2)
E(1) plus E(2)
E(1) plus E(2) times int(3)
E(1) plus E(2) times E(3) <-- can't do anything here

问题在于,每当我得到一个整数作为输入时,它将在E中自动“转换”。

我非常肯定给定的语法是正确的。我也在sablecc中尝试了一些输入字符串(使用我制作的Pretty Printer访客)并且它们都产生了正确的结果。

这样,我知道问题在于我,而不是语法本身。那我做错了什么呢?

谢谢!

1 个答案:

答案 0 :(得分:1)

转移 - 减少冲突是语法中最常见的冲突类型。在您的情况下,T(2)可以减少到E(2),或者时间可以移位。默认情况下,大多数解析器生成器更愿意转移而不是减少。但是他们仍然会将T(1)减少到E(1),因为他们知道在T之后没有任何一点可以移动加号。