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

Я занимался исследованием компиляторов. Лексический анализатор кажется очень простым: возьмите «предложение» и разбейте его на слова (или лексемы). Для обеспечения правильной грамматики необходим синтаксический анализатор. Парсер обычно берет токены и строит дерево, которое приводит к корневому узлу (слова в предложения, абзацы, страницы и т. Д.).

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

А как насчет преобразования кода с одного языка на другой? Взять выдуманный язык (грамматику) или существующую грамматику и преобразовать его в другой, где правила приоритета операторов могут отличаться, а могут и не отличаться? Приоритет операторов «встроен» в CST?

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

Так что для языкового перевода лучше использовать CST? Приоритет операторов обычно встроен в CST? Есть что-то среднее? Есть ли примеры сравнения обоих деревьев с помощью простого алгебраического уравнения? Есть ли примеры, иллюстрирующие тернарный оператор?

(Является ли «транскодирование» правильным термином для «перевода на язык программирования»? Поиск в Google вызывает преобразование мультимедиа.)

Я пытаюсь выяснить следующее: когда это происходит более целесообразно использовать один вместо другого?

5
задан Community 23 May 2017 в 12:00
поделиться