如何从 pycparser 生成的 ast 中找到 switch 语句?
how to find switch statement from an ast generated from pycparser?
我正在尝试使用 pycparser 解析 c 文件并找到 switch 语句
我使用 https://github.com/eliben/pycparser/blob/master/examples/explore_ast.py 这个 link 生成了 ast。
然后使用 n = len(ast.ext) 我找到了从 ast 生成的 exts 的长度。
现在我必须从 ast 中找到 switch 语句
我试着做
如果 re.findall(r'(开关(\s*'),ast.ext)
并匹配正则表达式以查找开关案例,但它没有发生。
由于我是 pycparser 的新手并且对此一无所知,因此如何进行此操作
你不能运行 pycparser AST 上的正则表达式匹配!
pycparser 存储库中有多个示例可以为您提供帮助:explore_ast.py
,您已经看过这些示例,可以让您使用 AST 并探索其节点。
dump_ast.py
展示了如何转储整个 AST 并查看您的代码有哪些节点。
最后,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
个节点。
我正在尝试使用 pycparser 解析 c 文件并找到 switch 语句 我使用 https://github.com/eliben/pycparser/blob/master/examples/explore_ast.py 这个 link 生成了 ast。 然后使用 n = len(ast.ext) 我找到了从 ast 生成的 exts 的长度。 现在我必须从 ast 中找到 switch 语句 我试着做 如果 re.findall(r'(开关(\s*'),ast.ext) 并匹配正则表达式以查找开关案例,但它没有发生。 由于我是 pycparser 的新手并且对此一无所知,因此如何进行此操作
你不能运行 pycparser AST 上的正则表达式匹配!
pycparser 存储库中有多个示例可以为您提供帮助:explore_ast.py
,您已经看过这些示例,可以让您使用 AST 并探索其节点。
dump_ast.py
展示了如何转储整个 AST 并查看您的代码有哪些节点。
最后,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
个节点。