2012-09-28 3 views
0

MissingTokenException, NullPointerException, 계속 정확하게 기억한다면 NoViableAlterativeException입니다. ANTLRWorks의 logfile/console 출력은 저에게 도움이되지 않습니다.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) 
; 

희망이 있습니다.