私はantlr4 c++を使用しています。 私はParseTree
を持っていて、私は木構造を作り直そうとしています。 これまで私は訪問者my_Visitor
と自分のノードオブジェクトを使用しています。parseTree traversal in antlr4
私の問題は、すべての子の訪問機能を呼び出すので、1つの子ツリーが横断され、次の子ツリーが訪問されたときに情報が失われているということです。 このようなツリーを想定:
A
/\
B C
IはvisitChildren(A)
(B及びCのためのオーバーロードvisitExpression(ExpressionContext*)
関数を使用して)呼び出すと、私は訪問配列は、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リファレンスの例を確認してください – cantSleepNow