Как изменить исходный код Python для добавления нового узла AST? - PullRequest
4 голосов
/ 08 февраля 2012

Например, если бы мне нужно было создать узел с именем «Нечто», который я хотел бы использовать в дереве AST Python, где и какие изменения мне нужно было бы добавить в исходный код Python, чтобы сделать это?

Я знаю, что мне следует начать с Python.asdl, где определена грамматика AST.Тогда я должен перейти на аст.с.

К сожалению, я не уверен, где именно я должен внести изменения в файл ast.c для реализации узла.

Также, для простоты, допустим, что я просто хочу, чтобы узел был заполнителем, то есть он не должен делать ничего, кроме возможности вставлять себя в дерево.

1 Ответ

1 голос
/ 08 февраля 2012

Нет необходимости погружаться в Python.asdl еще! Затем вам нужно искать парсера ASDL, а затем вы должны выяснить, что с ним делать (хотя само по себе это достойное упражнение). Вы можете остаться в Python благодаря удивительному ast модулю.

Обязательно ознакомьтесь со статьей Эли Бендерски по этому вопросу .

Вот пример, который он приводит, где строится AST и eval 'с нуля!

import ast

node = ast.Expression(ast.BinOp(
                ast.Str('xy'),
                ast.Mult(),
                ast.Num(3)))

fixed = ast.fix_missing_locations(node)

codeobj = compile(fixed, '<string>', 'eval')
print eval(codeobj)

ast.NodeTransformer

Проверьте класс ast.NodeTransformer, если вы хотите преобразовать существующий AST.

Вот пример из приведенного выше поста блога, который изменяет строковые значения, чтобы с добавлением str:.

class MyTransformer(ast.NodeTransformer):
    def visit_Str(self, node):
        return ast.Str('str: ' + node.s)
...