我正在使用 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
条规则(其中lvalue
is lvalue LBRACK exp RBRACK
)减少。相反,Yacc 发现语法错误并使用第三条规则ASSIGN
替换和解析。OF
exp
类似的问题也发生在lvalue DOT ID
.