0

pycparser を使用して c ファイルを解析し、https://github.com/eliben/pycparser/blob/master/examples/explore_ast.pyこのリンクを使用して ast を生成した switch ステートメントを見つけようとしています。n = len(ast.ext) を使用して、ast から生成された ext の長さを見つけました。今、私は試した ast から switch ステートメントを見つけなければなりません if re.findall(r'(switch(\s*'),ast.ext) 正規表現と一致させて switch ケースを見つけますが、それは起こっていません。これは、私がpycparserにまったく慣れていないため、それについてまったくわかりません

4

1 に答える 1

0

pycparser AST で正規表現マッチングを実行することはできません!

pycparser リポジトリには、役に立つ複数の例がありますexplore_ast.py:

dump_ast.pyAST 全体をダンプして、コードに含まれるノードを確認する方法を示します。

最後に、func_calls.py特定の種類のノードを探して AST をたどる方法を示します。

class FuncCallVisitor(c_ast.NodeVisitor):
    def __init__(self, funcname):
        self.funcname = funcname

    def visit_FuncCall(self, node):
        if node.name.name == self.funcname:
            print('%s called at %s' % (self.funcname, node.name.coord))
        # Visit args in case they contain more func calls.
        if node.args:
            self.visit(node.args)

この場合FuncCallはノードですが、スイッチ ノードが必要なので、という名前のメソッドを作成するvisit_Switchと、ビジターはすべてのSwitchノードを見つけます。

于 2021-02-15T18:39:45.027 に答える