我正在致力于自动化一个工具,该工具可以打印出C文件中的所有常量。到目前为止,我已经设法打印出C文件中的所有常量,但是在不打印出整个抽象语法树的情况下,我想不出一种方法来显示它们所关联的变量名,这没有很多必要给我的信息。有人有什么想法吗?现在,它将打印出常量及其类型。这是我的代码:
from pycparser import c_parser, c_ast, parse_file
class ConstantVisitor(c_ast.NodeVisitor):
def __init__(self):
self.values = []
def visit_Constant(self, node):
self.values.append(node.value)
node.show(showcoord=True,nodenames=True,attrnames=True)
def show_tree(filename):
# Note that cpp is used. Provide a path to your own cpp or
# make sure one exists in PATH.
ast = parse_file(filename, use_cpp=True,cpp_args=['-E', r'-Iutils/fake_libc_include'])
cv = ConstantVisitor()
cv.visit(ast)
if __name__ == "__main__":
if len(sys.argv) > 1:
filename = sys.argv[1]
else:
filename = 'xmrig-master/src/crypto/c_blake256.c'
show_tree(filename)
编辑: 当前输出:常量:type = int,value = 0x243456BE 所需的输出:常量:type = int,名称=变量名常量所属(通常是数组名称),值= 0x243456BE
答案 0 :(得分:0)
如果要保留有关被访问节点的父节点的信息,则可能需要创建一个更复杂的访问者。有关示例,请参见this FAQ answer。
也就是说,您还需要更加清晰地定义目标。常量节点并不总是与变量关联。例如:
return a + 30 + 50;
其中有两个Constant
节点(用于30和50);它们与什么变量关联?
也许您正在寻找的是变量声明-具有名称的Decl
节点。然后,一旦找到Decl
节点,请在该节点下进行另一次访问以查找所有Constant
节点。