2012-06-21 2 views
0

ANTLR 3을 사용하고 있는데 질문이 있습니다. 입력시 오류가 발생하면 어떻게 다음 예상 토큰을 찾을 수 있습니까? 파서의 getErrorMessage (RecognitionException e, String [] tokenNames)를 오버라이드하려고했으나 오류가 발생했지만 다음 기대 토큰이 무엇인지 알 수 없습니다. 누구든지 도울 수 있다면. 미리 감사드립니다.다음 찾기 예상 토큰 오류가 발생하는 경우 ANTLR 3

+0

이것은 특정 오류에 대해서만 가능하며 문법에 따라 다릅니다. –

답변

1

소리가 나는 것처럼 쉽지 않습니다. 그리고 꽤 자주 이러한 정보를 사용할 수 없습니다.

예를 들어 문법은 (1+2)과 같이 괄호로 묶은 표현식과 일치 할 수 있습니다. 파서 지금 "(1+2"을 구문 분석하려고하면

하는 MismatchedTokenException는 그 expecting 속성 ')'의 형태가 될 것이다 던져 질 것이다. 그래서, 그것은 쉬운 것입니다. 이 "1+2)"을 구문 분석 할 때

그러나,하는 MismatchedTokenException 다시 던져 질 것이다, 그러나 지금 파서는 그냥 1+2 같은 식을 구문 분석 할 것으로 예상 있기 때문에의 EOF을 기대하고 불평합니다. 이 아니며은 "과거"의 어딘가에서 '('을 잊어 버렸다고 말합니다.

따라서 파서에서 발생한 예외에서 예상 토큰을 추출 할 수있는 경우가 두 차례 있습니다. 대부분의 경우,이 정보를 직접 추출해야합니다 (많은 노력이 필요합니다). 파서에 의미있는 오류 메시지를 작성하는 것은 쉬운 일이 아닙니다! (적어도 복잡한 언어가 아닌 문법을 작성하는 것과 비교하면 안됨)

ANTLR's API docs을 통해 ANTLR에서 던져진 예외를 확인하고 파서 유효하지 않은 입력을 목적에 맞게 전달하고 reportError(...)을 우선 적용하는 것이 좋습니다. 구문 분석기를 사용하여 어떤 예외가 던져 지는지 확인하십시오.