0
我正在使用ML-Yacc在SML中处理我的Tiger compiler的解析器组件。我找不到任何明显的语法问题(我使用优先规则来解决所有移位 - 缩减冲突),但似乎从来没有减少使用lvalue
的第二条和第三条规则,我已经指定如下:ML-Yacc Tiger解析器没有正确解析左值
lvalue : ID ()
| lvalue DOT ID ()
| lvalue LBRACK exp RBRACK()
语法为exp
是:
exp : lvalue ()
| INT ()
| ID LBRACK exp RBRACK OF exp()
| lvalue ASSIGN exp ()
...
当试图解析a[0] := 5
,我希望它使用第四exp
规则(其中lvalue
是lvalue LBRACK exp RBRACK
)减少。相反,Yacc发现语法错误,并将ASSIGN
替换为OF
,并使用第三个exp
规则进行解析。
与lvalue DOT ID
发生类似的问题。
左递归不是问题,确切地说。对于自下而上的解析器,左递归通常不成问题。问题是'ID LBRACK exp RBRACK OF exp'中的'ID'。如果它是'Lvalue LBRACK ...',那就没有问题了。但正如所写,分析器无法知道是否将'ID'减少为'lvalue'。 Appel在他的教科书(或者至少一个教科书的语言版本)中注意到了这个问题,我用'bison' [here](https://stackoverflow.com/a/26977277/1566221)讨论了一些可能的解决方案(开始与段落“状态1中的转换/减少冲突...”) – rici
@rici作出回应后,我开始怀疑左递归是否真的可能是问题。谢谢你的澄清 - 我考虑编辑OP询问它,但不知道它会得到多少可见性。 – MattDs17