我在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”))]。
您能告诉我们如何更改规则以修复此错误
答案 0 :(得分:1)
你的语法存在冲突:两棵树都是可能的。 happy
只需选择一种方式,但可能在编译期间打印出类似的内容:
reduce/reduce conflicts: 2
要修复它,您必须删除其中一条规则:
VarCParam. CallParam ::= Ident ;
BExpCParam. CallParam ::= BExp ;
BVar. BExp2 ::= Ident ;