2017-09-02 66 views
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规则(其中lvaluelvalue LBRACK exp RBRACK)减少。相反,Yacc发现语法错误,并将ASSIGN替换为OF,并使用第三个exp规则进行解析。

lvalue DOT ID发生类似的问题。

回答

0

我在输入问题时解决了我的问题,因此如果有其他人遇到此问题,我会回答我的问题。

问题(我认为)是lvalue的语法是左递归的。我认为Yacc可能会对此发出警告,但它没有 - 可能是我设置的优先规则隐藏了问题。左考虑的语法解决了这个问题:

编辑:左保养刚刚发生解决问题,但左递归不是问题。请参阅下面的评论和类似linked question

lvalue : ID lvalue'    () 

lvalue' :       () 
     | DOT ID lvalue'   () 
     | LBRACK exp RBRACK lvalue'() 
+1

左递归不是问题,确切地说。对于自下而上的解析器,左递归通常不成问题。问题是'ID LBRACK exp RBRACK OF exp'中的'ID'。如果它是'Lvalue LBRACK ...',那就没有问题了。但正如所写,分析器无法知道是否将'ID'减少为'lvalue'。 Appel在他的教科书(或者至少一个教科书的语言版本)中注意到了这个问题,我用'bison' [here](https://stackoverflow.com/a/26977277/1566221)讨论了一些可能的解决方案(开始与段落“状态1中的转换/减少冲突...”) – rici

+0

@rici作出回应后,我开始怀疑左递归是否真的可能是问题。谢谢你的澄清 - 我考虑编辑OP询问它,但不知道它会得到多少可见性。 – MattDs17