2011-01-20 3 views
2

저는 Antlr 2.X와 Antlr 3.1.X CSharp 및 Python 대상에 대해 잘 알고 있습니다.오류보고를 위해 예외를 throw하는 Antlr3 C 런타임은 무엇입니까

그러나 이제 프로젝트에 Antlr 3 C 대상을 사용해야합니다.

문제점은 문법 또는 트리 문법의 오류를 어떻게보고합니까?

토큰과 일치하는 규칙을 고려해 맵에 입력하십시오. 토큰이 고유한지 확인하고자합니다. 토큰이 이미 맵에 있고 hte 파서 외부에서 예외를 catch하면 오류를보고하기 위해 일반적으로 예외가 발생합니다.

다음 규칙에 해당하는 Antlr C 런타임은 무엇입니까?

token_match: ID 
{ 
    if(mp.find($ID.Text)) 
     throw std::exception("Non unique token found"); 
} 

답변

1

의미 론적 오류를 표시하려면 고유 한 방법을 사용하는 것이 좋습니다. 그러나 이것 때문에 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; 
} 
+0

답변 해 주셔서 감사합니다. 그냥 메모, 내 문제가 그 구성원을 오버로드하지 않습니다, 그 일을 :) 내 질문은 내 자신의 유효성 검사를 네이티브 코드입니다. 예외를 던져서 오류를보고하는 적절한 방법이 있습니까? – chollida

관련 문제