扩展令牌选择运算符

时间:2014-03-06 00:37:19

标签: java antlr antlr3 lexer

我在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时,它最终会达到ANTLRWORKS不会做任何事情的程度。

根据ANTLRWORKS没有错误,但是当我确定没有发生任何事情时。

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

1 个答案:

答案 0 :(得分:2)

您不能将任何生产或终端注入您的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 : '-';