【问题标题】:ML-Yacc Tiger Parser not properly parsing lvalueML-Yacc Tiger Parser 无法正确解析左值
【发布时间】:2017-09-02 17:45:28
【问题描述】:

我正在使用 ML-Yacc 在 SML 中处理我的 Tiger compiler 的解析器组件。我的语法文件找不到任何明显的问题(我使用优先级规则来解决所有移位减少冲突),但使用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 规则(其中 lvaluelvalue LBRACK exp RBRACK)来减少它。相反,Yacc 发现语法错误并用ASSIGN 替换OF 并使用第三条exp 规则进行解析。

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

【问题讨论】:

    标签: parsing yacc tiger ml-yacc


    【解决方案1】:

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

    问题(我认为)是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。阿佩尔在他的教科书(或至少一个教科书的语言版本)中指出了这个问题,我与bisonhere讨论了一些可能的解决方案(从“状态1中的移位/减少冲突...... ")
    • @rici 做出回应后,我开始怀疑左递归是否真的是问题所在。感谢您的澄清 - 我考虑编辑 OP 以询问它,但不确定它会获得多少可见性。
    猜你喜欢
    • 1970-01-01
    • 2011-11-10
    • 2023-03-09
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    相关资源
    最近更新 更多