我在 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 没有错误,但当我预生成时什么也没有发生。
我是否错误地重写了我想要实现的目标?
最佳答案
您不能将任何与您为其创建 AST 的解析器规则不匹配的产生式或终端注入(inject)到 AST 中。在您的情况下,您可以插入 plus
或 minus
因为它们与解析器规则匹配,但不能插入 plus_special
或 minus_special
因为这些与解析器规则 num_addition
不匹配。
不过,您可以注入(inject)虚构的 token 。
尝试这样的事情:
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 : '-';
关于java - 扩展 token 选择运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22212518/