ML-Yacc Tiger解析器没有正确解析左值
问题描述:
我正在使用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
发生类似的问题。
答
我在输入问题时解决了我的问题,因此如果有其他人遇到此问题,我会回答我的问题。
问题(我认为)是lvalue
的语法是左递归的。我认为Yacc可能会对此发出警告,但它没有 - 可能是我设置的优先规则隐藏了问题。左考虑的语法解决了这个问题:
编辑:左保养刚刚发生解决问题,但左递归不是问题。请参阅下面的评论和类似linked question。
lvalue : ID lvalue' ()
lvalue' : ()
| DOT ID lvalue' ()
| LBRACK exp RBRACK lvalue'()
左递归不是问题,确切地说。对于自下而上的解析器,左递归通常不成问题。问题是'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