Как использовать абстрактные синтаксические деревья?

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

Почему ASTs полезны?

4 ответов


Они представляют логику / синтаксис кода, который, естественно, является деревом, а не списком строк, не увязая в конкретных синтаксических проблемах, таких как where you поместите звездочку.

логику можно затем манипулировать более последовательным и удобным способом из POV бэкэнда, который может быть (и есть, для всего, кроме Lisps ;) очень отличается от того, как мы пишем конкретный синтаксис.


основное преимущество ОС с использованием AST заключается в том, что вы отделяете логику синтаксического анализа и проверки от части реализации. Устные переводчики, внедренные в качестве AST, действительно легче понять и поддерживать. Если у вас возникли проблемы с разбором какого-то странного синтаксиса , вы смотрите на анализатор AST, если pices кода не дает ожидаемых результатов, чем вы смотрите на код, который интерпретирует AST.

другим большим преимуществом является то, что синтаксис требует "lookahead", например, если ваш синтаксис позволяет использовать подпрограмму до того, как она будет определена, тривиально проверять существование подпрограммы при использовании AST - это намного сложнее с синтаксическим анализатором "на лету".


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

является ли это дерево абстрактным (AST) или конкретным (CST) - это вопрос вкуса, удобства и инженерного пота. Термин CST специально используется для описания дерева деривации синтаксического анализа, когда грамматика используется для деконструкции источника код; он обычно содержит элементы дерева для множества конкретных синтаксисов, таких как точки с запятой Терминатора оператора. AST используется для обозначения "чего-то более простого, чем CST", например, оставляя узлы дерева с запятой, потому что они не сильно влияют на анализ программ, и, таким образом, написание анализаторов, которые обрабатывают AST, является менее концептуальным и инженерным усилием, чем написание того же анализатора на CST. Лучший способ понять это-понять, что AST обычно является изоморфным эквивалентом CST, то есть, вы должны быть в состоянии регенерировать CST из него. Если вы хотите преобразование исходный текст и регенерировать его, то CST часто является лучшим выбором, поскольку он теряет меньше информации из исходной программы (и мой причудливый пример использует этот подход).

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


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

Я часто использую ANTLR для разбора сложных языков и в этом контексте существует несколько более конкретное значение AST. ANTLR имеет удобный способ генерации AST в грамматике парсера, используя довольно простые действия. Затем вы пишете гораздо более простой парсер для этого AST, с которым вы можете работать как с более простой версией языка, который вы обрабатываете. Является ли дополнительная работа по созданию двух синтаксических анализаторов чистой прибылью, зависит от сложности языка и того, что вы планируете делать с ним после того, как вы проанализировали его.

хорошая книга по этому вопросу, на которую вы можете взглянуть, - это "Шаблоны реализации языка" Терренса Парра, автора ANTLR. Он довольно подробно рассматривает эту тему. Тем не менее, я не получал ASTs, пока не начал их использовать, так что (как обычно) это лучший способ понять их.