나는 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
이 필요하다는 것입니다. ParseTree
을 children[i]
에서 만들거나 더 좋은 방법이 있습니까?
내 개체에 tree->parent
의지도를 사용하고 거기에 새 노드를 연결하는 것도 고려 중이지만 일부 노드 (예 : AST)를 생략하려는 경우에는 최적이 아닙니다.
방문자가 아닌 청취자를 사용해야하는 것처럼 보입니다. – cantSleepNow
'exitEveryRule (.) '을 사용하여 자녀를 떠난 정보를 얻습니까? 그것은 당신이 제안하고있는 것입니까? 그 의미를 것 때문에 .. (난 그냥 확인을 요청하고) : – Jonas
그라고 ParseTreeAnnotator 또는 무언가에 대한 클래스가 있습니다. 그것은 스택과 같습니다.이 책의 예제를 확인하십시오. antlr4 reference – cantSleepNow