我正在使用ML-YACC在SML中的老虎编译器的解析器组件上工作。我的语法文件找不到任何明显的问题(我已经使用了优先规则来解决所有转移冲突),但似乎永远不会使用lvalue
的第二和第三规则减少,我指定了以下内容:
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使用第三个exp
规则找到了语法错误,并用ASSIGN
替换为OF
和解析。
lvalue DOT ID
发生类似的问题。
我在键入问题时解决了我的问题,所以我会回答我的问题,以防其他人遇到这个问题。
问题(我认为)是
lvalue
的语法是左记录的。我认为YACC可能会发出警告,但事实并非如此 - 也许我设定的优先规则隐藏了问题。左图语法解决了问题:
编辑:左派恰好解决了这个问题,但左记录不是问题。请参阅下面的评论和类似的链接问题。
lvalue : ID lvalue' ()
lvalue' : ()
| DOT ID lvalue' ()
| LBRACK exp RBRACK lvalue' ()