2012-08-24 4 views
1

선언적 언어를 디자인하고 있습니다. 제 언어에는 나중에 재사용 할 수있는 "노드"에 대한 정의가 있습니다. 프로토 타입이나 템플릿과 같은 것으로 생각하십시오. 필요에 따라 복사본을 만들 수 있습니다. 나는 정의 단계에서 적절한 자바 객체를 생성하는 인터프리터 버전을 가지고있다. 최근까지 딥 복사 라이브러리를 사용하여 노드의 Java 표현 사본을 작성하여 노드의 인스턴스를 작성했습니다. 필자가 찾은 대부분의 딥 복사 라이브러리와 내 시스템의 모든 개체에 대한 복사 생성자를 쓰지 못함으로 인해 다른 접근 방식을 취하고 싶습니다. 제 언어의 일부로 딥 복사 라이브러리에 문제를 일으키는 GUI Java Swing 객체를 지정합니다.AST 하위 그래프를 저장하고 다시 처리하는 방법입니까?

노드의 인스턴스를 만들 때 객체 선언을위한 AST 하위 그래프를 저장하고 다시 처리 할 수있는 방법이 있습니까? 나는 ANTLR AST의 측면에서 질문을하지만, 언어 구현에 대한 조언이 있다면 나는 또한 환영한다.

답변

1

ANTLR 파서/렉서 문법에서는 $ruleName.tree에 액세스 할 수 있습니다. 이 룰 속성은 구문 분석 중에 생성 된 AST 서브 트리에 대한 참조입니다. @after 필드와 @members 필드를 사용하여 하위 트리를 저장할 수 있습니다. 보여 드리죠. 문법에

아래
@members{ 
private List<CommonTree> defs = new ArrayList<CommonTree>(); 

public List<CommonTree> getDefs(){ 
    return defs; 
} 

} 

ruleName 
@after{ 
    defs.add($ruleName.tree); 
} 
: IDENT ; 

이 모든 ruleName의 AST 하위 트리의 목록을 작성합니다. 이 트리는 CommonTreeNodeStream으로 변환하여 트리 문법 코드와 함께 사용할 수 있습니다.

CommonTree defTree = Parser.getDefs().get(0); // just getting the first tree for example 
CommonTreeNodeStream defStream = new CommonTreeNodeStream(defTree); 
TreeWalker walker = new TreeWalker(defStream); 
//assuming that I have a tree grammar that has been defined to return a list of nodes 

이 당신이 재 처리 저장 AST의 서브 그래프에 의해 노드의 인스턴스를 만들 수 this question for more info on returning data from an ANTLR grammar rule.

List<Node> nodes = walker.topRule() 

참조하십시오. 인스턴스를 생성해야 할 때마다 TreeNodeStream을 생성하고 워커를 호출 할 수 있습니다.

관련 문제