Как распечатать имена констант при печати всех констант в файле C с помощью pycparser?
Я работаю над автоматизацией инструмента, который печатает все константы в 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)
edit: текущий вывод: константа: тип =int, значение =0x243456BE желаемый вывод: константа: type=int, name= имя переменной, которой принадлежит константа (обычно имя массива), значение =0x243456BE
0 ответов
Вам может понадобиться создать более искушенного посетителя, если вы хотите сохранить информацию о родительских узлах посещенного узла. Смотрите этот FAQ ответ для примера.
Тем не менее, вам также нужно будет определить свою цель гораздо более четко. Постоянные узлы не всегда связаны с переменной. Например:
return a + 30 + 50;
Имеет два Constant
узлы в нем (на 30 и на 50); с какой переменной они связаны?
Возможно, вы ищете объявления переменных - Decl
узлы с именами. Затем, как только вы найдете Decl
узел, сделать еще одно посещение под этим узлом в поисках всех Constant
узлы.