의미 론적 오류를 표시하려면 고유 한 방법을 사용하는 것이 좋습니다. 그러나 이것 때문에 ANTLR에 머무를 필요가 있다면 :
먼저 사용자 정의 예외 유형을 생성하려면 자체 오류 처리기를 만들어야합니다. antlr3baserecognizer.c : 1000을 원본으로 봅니다.
static void
displayRecognitionErrorNew (pANTLR3_BASE_RECOGNIZER recognizer,
pANTLR3_UINT8 * tokenNames)
{
...
switch (ex->type)
{
case ANTLR3_UNWANTED_TOKEN_EXCEPTION:
...
case NUTF_EXCEPTION:
printf("Non unique token found");
break;
그런 다음 예외 구조를 처리하기 위해 일부 기능 또는 규칙 코드를 코딩하십시오. antlr3baserecognizer.c : 325에서 예외를 설정하십시오.
ex = antlr3ExceptionNew(ANTLR3_RECOGNITION_EXCEPTION,
(void *)ANTLR3_RECOGNITION_EX_NAME,
NULL,
ANTLR3_FALSE);
ex->type = NUTF_EXCEPTION
ex->line = ins->getLine (ins);
ex->charPositionInLine = ins->getCharPositionInLine (ins);
ex->index = is->index (is);
ex->streamName = ins->fileName;
ex->message = "That was totally unexpected";
다음에는 오류를 감지 할 때 실제로 예외를 throw해야합니다. 이 작업을 수행하는 유일한 방법은 mismatch()를 재정의하여 코드에서 추가하고 규칙에서 호출하는 것입니다.
static void
mismatchNew(pANTLR3_BASE_RECOGNIZER recognizer, ANTLR3_UINT32 ttype, pANTLR3_BITSET_LIST follow)
{
...
}
마지막으로 ANTLR에 새 기능을 사용하십시오.
@parser::apifuncs {
RECOGNIZER->displayRecognitionError = displayRecognitionErrorNew;
RECOGNIZER->antlr3RecognitionExceptionNew = antlr3RecognitionExceptionNewNew;
RECOGNIZER->mismatch = mismatchNew;
}
답변 해 주셔서 감사합니다. 그냥 메모, 내 문제가 그 구성원을 오버로드하지 않습니다, 그 일을 :) 내 질문은 내 자신의 유효성 검사를 네이티브 코드입니다. 예외를 던져서 오류를보고하는 적절한 방법이 있습니까? – chollida