ML-Yacc Tiger Parser无法正确解析左值

时间:2017-09-02 17:45:29

标签: parsing yacc tiger ml-yacc

我正在使用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规则(lvaluelvalue LBRACK exp RBRACK)来减少它。相反,Yacc发现语法错误并将ASSIGN替换为OF并使用第三个exp规则进行解析。

lvalue DOT ID会出现类似的问题。

1 个答案:

答案 0 :(得分:0)

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

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

编辑:左派因素恰好解决了问题,但左递归不是问题。请参阅下面的评论和类似的linked question

lvalue : ID lvalue'                 ()

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