Size: a a a

Compiler Development

2021 May 26

AT

Alexander Tchitchigi... in Compiler Development
М? В чём проблема? Помнится, пару раз так делал для простых языков.
источник

к

кана in Compiler Development
но повторюсь, если есть возможность заиспользовать уже готовый парсер, даже через ffi какой-нибудь, то я думаю это лучший вариант
источник

AT

Alexander Tchitchigi... in Compiler Development
Первые два — самые объёмные только если оптимизации не писать.
источник

AT

Alexander Tchitchigi... in Compiler Development
Это да.
источник

к

кана in Compiler Development
я на работе занимаюсь как раз транслятором, и еще до меня там пытались написать свой парсер, и даже сразу во время парсинга генерить новый код. И выходило просто ужасно. Как только заюзали готовый парсер от компилятора исходного языка, стало в 10 раз лучше
источник

DP

Dmitry Popov in Compiler Development
Я как-то для чисто рабочих нужд делал "компилятор" из мини фп языка в обфусцированный c#, и до конкретного синтаксиса так и не дошел, исходная программа записывалась в виде АСТ компилятора (на идрисе). :)
источник

к

кана in Compiler Development
пытались потом и из компилятора другие вещи достать, типа резолвера имен, но это требовало слишком много контекста, да работало это на таком аст, который обратно уже не востановить, чтобы красиво притипринтить, резолвер написал свой
источник

РС

Роман Соловьев... in Compiler Development
тоже пишу на C# и это автоматически + миллион строк по сравнению с аналогичными фп решениями
источник

DP

Dmitry Popov in Compiler Development
у меня выход был c#
источник

DP

Dmitry Popov in Compiler Development
не сам компилятор
источник

к

кана in Compiler Development
но нам повезло в том плане, что компилятор исходного языка был написан тоже на хаскеле, на котором мы и транслятор пишем
источник

h

hazer_hazer in Compiler Development
а под претипринтингом вы подразумеваете AST -> Source code принтинг или же
AST -> красивое деревце в консоли?)
источник

к

кана in Compiler Development
первое
источник

к

кана in Compiler Development
красивое деревцо можно и общими инструментами вывести)

На это у нас тоже есть инструмент бтв - https://monadfix.com/shower
источник

h

hazer_hazer in Compiler Development
тогда ещё вопрос. раз вы в этой сфере профессионально.
Вы используете CST или делаете boolean пометки оберток?

ну. к примеру, при выводе AST для if a => print(a) и для if a {print(a)} можно всегда выводить в виде второго варианта, с CST можно выводить реальную картину, а пометками синтаксиса (Spacing значения и сохранения токенов, которые являются пунктуационными и не несут никакого смысла кроме как delimiter) получилось бы... вот не знаю что и получилось бы?
источник

к

кана in Compiler Development
когда есть вариант сделать меньше нод в дереве, но с булами, и больше нод, но без булов, то обычно выбирается второй вариант
источник

к

кана in Compiler Development
приходится больше обрабатывать кейсов потом, но зато без булов)
источник

к

кана in Compiler Development
ну в данном случае был просто отдельная нода блока, внутри которой список выражений. И иф хранил бы любое выражение, как блок, так и не блок
источник

h

hazer_hazer in Compiler Development
нет. ну это реашается high-level lowering'ом. Правда потом придется делать ещё один набор нод, чтобы быть уверенным на 100%, что не попадут расширенные ноды на более глубокий уровень.
У меня просто совсем нет желания делать CST 😔, так как единственное для чего он нужен как по мне это — code-style linting
источник

к

кана in Compiler Development
у нас был похожий кейс как раз. В исходном языке есть две конструкции, которые делают почти одно и то же, и в cst они раздельны, а в ast они унифицированы. И нам для вывода нужно их различать, а то некрасиво выходит. Первая попытка была пропатчить компилятор, чтобы тот сохранял инфу, каким образом данная нода в аст была сконструирована из cst. И это в целом работало, но не решало все равно главную задачу

По итогу мы просто написали свой конвертер из cst компилятора в наш собственный полу-аст-полу-цст, где минимум ненужной нам инфы, но такие вещи разделаются
источник