Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
antlr规则布尔参数在语法谓词代码中显示得更高一级,导致编译错误_Antlr_Antlr3 - Fatal编程技术网

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

antlr规则布尔参数在语法谓词代码中显示得更高一级,导致编译错误,antlr,antlr3,Antlr,Antlr3,我有一个语法,可以解析表达式,比如1+2-4或1+x-y,动态创建一个适当的结构,之后,给定一个具有适当内容的映射,可以在解析完成后进行数值计算,也就是说,对于x或y,只在以后知道 在语法中,也有一些地方应该出现可以当场计算的表达式,即不包含变量的表达式。我想我可以用同样的逻辑来解析它们,在规则中添加一个布尔参数variablesAllowed,如下所示: grammar MiniExprParser; INT : ('0'..'9')+; ID : ('a'..'z'| 'A'..'Z')('

我有一个语法,可以解析表达式,比如1+2-4或1+x-y,动态创建一个适当的结构,之后,给定一个具有适当内容的映射,可以在解析完成后进行数值计算,也就是说,对于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一起使用。

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

我建议不要编写操作。如果要进行优化,请在解析树遍历器中执行额外的过程,可能会生成中间代码。