在bnf转换器中拟合顺序

时间:2013-04-02 13:37:54

标签: bnf bnfc

我在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”))]。

您能告诉我们如何更改规则以修复此错误

1 个答案:

答案 0 :(得分:1)

你的语法存在冲突:两棵树都是可能的。 happy只需选择一种方式,但可能在编译期间打印出类似的内容:

reduce/reduce conflicts: 2

要修复它,您必须删除其中一条规则:

VarCParam. CallParam ::= Ident ;
BExpCParam. CallParam ::= BExp ;
BVar. BExp2 ::= Ident ;