2012-12-17 2 views
1

일치 수있는 이유 : 내가 start에 의해 잘못된 표현 ABC &* DEF을 시도했습니다ANTLR : 유효하지 않은 입력이 문법 정의 나는 계산식에 대한 매우 간단한 문법 정의를 작성했습니다

grammar SimpleCalc; 

options { 
    output=AST; 
} 

tokens { 
    PLUS = '+' ; 
    MINUS = '-' ; 
    MULT = '*' ; 
    DIV = '/' ; 
} 

/*------------------------------------------------------------------ 
* LEXER RULES 
*------------------------------------------------------------------*/ 

ID : ('a'..'z' | 'A' .. 'Z' | '0' .. '9')+ ; 

WHITESPACE : ('\t' | ' ' | '\r' | '\n'| '\u000C')+ { Skip(); } ; 

/*------------------------------------------------------------------ 
* PARSER RULES 
*------------------------------------------------------------------*/ 

start: expr EOF; 

expr : multExpr ((PLUS | MINUS)^ multExpr)*; 

multExpr : atom ((MULT | DIV)^ atom)*; 

atom : ID 
    | '(' expr ')' -> expr; 

을하지만 통과시켰다. & 개의 문자가 무시 된 것 같습니다. 여기서 뭐가 문제 야?

+0

이 문법은 어떻게 확인 했습니까? AntlrWorks에서이 문법으로 구문 분석을 해봤습니까? – Andremoniy

+0

생성 된 코드를 시도하고'ABC & * DEF'에 대한 결과'ABC * DEF'를 얻습니다. –

+0

Mmm ... * start * 규칙을 호출하고 결정 출력 AST 구조를 호출하는 데 사용하는 코드를 제공해주십시오. – Andremoniy

답변

1

실제로 잘못된 식 ABC &= DEF이 전달되지 않았습니다. 그것은 NoViableAltException이됩니다.

enter image description here

+0

죄송합니다. 질문에 실수를했습니다. 유효하지 않은 표현식은'ABC & * DEF'입니다. 그것은'='대신에'*'입니다. –

+0

@JeffreyZhao ANTLR 오류 처리와 관련된 몇 가지 질문과 대답을 확인하십시오. 예를 들어 [이 답변은] (http://stackoverflow.com/questions/13889941/how-to-stop-antlr-from-suppressing- syntax-errors) "문법 오류"가 사라집니다. 내 생각 엔 ANTLR이 오류를 감지하고,'System.err'에 쓰고, 나쁜 입력을 제거하지만, 세부 사항 중 아무 것도 당신/사용자에게 도달하지 못한다. – user1201210

+0

@JeffreyZhao, 이것은 중요하지 않습니다. 위에서 언급 한 것과 같은 결과는 "ABC & * DEF"입니다. 귀하의 문법은 "&"기호가있는 표현을 구문 분석 할 수 없습니다. ANTLRWorks에서이 문법을 테스트 해 보셨습니까? – Andremoniy