我在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的解析器规则中不匹配的产品或终端中。在您的情况下,您可以插入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 : '-';