2011-10-09 4 views
1

ANTLR의 내 문법에서 Java 코드는 "$"가 포함 된 입력에 대한 오류를 포착하고 인쇄 할 수 있습니다. 필자의 구현에서는 성공적인 입력을 위해 "성공"을 인쇄해야합니다. 그래서, 내 경우에는 잘못된 입력에 대한이 0보다

CharStream charStream = new ANTLRFileStream(filePath); 
myLexer lexer = new myLexer(charStream); 
TokenStream tokens = new CommonTokenStream(lexer); 
myParser parser = new myParser(tokens); 

/*if there is an error throws an exception message*/ 
parser.program(); 

/*if there is an error find how many, if 0 then print success,*/ 
int errorsCount = parser.getNumberOfSyntaxErrors(); 
if(errorsCount == 0){ 
    System.out.println("parsing successful"); 
} 

getNumberofSyntaxErrors 반환 숫자보다, 내 자바 코드에서 다음을 수행합니다. "int i;"의 경우, 출력은 그냥; 내가 INT의 $ 같은 입력에 내 코드를 실행하면

parsing successful 

난 자바 코드가 getNumberofSyntaxErrors()가 0을 반환하기 때문에 "성공적인 분석"로 오류 메시지를 출력 ;,;

line 1:4 no viable alternative at character '$' /*this is what I expect to see*/ 
parsing successful /*this is not what i expect to see*/ 

답변

1

아마도 렉서 (또는 파서)는 (부전공) 오류를 복구하려고 시도하고 토큰 화 또는 구문 분석을 계속합니다. 불법 문자가 발생할 때마다 종료하려면 가장 쉬운 방법은 위의 렉서 규칙 중 어느 것도 일치하지 않으면 일치시킬 모든 렉서 규칙의 끝에 배치되는 일종의 "폴 스루 (fall-through)"규칙을 작성하는 것입니다. 해당 규칙에서 예외를 throw하도록 허용하십시오.

grammar T; 

// parser rules 

// lexer rules 

/* last lexer rules */ 
FALL_THROUGH 
    : . {throw new RuntimeException("Illegal character: " + getText());} 
    ; 
+0

바트, 감사합니다. –

+0

존 환영합니다. –