我无法理解如何使用自下而上的解析器,例如输入字符串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访客)并且它们都产生了正确的结果。
这样,我知道问题在于我,而不是语法本身。那我做错了什么呢?
谢谢!
答案 0 :(得分:1)
转移 - 减少冲突是语法中最常见的冲突类型。在您的情况下,T(2)可以减少到E(2),或者时间可以移位。默认情况下,大多数解析器生成器更愿意转移而不是减少。但是他们仍然会将T(1)减少到E(1),因为他们知道在T之后没有任何一点可以移动加号。