В настоящее время я работаю над проектом, включающим новую более быструю среду выполнения / виртуальную машину для Python в Linux. Исходный код Python преобразуется в промежуточный AST, анализируется, а код для целевой виртуальной машины генерируется JIT и кэшируется. Из-за JIT-характера предлагаемой машины скорость имеет важное значение, и я пишу ее как можно нативнее. В настоящее время он полностью реализован на C, кроме одного интерфейса Python для модуля компилятора. В настоящее время я могу создать AST с помощью модуля компилятора Python и сохранить его в памяти.
Например код:
class Test:
def testFunc(arg1):
print 'Arg is ' + arg1
генерирует АСТ
Module(None, Stmt([Class('Test', [], None, Stmt([Function(None, 'testFunc', ['arg1'], [], 0, None, Stmt([Printnl([Add((Const('Arg is '), Name('arg1')))], None)]))]), None)]))
Что я хочу знать, так это эффективный метод для преобразования этого AST в управляемую структуру данных, такую как дерево, которое можно пройти и сгенерировать целевой код. Я не понимаю, стоит ли использовать генератор синтаксических анализаторов, такой как Bison или Lemon, или вручную токенизировать и анализировать его. Поскольку AST получается после обширных проверок ошибок, нет смысла в дальнейших проверках ошибок, поэтому я считаю, что генератор синтаксического анализатора излишен. Сам Python предоставляет обходчики AST, но замедляет его. Но тогда я действительно не слишком уверен, как расшифровать это вручную. Я был бы очень признателен за любой алгоритм или предложение или, если возможно, за реализацию на родном языке.
T
вast
означаетtree
. Это уже дерево, по которому вы можете пройти, например, Простой пример использованияast.NodeVisitor
? или другой простой пример: Извлечение «лишних» строк документации из кода Python? - person jfs   schedule 21.12.2013