2016-10-24 2 views
1

나는 antlr4 c++을 사용하고 있습니다. 나는 ParseTree을 가지고 있으며 나무 구조를 재현하려고합니다. 이것으로 나는 방문자 my_Visitor 내 자신의 노드 객체 (들)을 사용하고 있습니다.ParseTree 탐색 in antlr4

내 문제는 모든 자식의 방문 기능을 호출하므로 하나의 자식 트리가 통과되고 다음 자식 트리가 방문 될 때 정보를 잃어 버리는 것입니다. I는 (B 및 C에 대한 과부하 visitExpression(ExpressionContext*) 함수를 사용하여) visitChildren(A) 전화 언제 방문 시퀀스 A, B, C라는 정보를 추출 할 수

A 
/\ 
B C 

: 이런 트리를 가정한다. 이 순서는 또한 발생할 수 있습니다 : 나는

antlrcpp::Any my_Visitor::my_visitChildren(tree::RuleNode* A){ 
    for(int i=0;i<A->children.size();i++){ 
     //create a new node in my own tree representation as child of A 
     visit(A->children[i]); 
    } 
} 

같은 것을 필요로하고 내 과부하 visitExpression 기능에 my_visitChildren를 호출 할 것이라고 생각 트리를 다시 만들려면

A 
| 
B 
| 
C 

.

여기서 문제는 A->children[i]Tree이고 visit(.)ParseTree이 필요하다는 것입니다. ParseTreechildren[i]에서 만들거나 더 좋은 방법이 있습니까?

내 개체에 tree->parent의지도를 사용하고 거기에 새 노드를 연결하는 것도 고려 중이지만 일부 노드 (예 : AST)를 생략하려는 경우에는 최적이 아닙니다.

+0

방문자가 아닌 청취자를 사용해야하는 것처럼 보입니다. – cantSleepNow

+0

'exitEveryRule (.) '을 사용하여 자녀를 떠난 정보를 얻습니까? 그것은 당신이 제안하고있는 것입니까? 그 의미를 것 때문에 .. (난 그냥 확인을 요청하고) : – Jonas

+0

그라고 ParseTreeAnnotator 또는 무언가에 대한 클래스가 있습니다. 그것은 스택과 같습니다.이 책의 예제를 확인하십시오. antlr4 reference – cantSleepNow

답변

2

ParseTreeTree 사이의 구분은 실제로 인공적이며 실제로는 실제로 사용되지 않습니다. 실제로 트리 노드의 자식 노드는 모두 ParseTree 인스턴스입니다. ParseTree이라는 기본 클래스를 빌드하는 경우를 제외하고는 런타임에 사용되지 않는 몇 가지 트리 클래스가 있습니다. 따라서 나중에 Tree, SyntaxTreeRuleNode을 제거하고 모두 함께 ParseTree 클래스에 넣었습니다.

당신의 질문에 답하십시오 : 당신의 나무 산책을 위해 ParseTree으로 안전하게 자식 노드를 캐스팅 할 수 있습니다.