2012-11-19 2 views
2

Antlr은 ~, @, #, $, %, * 등의 문자를 무시합니다. , (,), {,}, [,] 입력 문자열에서.

나는 show ~~~, show ~ @ # $ % 등과 같은 입력 문자열을 사용하여 아래의 문법을 테스트했지만 Antlr은 eclipse/antlr works interpreter의 문자를 이스케이프 처리합니다. 나는 그러한 시나리오가 예외를 던지기를 원하고 그것으로부터 복구하지 않기를 바란다. Pls는 당신이 전에 이것을 직면했는지 알려주고 만약 그렇다면 무엇을해서 그것을 없애려고합니까?

grammar Sample; 
options {language = Java;} @header {package a.b.c;} @lexer::header {package a.b.c;} 
prog: stat+ ; stat: expr ; expr: paramValueChildStructure ; 
paramValueChildStructure: ALPHANUMERIC; 
ALPHANUMERIC: ('a'..'z' |'A'..'Z' | '0'..'9')+ ; 

내가 옵션은 위의 문제를 제거하는 아래에 시도했지만이 내 생성

OTHER  : . {throw new RuntimeException("unknown char: '" + $text + "'");}; 

lexer.java 감사에 도달 할 수없는 코드 컴파일시 문제를 제공, 인 Ashish

+1

이 코드를 추가 할 때 문제가 해결되었습니다. @lexer :: 회원은 { \t \t 공개 무효가 (RecognitionException 재) { \t \t \t \t은 System.out을 복구 할 수 있습니다.println ("lexer memeber recover"); \t \t \t \t throw 새로운 RuntimeException (re); \t \t} } – user1836974

답변

1

여기 봐 : http://www.antlr3.org/wiki/display/ANTLR3/Custom+Syntax+Error+Recovery

결론 전에 마지막 단락은 아마도 필요한 것일 것입니다 :

ANTLR 런타임

이 당신이 을 사용자 정의해야 할 수도 있습니다 회복의 다른 한 측면이며, 그 불일치()가 발생했을 때 발생하는 것입니다 내

다른 복구 메커니즘. 코드에서 match() 메소드에 대한 호출이 많이 있음을 알 수 있습니다. 우리가 일치하지 않는 이유는 경우 기본 (자바 런타임) 구현 우리가 경기 방법은 방법 recoverFromMismatchedToken (호출 찾기)이 차례로을 검사하는 결정하기 위해 현재에 따라 설정 스택을 사용하려고 것 입력에 가짜 토큰이 있습니다. 그냥 XZ 또는 누락 된 토큰 인 XYZ : XYZ를 원했을 때 XZ. ANTLR이 의 경우 Follow 세트를 사용하여 토큰을 건너 뛰면이를 확인합니다. 유효한 구문이면, 가짜 토큰을 소비하고 추가 토큰을보고하지만 RecognitionException은 발생시키지 않습니다. 마찬가지로 ANTLR이 정확히스트림에서 누락 된 토큰을 볼 수있는 경우 구문이 유효하면이 누락 된 토큰을 제조하고 을 제조하지만 다시는 을 제기하지 않습니다. RecognitionException.

이와 다른 동작을 원할 경우 match() 메서드를 재정의하거나보다 가능성이있는 recoverFromMismatchedToken() 메서드를 재정의 할 수 있습니다. 아마도 당신은 가짜/누락 오류 탐지를 원하지 않을 것입니다. 또는 기본 구현에서 알 수 있듯이 ANTLR은 먼저 이 토큰을 무시하여 문제를 해결할 수 있는지 확인한 다음 이 토큰을 추가하여 문제를 해결할 수 있는지 확인합니다. 그러나 두 가지 방법 중 하나를 사용하여 복구 할 수있는 오류 오류가 있습니다. 이러한 전략을 시도한 순서를 반대로 바꾸고 싶습니까?

+0

링크가 작동하지 않습니다. 해당 정보를 게시물에 추가하십시오. – bolov

관련 문제