2012-07-18 4 views
1

에 상황에 해당 오류 메시지를 출력하기 좀 소스 코드를 분석하는 문법이 있습니다누락 된 토큰

document 
    : header body_block* EOF 
    -> body_block* 
    ; 

header 
    : header_statement* 
    ; 

body_block 
    : '{' block_contents '}' 
    ; 

block_contents 
    : declaration_list 
    | ... other things .... 

문서가 헤더없이 신체 또는 신체없이 헤더가하는 것은 합법입니다. 내가

int i; 

과 같은 문서를 구문 분석하려고하면

는 ANTLR은 EOF를 기다리고 있었다 때 int를 발견 뿌려줍니다. 이것은 사실이지만, 나는 그것이 {을 기대하고 있다고 말하고 싶습니다. 즉, 입력에 body_block이 아닌 EOF와 헤더가있는 경우 사용자에게 body_block 안에 해당 텍스트를 묶어야한다고 제안하고 싶습니다.

나는 에 거의 개의 작업을 시도해 보았습니다. 조명이 켜지면 게시 할 수 있지만이 작업이 쉽지 않을 것으로 기대하고 있습니다.

답변

1

꽤 안하지만,이 같은 그것을 할 것입니다 :

body_block 
: ('{')=> '{' block_contents '}' 
| t=. 
    { 
    if(!$t.text.equals("{")) { 
     String message = "expected a '{' on line " + $t.getLine() + " near '" + $t.text + "'"; 
    } 
    else { 
     String message = "encountered a '{' without a '}' on line " + $t.getLine(); 
    } 
    throw new RuntimeException(message); 
    } 
; 

(는 테스트하지, 구문 오류가있을 수 있습니다!) '{' ... '}'이 일치되지 않을 때마다

그래서, 그것은을 통해 폭포 . 보다 이해하기 쉬운 오류 메시지가 나타납니다. 파서 규칙에 . 어떤 토큰이 아닌 모든 문자와 일치하는지



1 노트!

+0

이것은 완벽하게 작동했습니다 (내 시도보다 훨씬 더 예뻤습니다!). ANTLR이 두 가지 대안이 똑같은 것을 불평하지 않도록 구문 어법 ('('{') =>')을 추가했습니다. –