0

我正在使用 ML-Yacc 在 SML中处理我的Tiger 编译器的解析器组件。我的语法文件找不到任何明显的问题(我使用优先级规则来解决所有移位减少冲突),但它似乎永远不会使用 的第二个和第三个规则来减少lvalue,我指定如下:

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

的语法exp是:

exp : lvalue                      ()
    | INT                         ()
    | ID LBRACK exp RBRACK OF exp ()
    | lvalue ASSIGN exp           ()
    ...

在尝试 parsea[0] := 5时,我希望它使用第四exp条规则(其中lvalueis lvalue LBRACK exp RBRACK)减少。相反,Yacc 发现语法错误并使用第三条规则ASSIGN替换和解析。OFexp

类似的问题也发生在lvalue DOT ID.

4

1 回答 1

0

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

问题(我认为)是 for 的语法lvalue是左递归的。我认为 Yacc 可能会对此发出警告,但事实并非如此——也许我设置的优先规则隐藏了问题。左分解语法解决了这个问题:

编辑:左分解恰好解决了问题,但左递归不是问题。请参阅下面的评论和类似的链接问题

lvalue : ID lvalue'                 ()

lvalue' :                           ()
        | DOT ID lvalue'            ()
        | LBRACK exp RBRACK lvalue' ()
于 2017-09-02T17:45:28.753 回答