Boost Spirit Libraryで生成されたAbstract Syntax Treeについて質問があります。
二分探索木でノードとサブツリーを削除することに関する多くの情報を見つけましたが、AST については同じ情報を見つけることができません。AS-Tree にノードがあり、このノードは完全なツリーのサブツリーのルートです。ここで、ノードとそのすべての子を削除します。
方法がわかりませんし、ブーストスピリットのドキュメントも役に立ちませんでした。
誰か私に何かヒントはありますか?
ツリーは (Boost 1.46.1) で生成されます。
tree_parse_info<> info = ast_parse(expression.c_str(), parser, skipparser);
そして式は次のようなものです:
(variable_17 OR variable_18) AND function( variable_17) <= 30 OR function( subkey_18) <= 30
私が使う
tree_match<iterator_t>::tree_iterator tree_it = info.trees.begin();
ツリーの先頭を取得してから、サブツリーの1つが冗長かどうかを確認します(削除自体とは関係ありません)。`次に、次を使用してツリーをトラバースします
tree_match<iterator_t>::tree_iterator children_it = tree_it->children.begin()
子を使用して同じ関数を呼び出す (再帰的)。完全なコードを投稿することはできませんが、それが最も重要な部分です。私は、冗長サブツリーのリーフノードに移動して、それらをnullに設定するか、このようなものに設定できると考えました。そして、もう一度ツリーを上って、他のすべての子を次々と削除します。しかし、これまでのところ何も機能していません。
ツリーを横断する例: The Traversing It's the answer.
ノードを削除できない場合、既存のツリーに基づいて新しいツリーを作成し、その冗長部分をスキップする方法を知っている人はいますか?