我有一个语法可以解析像1+2-4
或1+x-y
这样的表达式,动态创建一个合适的结构,后来给定一个具有适当内容的Map<String, Integer>
,可以用数字方式进行评估(解析完成后,即仅x
或y
稍后才知道。
在语法内部,还有一些地方可以在现场评估,即不包含变量。我想我可以使用相同的逻辑解析这些,为规则添加一个布尔参数variablesAllowed
,如下所示:
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。)
答案 0 :(得分:0)
此问题是解析器用于预测的提升过程的一部分。我遇到了同样的问题,结果是成员var(或C目标的静态var)而不是参数。