2009-12-23 4 views
3

나는 Lua grammar을 가지고있다. (C#을 출력하기위한 사소한 수정, 네임 스페이스 지시자와 몇 가지 옵션 변경) 어떤 샘플 입력으로 실행할 때 루트 "nil" 노드와 자식으로 입력 코드의 토큰 화 된 버전으로 보이는 것. ANTLR의 나무 문법은 "평면"문법이 아닌 계층 적 나무 문법으로 작동하므로 출력을 그대로 사용할 수 있다고는 생각하지 않습니다.ANTLR에서 계층 적 AST를 출력하는 방법은 무엇입니까?

문법을 쉽게 고칠 수 있습니까? 아니면 처음부터 다시 작성해야합니까?

+0

Err, 당신은 실제로 * 추상적 인 구문 트리를 다시 얻고 싶다고 생각합니까? –

+0

아 그래, 그 제목은 그렇게 말하지만 실제 질문은 당신이 AST를 다시 얻은 것처럼 들린다. –

+0

나는 AST를 되 찾는다. 그러나 그것은 트리 문법을 적용하기에 너무 부적절한 형식으로 보인다. . 미안해, 내 질문에 그 말을 놓쳤다! – RCIX

답변

6

당신의 나무가 여기에, 단지 노드의 1 개 차원 목록입니다 당신이 부모/형제 계층 구조를 만들 수있는 방법 가정 : ANTLR에서

는 AST 생성을위한 두 개의 사업자가를 :

!  excludes the node (token) from the (sub)tree; 
^  makes a node the root of a (sub)tree. 

때 어떤 연산자를 가 제공되면 노드/토큰이 현재 루트의 자식으로 추가됩니다. 이것은 아마도 당신에게 일어난 일입니다 : 당신이 보는 모든 것은 노드/토큰의 1 차원 목록입니다.

예 :

grammar Exp; 

options {output=AST;} 

// ... some rules ... 

addition 
    : Integer '+'^ Integer ';'! 
    ; 

Integer 
    : '0' 
    | '1'..'9' '0'..'9'* 
    ; 

표현 6+9;에 대해 다음 트리를 만들 것입니다 addition 규칙 :

+ 
/\ 
/ \ 
6  9 

당신이 볼 수 있듯이 다음 + 루트입니다 (그것이 후에 ^있다), 숫자는 토큰 (연산자가 없음)이고 세미 콜론은 제외됩니다 (그 뒤에 !이 있음).

자세한 내용은 7 장, 트리 구조, The Definitive ANTLR Reference을 참조하십시오. 나는 당신이 사본을 얻는 것을 강력히 권한다.

처음부터 시작해야하는지 여부는 결정하는 것이 좋습니다. 빈 문법 파일부터 시작하여 점차 모든 규칙이 작동하는지 확인하기 위해 규칙을 점차적으로 추가합니다. 기존 문법에서 일부 트리 연산자를 뿌리기 만하면 디버깅하기가 매우 어려울 수 있습니다. 특히 ANTLR에 익숙하지 않은 경우 특히 그렇습니다.

행운을 빈다.

+0

좋아, 그게 내가 두려워했던 것만 큼 나쁘지는 않은 것 같아. 도와 주셔서 감사합니다! – RCIX