1

C 대상을 사용하는 antlr 생성 Java 파서가 있는데 아주 잘 작동합니다. 문제는 오류 코드를 구문 분석하여 의미있는 AST를 생성하기를 원합니다. 세미콜론이 누락 된 하나의 가져 오기가있는 최소 Java 클래스에 피드하면 "가져 오기"토큰과 가져온 클래스의 토큰이 있어야하는 두 개의 "트리 오류 노드"객체가 생성됩니다.오류 노드가 아닌 고정 노드가있는 AST

하지만 다음 코드를 올바르게 구문 분석하고이 코드에 대한 올바른 노드를 생성하므로 세미콜론을 추가하거나 다시 동기화하여 오류를 복구해야합니다. antlr이 AST에서 내부적으로 생성하는 고정 입력을 반영하는 방법이 있습니까? 또는 적어도 "트리 노드 오류"를 발생시키는 토큰/텍스트를 어떻게 얻을 수 있습니까?

static pANTLR3_BASE_TREE 
errorNode        (pANTLR3_BASE_TREE_ADAPTOR adaptor, pANTLR3_TOKEN_STREAM ctnstream, pANTLR3_COMMON_TOKEN startToken, pANTLR3_COMMON_TOKEN stopToken, pANTLR3_EXCEPTION e) 
{ 
    // Use the supplied common tree node stream to get another tree from the factory 
    // TODO: Look at creating the erronode as in Java, but this is complicated by the 
    // need to track and free the memory allocated to it, so for now, we just 
    // want something in the tree that isn't a NULL pointer. 
    // 
    return adaptor->createTypeText(adaptor, ANTLR3_TOKEN_INVALID, (pANTLR3_UINT8)"Tree Error Node"); 
} 

여기에 운이 I를 오전에만 오류가 자바 대상 노드의 C :에

라인 (200) 다음 조각 주위 antlr3commontreeadaptor.c는 C의 목표는 지금까지 더미 오류 노드를 만들고 있음을 나타냅니다 대상 생성하면 오류 노드의 텍스트를 검색 할 수 있습니까?

+0

C를 사용하거나 이해하는 데 문제가되지 않으므로 C 태그를 제거해야한다고 생각합니다. 아마도 파서 또는 구문 분석 태그를 추가해야합니다. – nategoose

답변

0

모든 가능한 오류 문에 대해 새로운 대체 규칙을 문법에 추가하여 문제를 해결했습니다.

각 Java 가져 오기 명령문은 예를 들어 인조 기호 IMPORT를 루트로 사용하여 AST 하위 트리로 변환됩니다. 올바른 AST와 잘못된 코드를 구별 할 수 있도록 잘못된 구문에 대한 규칙은 ERR_ 접두사가있는 루트 심볼을 AST에 다시 작성하므로 가져 오기 문의 예에서 인공 루트 심볼은 ERR_IMPORT가됩니다.

구문 분석 오류에 대한 자세한 정보를 인코딩하기 위해보다 다양한 루트 기호를 사용할 수 있습니다.

필자의 파서는 필연적으로 오류 허용 오차가 있으며 필 요할 때마다 새로운 종류의 오류 입력에 대한 규칙을 추가하는 것은 매우 쉽습니다. 그래도 문법에 모호함이 없도록 조심해야합니다.

0

antlr을 많이 사용하지는 않았지만, 일반적으로이 유형의 오류를 처리하는 방법은 잘못된 구문을 일치시키는 규칙을 추가하고 오류 노드를 생성하며 오류를 수정하여 구문 분석을 유지할 수 있도록하는 것입니다. . 이후의 수정은 하나의 오류로 인해 끝날 때까지 각각의 새 토큰에 대해 더 많은 오류를 유발하지 않기 때문에 문제가됩니다.

관련 문제