Построение AST из токенов (FunctionDef)?

#python #compiler-construction #abstract-syntax-tree #transpiler

#python #компилятор-построение #абстрактное синтаксическое дерево #transpiler

Вопрос:

Я пытаюсь создать python transpiler на другой язык. Я использую модуль токенизатора python, чтобы получить список токенов и понять, что шаблон посетителя может использоваться для преобразования узлов AST в целевой язык. Однако я не уверен в том, как преобразовать токены в AST. Учитывая, насколько велика грамматика python, кажется, что должен быть более простой способ построения AST, а не куча операторов «if». Я специально работаю над созданием узла python FunctionDef для AST. Должен ли я перебирать токены и использовать if только для проверки нетерминалов?…

Я просмотрел такие учебные пособия, как; Super Tiny Compiler, crafting interpreters, документы python

Учитывая список токенов, я хочу вывести этот ast с помощью рекурсивного приличного синтаксического анализа (FunctionDef.body = оператор возврата с возвращаемым значением).

Грамматические узлы — https://docs.python.org/3/library/ast.html

 tokens = [NAME:'def' NAME:'foo' LPAR:'(' NAME:'bar' COMMA:',' NAME:'verbose' RPAR:')' COLON:':' INDENT:'' NAME:'return' NAME:'bar' DEDENT:'']

ast = {
  'type': 'PROGRAM',
  'body': [
     FunctionDef(identifier name, arguments args,
                   stmt* body, expr* decorator_list, expr? returns,
                   string? type_comment)
  ]
}
  

Комментарии:

1. Вам нужно привести пример того, чего вы пытаетесь достичь. В противном случае это слишком расплывчато…

2. Может быть, взгляните на кодовую базу Lark: github.com/lark-parser/lark .

3. Самый простой способ сделать это — использовать синтаксический анализатор Python, доступный как ast.parse . Я, честно говоря, не знаю, какова была бы обучающая ценность отказа от использования этого анализатора. Одна вещь, которую вы могли бы узнать, это то, что рекурсивный спуск далеко не так прост, как кажется, когда применяется к реальным языкам, таким как Python. Лично я думаю, что вам было бы лучше научиться писать грамматику , которая может быть обработана одним из многих доступных генераторов синтаксического анализа, таких как Ply / Sly или Lark.

4. @Steve: Если вы переходите с Python, то дерево синтаксического анализа, созданное ast.parse, должно предоставить вам все, что вам нужно. Несмотря на свое название, это действительно больше похоже на конкретное дерево синтаксического анализа, чем на абстрактное дерево синтаксического анализа, поэтому в нем много посторонних деталей. Но это легко понять.

5. Синтаксический анализ рекурсивного спуска совсем не сложен! Проверьте эти файлы (особенно rd_parser_ebnf ): github.com/eliben/code-for-blog/tree/master/2009 /… . Они действительно помогли мне при изучении синтаксического анализа рекурсивного спуска. Но лучшим вариантом, как сказал @rici, ast.parse должен быть goto.