2017-03-12 10 views
0

을 구문 분석 할 때 오류 라인 번호를 내가 ANTLR에 의해 슬로우 인식 오류 잡기 위해 다음과 같은 C 함수가 : 여러 줄의 텍스트를ANTLR : 여러 줄을 텍스트

void recognition(pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_UINT8 *list) 
{ 
    pANTLR3_PARSER parser; 
    pANTLR3_EXCEPTION exception; 


    parser = (pANTLR3_PARSER) (recognizer->super); 
    exception = recognizer->state->exception; 

    printf("%d\n", exception->line); // ALWAYS PRINTS 1 (WHICH IS WRONG) 
} 

한 경우, 파싱을 (ANTLR로)을 그 첫 번째 줄에 오타가있는 경우 recognition 함수는 "1"을 인쇄합니다 (올바른 경우). 그러나 첫 번째 줄 (즉, = 2) 다음에 오타가 발생하면 recognition 함수는 항상 "1"을 인쇄합니다 (잘못된 것입니다).

질문 : 구문 분석 오류가있는 올바른 줄 번호를 어떻게 인쇄 할 수 있습니까? (제안 : 개행 토큰을 구문 분석 할 때마다 특정 ANTLR 카운터를 증가 시키려면 문법을 업데이트해야합니까?) 그것은 우리의 관점에서

A 
A 

:

start : rule1 | rule2; 
rule1 : 'A' 'B'; 
rule2 : 'A' 'C'; 

입력 : -

+0

무슨 일이 일어나는지 파서를 디버그하십시오. 라인 정보는 일반적으로 구문 분석 오류의 원인이 된 토큰에서 가져옵니다. 예상했던 토큰이 맞습니까? 정확한 회선 정보를 가지고 있습니까? –

답변

0

가능한 원인 중 하나가 문제가 파서의 다를 수 있습니다되는 위치에 대한 인식이다이 문법을 고려 첫 번째 줄의 A이 두 가지 대안에 모두 맞기 때문에 문제가 2 행에있는 것으로 보일 수 있습니다. 그러나 파서는 첫 번째 줄에서 어떤 대안을 선택할지 결정해야합니다. 일치하지 않으면 입력의 해당 지점에서 NoViableAlt 예외가 throw됩니다.이 줄은 여전히 ​​1 행에 있습니다.

문법을 왼쪽으로 입력 도움이 될 수 있습니다 :

start : 'A' (rule1 | rule2); 
rule1 : 'B'; 
rule2 : 'C'; 

이제 'A'가 일치 할 것입니다 만 다음 NoViableAlt 예외가 두 번째 줄에 입력 슬로우됩니다.