我一直得到MissingTokenException
,NullPointerException
,如果我没记错NoViableAlterativeException
。来自ANTLRWorks的日志文件/控制台输出对我来说没有用。
我所追求的是重写如下:
(expression | FLOAT) '(' -> (expression | FLOAT) '*('
下面是我用语法创建测试文件的语法示例。
grammar Test;
expression
: //FLOAT '(' -> (FLOAT '*(')+
| add EOF!
;
term
:
| '(' add ')'
| FLOAT
| IMULT
;
IMULT
: (add ('(' add)*) -> (add ('*' add)*)
;
negation
: '-'* term
;
unary
: ('+' | '-')* negation
;
mult
: unary (('*' | '/') unary)*
;
add
: mult (('+' | '-') mult)*
;
ID : ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
;
FLOAT
: ('0'..'9')+ '.' ('0'..'9')*// EXPONENT?
| '.' ('0'..'9')+ //EXPONENT?
| ('0'..'9')+ //EXPONENT
;
WS : ( ' '
| '\t'
| '\r'
| '\n'
) {$channel=HIDDEN;}
;
我也试过了:
imult
: FLOAT '(' -> FLOAT '*('
;
而且:
IMULT / imult
: expression '(' -> expression '*'
;
除了无数其他版本(黑客),我已经失去了。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:1)
我以前遇到过这个问题。基本答案是ANTLR不允许您在' - >'的右侧使用令牌左边没有的声明。但是,您可以使用专门为AST定义的额外令牌。 只需在语法规则之前创建一个标记块,如下所示:
tokens { ABSTRACTTOKEN; }
您可以在语法语句的右侧使用它们,就像这样。
imult
: FLOAT '(' -> ^(ABSTRACTTOKEN FLOAT)
;
希望有所帮助。