正解
(静的解析の基礎である)あなたは声明pattern1
が実際にpattern2
前に起こるために起こっているかどうかわからないので、本当に正しいアプローチではありません
あなたはASTがここで助けに行くのではありませんが、CFGが使用する正しいものである見ることができるように
int foo() {
int a = 0;
int *b;
int c = -1;
if(c < 0) goto fixit;
nowhat:
b = &a;
fixit:
c = *b;
goto nowhat;
}
を考えてみましょう。
ややかなり多く、階層的な自然の中でのASTあなたはAST(5月v6.0.0)彼らはでトラバーサルマッチャを見れば
を使用して答え、の。あなたは兄弟を探すためにマッチングを拡張しようとしています。
私は、あなたがカスタムASTマッチャーを実装する方法を知っていることを前提としています。もしそうでなければ、それは彼のWriting AST Matchers for libclangブログ記事でManuSánchezによってうまく説明されています。
ない彼は兄弟マッチャを書いて、実際ににを取得するかどうかわからないが、彼はそれに非常に近くなるので、そこにして、起動しますが、これに似た何かを実装する必要があります。
のコード与えられたとしましょう:あなたはを組み合わせることができ
(matcher = recordDecl(hasName("P"), \
hasNextSibling(recordDecl(hasName("R"))))`
:
class P {}; class Q {}; class R {};
は、我々のような何かを行うことができるようにしたいですおよびmatchesParent
をAstMatchFinder
クラスに置き、現在のカーソルの親の子をトラバースします(これらは兄弟:Pです)。暴走的な再帰を避けるためにBoundCursorsを実装する必要があるので、脚注を読んでください。