2012-09-28 59 views
0

我總是收到MissingTokenException,NullPointerException,如果我沒記錯的話NoViableAlterativeException。 ANTLRWorks的日誌文件/控制檯輸出對我來說不夠有幫助。ANTLR重寫聲明的問題(簡單?)

我後是一個改寫如下所示:

(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

我以前遇到過這個問題。基本答案是ANTLR不允許你在' - >'語句的右邊使用不在左邊的令牌。但是,你可以做的是使用專門爲AST定義的額外令牌。 語法規則之前,只需創建一個標記塊如下:

tokens { ABSTRACTTOKEN; } 

可以在這樣的語法語句的右邊使用它們。

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

希望有所幫助。