0

我试图在一个大的 c 文件中找到所有除法运算符。我看到了这个Python 代码示例

我试图将它用于我的 c 文件。因此,我使用 pycparser 将我的 c 文件解析为 ast,如下所示:

from pycparser import parse_file, c_parser, c_generator

def translate_to_c(filename):
    ast = parse_file(filename, use_cpp=True)
    ast.show()
translate_to_c('source.c')

然后我尝试通过修改 translate_to_c 来使用该示例,如下所示:

def translate_to_c(filename):
    ast = parse_file(filename, use_cpp=True)
    ast.show()
    last_lineno = None
    for node in ast.walk(ast):
        # Not all nodes in the AST have line numbers, remember latest one
        if hasattr(node, "lineno"):
            last_lineno = node.lineno

        # If this is a division expression, then show the latest line number
        if isinstance(node, ast.Div):
            print(last_lineno)

我收到以下错误:

line 25, in translate_to_c
    for node in ast.walk(ast):
AttributeError: 'FileAST' object has no attribute 'walk'

那么关于如何在我的代码中使用这个例子有什么想法吗?或如何在一般的 ast 文件上循环?

4

1 回答 1

2

与使用 Python 的内置astpycparser有很大不同。一个是 Python AST,另一个将 C 解析为 C AST。它们是来自不同库的不同类型 - 你不能指望一个方法(如walk)只是神奇地为另一个工作!

我建议您从 pycparser 的示例开始:https ://github.com/eliben/pycparser/tree/master/examples

例如,此示例查找 C 代码中的所有函数调用。应该很容易调整以找到所有除法运算符。explore_ast示例向您展示了如何在 AST 中感受自己的方式

于 2021-03-10T17:05:10.527 回答