Как распечатать имена констант при печати всех констант в файле C с помощью pycparser? - PullRequest
0 голосов
/ 28 ноября 2018

Я работаю над автоматизацией инструмента, который печатает все константы в 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)

редактировать: текущий вывод: константа: тип = int, значение = 0x243456BE желаемый вывод: константа: тип = int, name = имя переменной, которой принадлежит константа (обычно имя массива), значение = 0x243456BE

1 Ответ

0 голосов
/ 16 февраля 2019

Вам может потребоваться создать более искушенного посетителя, если вы хотите сохранить информацию о родительских узлах посещенного узла.См. этот ответ на часто задаваемые вопросы для примера.

Тем не менее, вам также нужно будет гораздо более четко определить свою цель.Постоянные узлы не всегда связаны с переменной.Например:

  return a + 30 + 50;

Имеет два узла Constant (для 30 и для 50);с какой переменной они связаны?

Возможно, вы ищете объявления переменных - Decl узлы с именами.Затем, как только вы найдете узел Decl, сделайте еще одно посещение этого узла в поисках всех узлов Constant.

...