2013-11-27 3 views
0

내 ANTLR 문법은 다음과 같습니다.ANTLR : 루프가 '%'문자와 일치하지 않습니다.

grammar ProgCalc; 

options { 
    language = Java; 
    ASTLabelType=CommonTree; 
    output=AST; 
    backtrack=true; 
} 

/* Parser rules */ 
eval 
    : exp=add; 

add 
    : term (PLUS^ term | MINUS^ term) *; 

term 
    : factor (MULT^ factor | MOD^ factor)*; 

factor 
    : number 
    | VARIABLE 
    | '('! add^ ')'! 
    ; 

number 
    : DEC | HEX | OCT; 

/* Lexer Rules*/ 
VARIABLE: ('a'..'z' |'A'..'Z')('a'..'z'|'A'..'Z' | '0'..'9'|'_')* ; 
DEC  : ('1'..'9')('0'..'9')+; 
HEX  : '0x' ('0'..'9' | 'a'..'f' | 'A'..'F')+; 
OCT  : '0' ('0'..'7')*; 

PLUS : '+'; 
MINUS : '-'; 
MULT : '*'; 
MOD  : '%'; 

WHITESPACE : ('\t' | ' ' | '\r' | '\n'| '\u000C')+ { $channel = HIDDEN; }; 

컴파일 할 때 성공했습니다. 하지만 표현식 (예 : 5 % 3 * 5)을 파싱하면 오류가 발생합니다.

line 1:1 required (...)+ loop did not match anything at character '%' 
line 1:3 required (...)+ loop did not match anything at character '*' 
line 1:5 required (...)+ loop did not match anything at character '<EOF>' 
line 1:5 no viable alternative at input '<EOF>' 

사람이 내 문법을 확인하고 수정하시기 바랍니다 수 있을까요? 대단히 감사합니다.

답변

1

귀하의 DEC 렉서 규칙은 + 연산자로 인해 2 자리 이상 필요합니다. 당신이 쓸 줄 알았는데 :

DEC : ('1'..'9') ('0'..'9')*; 
+0

대단히 감사합니다. 그것은 작동합니다. –

관련 문제