2010-05-25 2 views
2

C 대상에서 antlr3과 트리 문법에 대해 몇 가지 질문이 있습니다.C 타겟에서 antlr3을 사용하여 특정 구문을 구문 분석

나는 거의 (확인 함수, 변수, 부울 수학 식) 내 해석기를 수행하고 난 끝에 가장 어려운 문장 (같은 경우, 스위치 등)을 유지 한

1) 내가 좋아하는 것 나는 나무 워커 (매크로 마크 여기 만 주제()/되감기 (m) + @Init/@After하지만 작동하지 않습니다에 대한 많은 예제하지만 아무것도 본 적이

repeat: ^(REPEAT DIGIT stmt); 

: 간단한 루프 문을 해석 (나는 antlr 오류 : "예기치 않은 노드에서 오프셋 0")). C에서이 문장을 어떻게 해석 할 수 있습니까?

2) 간단한 if 문에 같은 질문 :

if: ^(IF condition stmt elseifstmt* elsestmt?); 

문제는 조건이 거짓 인 경우 문을 건너 뛰고 다른 ELSEIF/다른 문을 테스트하는 것입니다.

3) 스크립트를 중단시킬 수있는 명령문이 있습니다 (예 : "break"또는 "exit"). 트리 워커를 방해하고 다음 토큰을 건너 뛸 수 있습니까?

4) 렉서 또는 파서 오류가 감지되면 antlr이 오류를 반환합니다. 그러나 나는 직접 만든 오류 메시지를 만들고 싶습니다. 파서가 추락 한 곳의 라인 번호를 어떻게 알 수 있습니까?

자세한 내용은 저에게 문의하십시오. 당신이 아주 많이 반복 문에 대한

+0

이 질문에 대한 답변을 찾으셨습니까? – greydet

답변

0

(그리고 내가 불쌍한 내 영어에 대해 사과)

덕분에, 나는 그것을 할 수있는 방법을 찾은 것 같아요. antlr.org에서 C 언어에 대한 완전한 통역사를 찾았지만 자바로 만들었습니다.

나는 여기에 while 문 넣어 (약간 다르다을하지만, 방법은 동일합니다) :

repeat 
scope { 
    int breaked; 
    int tours; 
} 
@after 
{ 
    int test; 

    pANTLR3_BASE_TREE repeatstmt = (pANTLR3_BASE_TREE)$repeat.start->getChild($repeat.start,1); 
    pANTLR3_BASE_TREE exprstmt = (pANTLR3_BASE_TREE)$repeat.start->getChild($repeat.start,0); 

    $repeat::breaked = 0; 
    test = 1; 

    while($repeat::breaked == 0) 
    { 
     TW_FOLLOWPUSH(exprstmt); 
     TW_FOLLOWPOP(); 
     test++; 
     if(test == $repeat::tours) 
      break; 
     TW_FOLLOWPUSH(repeatstmt); 
     CTX->repeat(CTX); 
     TW_FOLLOWPOP(); 
    } 
} 
    : ^(REPEAT DIGIT stmt) 
     {   
      $repeat::tours = $DIGIT.text->toInt32($DIGIT.text); 
     } 

하지만 아무것도 :

whileStmt 
scope{ 
    Boolean breaked; 
} 
@after{ 
    CommonTree stmtNode=(CommonTree)$whileStmt.start.getChild(1); 
    CommonTree exprNode=(CommonTree)$whileStmt.start.getChild(0); 

    int test; 

    $whileStmt::breaked=false; 
    while($whileStmt::breaked==false){ 
      stream.push(stream.getNodeIndex(exprNode)); 
      test=expr().value; 
      stream.pop(); 
      if (test==0) break; 
      stream.push(stream.getNodeIndex(stmtNode)); 
      stmt(); 
      stream.pop(); 
     } 

} 
    : ^(WHILE . .) 
    ; 

나는 C 언어로이 코드를 변환하려고했습니다 일어났습니다 (stmt는 한 번 구문 분석되었습니다).

이 문제에 대한 아이디어가 있으십니까?

수제 오류 메시지에 대해 렉서 (lexer)에서 매크로 GETLINE()을 발견했습니다. 트리 워커가 충돌하지만 antlr이 렉서 또는 파서 오류에 대한 오류 메시지를 계속 표시 할 때 작동합니다.

감사합니다.