我在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没有错误,但是当我确定没有发生任何事情时。
我是否错误地改写了我想要实现的目标?
答案 0 :(得分:2)
您不能将任何生产或终端注入您的AST,而您在为您创建AST的解析器规则中不匹配。在您的情况下,您可以插入plus
或minus
,因为它们与解析器规则匹配,但您无法插入plus_special
或minus_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 : '-';