有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java扩展令牌选择操作符

我在ANTLR3中有一个表达式

num_addition
    : num_multi ((plus^|minus^) num_multi)*
    ;

我想把标记“加”和“减”改成一个不同的标记,所以我试着制定这个重写规则

num_addition
    : num_multi (plus num_multi)* -> ^(num_multi ^(plus_special num_multi)*)
    | num_multi (minus num_multi)* -> ^(num_multi ^(minus_special num_multi)*)
    ;

如果我这样做,ANTLRWORKS中的生成似乎需要更长的时间,但它生成了正确的语法和标记。如果我将此样式应用于其他规则,例如“multi”和“divide”以及“equalequal”等,那么当我按下Generate时,AntlWorks最终将无法执行任何操作

根据ANTLRWORKS,没有错误,但当I pres生成时,什么也没有发生

我是否错误地改写了我想要实现的目标


共 (1) 个答案

  1. # 1 楼答案

    您不能将任何产品或终端注入到您的AST中,这些产品或终端在您为其创建AST的解析器规则中不匹配。在本例中,您可以插入plusminus,因为它们由解析器规则匹配,但是您不能插入plus_specialminus_special,因为它们不由解析器规则num_addition匹配

    不过,您可以注入虚构的标记

    试着这样做:

    grammar T;
    
    tokens {
      // Some imaginary tokens:
      PLUS_SPECIAL;
      MINUS_SPECIAL;
    }
    
    // ...
    
    num_addition
     : (a=num_multi -> $a) ( PLUS  b=num_multi -> ^(PLUS_SPECIAL  $num_addition $b)
                           | MINUS b=num_multi -> ^(MINUS_SPECIAL $num_addition $b)
                           )*
     ;
    
    // ...
    
    PLUS : '+';
    MINUS : '-';