1

我对 bnf 转换器中的规则优先级有疑问。这里我复制一些规则

CParams. CallParams ::= [CallParam] ;
separator CallParam "," ;
VarCParam. CallParam ::= Ident ;
ExpCParam. CallParam ::= Exp ;
BExpCParam. CallParam ::= BExp ;
[...]
EVar. Exp3 ::= Ident ;
[...]
BVar. BExp2 ::= Ident ;

我写了一个示例程序:

void p(int a) {
    a = a+7;
    print a;
}
main() {
    int i;
    p(i);
}

结果,我希望 p(i) 将被转换为 CParams [VarCParam (Ident "i")],但它被转换为 CParams [BExpCParam (BVar (Ident "i"))]。

你能告诉如何更改规则以修复此错误吗

4

1 回答 1

1

您的语法存在冲突:两种树都是可能的。happy只需选择一种方式,但在编译过程中可能会打印出类似这样的内容:

reduce/reduce conflicts: 2

要修复它,您必须删除这些规则之一:

VarCParam. CallParam ::= Ident ;
BExpCParam. CallParam ::= BExp ;
BVar. BExp2 ::= Ident ;
于 2013-11-21T11:49:31.783 回答