Size: a a a

Compiler Development

2020 June 23

f

for(int c; (c = getc... in Compiler Development
Когда я искал как переписывать различные деревья друг в друга я еще наткнулся на term rewriting - я не смогу найти литературы "среднего" уровня по этой теме (либо адская математика, которую я не смог осилить, либо очень простое "берем правило, смотрим какие редексы совпадают, переписываем их, повторяем").

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

Возможно есть какая-нибудь книга где рассматривается что-то похожее на мой велосипед?
источник

AT

Alexander Tsukanov in Compiler Development
источник

AT

Alexander Tsukanov in Compiler Development
в ней должно быть
источник

AT

Alexander Tsukanov in Compiler Development
скриншот выше был из нее
источник

AT

Alexander Tsukanov in Compiler Development
Насколько я навскидку могу прикинуть:
Это таки обход в глубину, где при подъеме вы матрешки схлопываете.
Это можно понять по скрину что я кинул. Все узлы пустышки содержат только одного ребенка.
Потому при рекурсивном подъеме вы их закономерно посетите один раз.
Т.е. к примеру встретили узел умножения у которого один ребенок (хотя должно быть очевидно два),
вот и заменяете его на ребенка и т.д. рекурсивно. Вроде так
источник

f

fldlg2 in Compiler Development
В старом ANTLR (в ANTLR я некомпетентен и сейчас начну врать) была подсистема для трансформации parse tree в AST, где можно было задать грамматику, очень похожую на оригинальную LL(k). В новом, кажется, это всё выкинули, но что-то интересное точно было.
источник

f

fldlg2 in Compiler Development
Да, память не обманула, "tree parsers" в ANTLR 2.
источник

f

fldlg2 in Compiler Development
Красивые term rewrite и все дела: https://www.antlr2.org/doc/sor.html
источник

А

Алексей ayaye :)... in Compiler Development
никогда мне это не нравилось, я всегда руками писал :)
источник

А

Алексей ayaye :)... in Compiler Development
и самое главное - структура AST должна быть фиксирована и хорошо документирована. а когда она размазана по определению парсера - это неправильно на мой взгляд
источник

PS

Peter Sovietov in Compiler Development
fldlg2
Красивые term rewrite и все дела: https://www.antlr2.org/doc/sor.html
Системы переписывания действительно красивые. Но вот уровень старого ANTLR легко перекрывается использованием языка с встроенной поддержкой сопоставления с образцом.
источник

f

fldlg2 in Compiler Development
Peter Sovietov
Системы переписывания действительно красивые. Но вот уровень старого ANTLR легко перекрывается использованием языка с встроенной поддержкой сопоставления с образцом.
Честно говоря, мне нечего возразить: я отказался от ANTLR, когда он назывался PCCTS, и отстал от LL-жизни 😊
источник

IK

Ivan Kochurkin in Compiler Development
Алексей ayaye :)
и самое главное - структура AST должна быть фиксирована и хорошо документирована. а когда она размазана по определению парсера - это неправильно на мой взгляд
Да, поэтому в новом все это прописывается в коде внутри листенеров, а в парсере устанавливается BuildParseTree = false
источник

f

for(int c; (c = getc... in Compiler Development
Забыл сказать еще одну вещь - я пишу генератор парсеров просто на макросах в языке, так что он выглядит как обычная библиотека. И в таком случае можно говорить уже про API для генератора парсеров. И "даем грамматику, получаем дерево" выглядит гораздо лучше чем рассовывание кусочков кода по какому-то DSL. Это уже делали конкретной реализации но все же решил уточнить.
источник

AT

Alexander Tsukanov in Compiler Development
Alexander Tsukanov
в ней должно быть
Чет не вижу, и что-то вообще сейчас задумался а существует ли он в вакууме.
Этож надо алгоритму и описание AST какое-то скормить, и подсказать как преобразовывать.
Универсального рецепта наверно нет.
источник

А

Алексей ayaye :)... in Compiler Development
fldlg2
Честно говоря, мне нечего возразить: я отказался от ANTLR, когда он назывался PCCTS, и отстал от LL-жизни 😊
ааа, я тоже помню это слово :)
источник

f

fldlg2 in Compiler Development
Алексей ayaye :)
ааа, я тоже помню это слово :)
🍺
источник

А

Алексей ayaye :)... in Compiler Development
for(int c; (c = getchar()) != EOF;)
Забыл сказать еще одну вещь - я пишу генератор парсеров просто на макросах в языке, так что он выглядит как обычная библиотека. И в таком случае можно говорить уже про API для генератора парсеров. И "даем грамматику, получаем дерево" выглядит гораздо лучше чем рассовывание кусочков кода по какому-то DSL. Это уже делали конкретной реализации но все же решил уточнить.
на самом деле рекурсивный парсер вполне можно в таком стиле писать, c макросами/библиотекой тем более красиво будет
источник

PS

Peter Sovietov in Compiler Development
fldlg2
Честно говоря, мне нечего возразить: я отказался от ANTLR, когда он назывался PCCTS, и отстал от LL-жизни 😊
Самый простой и красивый способ — использование PEG. И на уровне текста, и на уровне термов-деревьев.
источник

AT

Alexander Tchitchigi... in Compiler Development
for(int c; (c = getchar()) != EOF;)
Забыл сказать еще одну вещь - я пишу генератор парсеров просто на макросах в языке, так что он выглядит как обычная библиотека. И в таком случае можно говорить уже про API для генератора парсеров. И "даем грамматику, получаем дерево" выглядит гораздо лучше чем рассовывание кусочков кода по какому-то DSL. Это уже делали конкретной реализации но все же решил уточнить.
Так Вы накаком языке пишите-то?
источник