我正在使用ML-Yacc在SML中处理Tiger compiler的解析器组件。我找不到语法文件的任何明显问题(我已经使用优先级规则来解决所有的shift-reduce冲突),但似乎永远不会减少使用lvalue
的第二和第三条规则,我和#39} ; ve指定如下:
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
会出现类似的问题。
答案 0 :(得分:0)
我在输入问题时解决了我的问题,所以如果有其他人遇到这个问题,我会回答我的问题。
问题(我认为)是 lvalue
的语法是左递归的。我认为Yacc可能会对此发出警告,但它并没有 - 也许我设置的优先规则隐藏了这个问题。语法左对因解决问题:
编辑:左派因素恰好解决了问题,但左递归不是问题。请参阅下面的评论和类似的linked question。
lvalue : ID lvalue' ()
lvalue' : ()
| DOT ID lvalue' ()
| LBRACK exp RBRACK lvalue' ()