Как распечатать имена констант при печати всех констант в файле 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 узлы.

Другие вопросы по тегам