ANTLR重写语句的问题(简单?)

时间:2012-09-28 11:43:03

标签: java antlr3 antlrworks

我一直得到MissingTokenExceptionNullPointerException,如果我没记错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 '*'
;

除了无数其他版本(黑客),我已经失去了。

任何人都可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我以前遇到过这个问题。基本答案是ANTLR不允许您在' - >'的右侧使用令牌左边没有的声明。但是,您可以使用专门为AST定义的额外令牌。 只需在语法规则之前创建一个标记块,如下所示:

tokens { ABSTRACTTOKEN; }

您可以在语法语句的右侧使用它们,就像这样。

imult
: FLOAT '(' -> ^(ABSTRACTTOKEN FLOAT) 
;

希望有所帮助。