antlr规则布尔参数在语法谓词代码中显示得更高一级,导致编译错误
我有一个语法,可以解析表达式,比如1+2-4或1+x-y,动态创建一个适当的结构,之后,给定一个具有适当内容的映射,可以在解析完成后进行数值计算,也就是说,对于x或y,只在以后知道 在语法中,也有一些地方应该出现可以当场计算的表达式,即不包含变量的表达式。我想我可以用同样的逻辑来解析它们,在规则中添加一个布尔参数variablesAllowed,如下所示:antlr规则布尔参数在语法谓词代码中显示得更高一级,导致编译错误,antlr,antlr3,Antlr,Antlr3,我有一个语法,可以解析表达式,比如1+2-4或1+x-y,动态创建一个适当的结构,之后,给定一个具有适当内容的映射,可以在解析完成后进行数值计算,也就是说,对于x或y,只在以后知道 在语法中,也有一些地方应该出现可以当场计算的表达式,即不包含变量的表达式。我想我可以用同样的逻辑来解析它们,在规则中添加一个布尔参数variablesAllowed,如下所示: grammar MiniExprParser; INT : ('0'..'9')+; ID : ('a'..'z'| 'A'..'Z')('
grammar MiniExprParser;
INT : ('0'..'9')+;
ID : ('a'..'z'| 'A'..'Z')('a'..'z'| 'A'..'Z'| '0'..'9')*;
PLUS : '+';
MINUS : '-';
numexpr returns [Double val]:
expr[false] {$val = /* some evaluation code */ 0.;};
varexpr /*...*/:
expr[true] {/*...*/};
expr[boolean varsAllowed] /*...*/:
e=atomNode[varsAllowed] {/*...*/}
(PLUS e2=atomNode[varsAllowed] {/*...*/}
|MINUS e2=atomNode[varsAllowed] {/*...*/}
)* ;
atomNode[boolean varsAllowed] /*...*/:
(n=INT {/*...*/})
|{varsAllowed}?=> ID {/*...*/}
;
result:
(numexpr) => numexpr {System.out.println("Numeric result: " + $numexpr.val);}
|varexpr {System.out.println("Variable expression: " + $varexpr.text);};
但是,生成的Java代码不会编译。在显然负责最终规则的语法谓词的部分中,varsAllowed出现,即使变量从未在此级别定义
/* ... */
else if ( (LA3_0==ID) && ((varsAllowed))) {
int LA3_2 = input.LA(2);
if ( ((synpred1_MiniExprParser()&&(varsAllowed))) ) {
alt3=1;
}
else if ( ((varsAllowed)) ) {
alt3=2;
}
/* ... */
我用错了吗?我将Eclipse的AntlrIDE 2.1.2与Antlr 3.5.2一起使用。这个问题是解析器用于预测的提升过程的一部分。我遇到了同样的问题,结果是C目标的成员变量或静态变量而不是参数。我建议不要编写操作。如果要进行优化,请在解析树遍历器中执行额外的过程,可能会生成中间代码。