0

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.

ノードを削除できない場合、既存のツリーに基づいて新しいツリーを作成し、その冗長部分をスキップする方法を知っている人はいますか?

4

0 に答える 0