Zephyr ASDL (язык абстрактного описания синтаксиса)

Вопрос:

Что такое Zephyr ASDL и как он связан с другими технологиями компиляции, такими как лексеры и генераторы синтаксических анализаторов?

(Я был бы признателен, если бы вы были достаточно полными, но укажите на другие ссылки в Интернете, когда это становится довольно техническим, потому что большая часть того, что я знаю о компиляторах, получена из игры с yacc и flex, написания простого максимального лексера Munch на C и поиска вставай и читай в инете)

Предыстория вопроса:

Я читал http://docs.python.org/devguide/compiler.html и я наткнулся на следующую строку:

Спецификация узлов AST указывается с использованием языка определения абстрактного синтаксиса Zephyr (ASDL).

Я проследил ссылку внизу, чтобы найти: http://www.cs.princeton.edu/research/techreps/TR-554-97.

Мое первое прочтение статьи было довольно бурным, и я надеялся, что смогу сначала лучше понять цель ASDL (в контексте процесса компиляции), прежде чем пытаться снова.


person math4tots    schedule 15.01.2012    source источник


Ответы (3)


Генераторы Lexer и Parser принимают описания лексем и грамматик и генерируют код, реализующий соответствующий артефакт. Lex требует регулярного выражения для описания токенов. Генераторы синтаксических анализаторов принимают различные виды расширенных нотаций BNF.

Документ, на который вы ссылаетесь, довольно ясен ИМХО: ASDL - это небольшой язык для абстрактного описания набора узлов дерева (их типов и подписей). Используя этот язык, можно написать (и авторы статьи так и сделали) инструмент, который преобразует эти описания в набор типов записей, которые вам понадобятся для реализации деревьев, которые будут использоваться с синтаксическим анализатором. Таким образом, ADSL похож на Regex и BNF в том смысле, что его цель состоит в том, чтобы передать его генератору кода, который создает часть компилятора.

Расширяющая точка зрения состоит в том, что компиляторы — это довольно хорошо изученная технология, и что их можно генерировать из описаний различных частей. Regex/BNF/ADSL являются важными ключами на этапе синтаксического анализа.

В идеале вам нужны языки описания для целевых наборов инструкций, анализ потоков, переводы (вы упомянули максимальный манч) из абстрактных деревьев в целевой набор инструкций и способ описания оптимизаций. Затем с соответствующими инструментами для каждой части вы можете собрать весь компилятор из «спецификаций». На самом деле в этой области было проделано много работы; люди делали все это по отдельности и вместе. Неудивительно, что некоторые из них исходят от проекта «Зефир», ранее находившегося в Принстоне (похоже, веб-сайт Зефира сейчас мертв), целью которого было делать именно такие вещи.

В любом случае попробуйте найти в Google Scholar «генератор компилятора».

person Ira Baxter    schedule 16.01.2012

ASDL используется, когда вам нужно сгенерировать дерево в модуле и ввести такое же дерево в другой модуль (или почти такое же дерево, как-то оптимизированное).

Для этого нужно иметь функции построения (в идеале с проверкой типов), функцию печати дерева, чтобы визуализировав его, вы были уверены, что сгенерировали его правильно.

ASDL принимает на вход некоторое дерево, написанное в синтаксисе, почти идентичном синтаксису алгебраического типа данных (например, в haskell или ml), или синтаксисе в BNF, но гораздо более упрощенном, и автоматически генерирует все конструкторы, печатая функции, начиная с простое описание дерева.

Например, если у вас есть лексер, он должен будет генерировать лексемы, имеющие тип. Вам также нужно увидеть выходной поток лексем (это в линейной форме, поэтому очень простое дерево). Вместо того, чтобы писать функции для печати, конструируя лексемы, вы определяете их как-то так

   lexeme=
       ID(STRING)
     | INT(num_integer)
     | FLOAT(num_float)
     attributes(int coord_x, int coord_y)
   num_integer:
     ....
   num_float:
     ....

и вы вызываете конструкторы ID, INT, FLOAT и т. д. из вашего лексера. ASDL преобразует этот простой синтаксис во все функции, которые вам нужны, либо для создания узлов для AST, либо для печати, либо для всего, что вам нужно. ASDL не накладывает ограничений на генерируемый код.

Если вы добавляете attributes к типу, например к координатам токена, такие атрибуты добавляются к параметрам каждого конструктора из этого типа.

Более сложное дерево, созданное парсером, будет выглядеть так

expr:  SUM(expr, expr)
      |PRODUCT(expr, expr)
      |number
number: num_integer

В этом случае asdl проверит, что вызов SUM(_ _), сделанный синтаксическим анализатором, пройдет к узлам суммы, созданным с помощью одного из конструкторов expr. num_integer определяется извне, возможно, деревом asdl для лексера.

Обратите внимание, что вам не разрешено определять конструкторы, содержащие регулярные выражения, такие как number: [0-9]+. ASDL проще, чем EBNF.

Эти конструкторы будут определены таким образом, что для создания того, что вам нужно, и более того, они будут проверять тип, чтобы убедиться, что ваш лексер/парсер/генератор кода выводит деревья, которые соответствуют языку, определенному asdl.

Чтобы хорошо понимать ASDL, вам нужно написать 3-4 парсера и посмотреть, что общего в коде, который они генерируют. Эта общая часть на самом деле является ASDL, так что это абстракция, в частности, для вывода парсеров.

person alinsoar    schedule 06.12.2016

Ваш вопрос касается разницы между конкретным синтаксисом и абстрактным синтаксисом.

  • Конкретный синтаксис — это то, что вы знаете и должны соблюдать при использовании языка программирования. Этот конкретный синтаксис также проверяется синтаксическим анализатором, который проверяет, соблюдаете ли вы грамматику языка или нет. У синтаксического анализатора есть вторая роль, скрытая от программиста: создание в памяти специальной структуры данных, представляющей ваш источник ввода. Многие алгоритмы будут применяться к этой структуре данных. Эта структура данных называется абстрактным синтаксическим деревом.
  • Абстрактный синтаксис: это набор классов (в объектно-ориентированной парадигме или типов в функциональной парадигме), из которых разрабатывается AST. Например, у вас может быть класс Program, отражающий суть того, из чего состоит программа. У вас также может быть класс If, который представляет структуру оператора if (состоящего из условия, обычного тела и, возможно, второго для части else).

ASDL, как и Zephyr, посвящен тому, как описать этот набор классов для абстрактного синтаксиса, но не грамматики как таковой.

Как только набор классов будет полностью описан (или даже сгенерирован), его можно использовать в синтаксическом анализаторе, разрабатывающем AST.

person JCLL    schedule 14.04.2021