antlr rule布尔参数在语法谓词代码中显示高一级,导致编译错误

时间:2014-10-22 12:23:34

标签: antlr antlr3

我有一个语法可以解析像1+2-41+x-y这样的表达式,动态创建一个合适的结构,后来给定一个具有适当内容的Map<String, Integer>,可以用数字方式进行评估(解析完成后,即仅xy稍后才知道。

在语法内部,还有一些地方可以在现场评估,即不包含变量。我想我可以使用相同的逻辑解析这些,为规则添加一个布尔参数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。)

1 个答案:

答案 0 :(得分:0)

此问题是解析器用于预测的提升过程的一部分。我遇到了同样的问题,结果是成员var(或C目标的静态var)而不是参数。