我在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”等,则最终会达到当我按“生成”时ANTLRWORKS不会做任何事情的地步。

根据ANTLRWORKS,没有错误,但是当我发出压力时,什么也没发生。

我是否为要达到的目标错误地重写了代码?

最佳答案

您不能仅将任何产品或终端注入到您要为其创建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 : '-';

10-06 10:22