Size: a a a

Compiler Development

2020 December 12

h

hazer_hazer in Compiler Development
for(int c; (c = getchar()) != EOF;)
У меня есть конкретное дерево разбора для кода (CST), и соответствующее ему абстрактное (AST), полученное из первого просто выбрасыванием всех вспомогательных токенов.

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

У меня была идея распарсить какое-то количество тестового кода, собрать статистику по тому где какие вспомогательные токены встречаются, и на основе этого сгенерировать код для преобразователя из AST в CST. Возможно с какими-то ручными изменениями после.

Может быть кто-то встречал что-то похожее и может порекомендовать какие-то статьи на эту тему? Если честно то у меня не очень получилось даже загуглить это, но может быть я не смог сформулировать.
Ну. Тебе не нужно ast в cst трансформировать.
Так как особенность cst в том, что ты знаешь "как" пользователь написал, но эта информация тебе недоступна. А самого ast достаточно, чтобы преобразовать все в строку.
источник

h

hazer_hazer in Compiler Development
for(int c; (c = getchar()) != EOF;)
Нет, нет, проблемы в рендеринге в строку нет, меня интересовало только преобразование AST -> CST, с остальным все достаточно понятно.
Хммм.... Тогда все опциональные токены заменяешь на их присутствие

Например, у меня в япе можно опустить () если нет аргументов, либо вообще их не писать и просто через запятую аргументы перечислить, но при выводе дерева я пишу (), также как и с опциональными ;
источник

f

for(int c; (c = getc... in Compiler Development
У меня был вопрос в том как автоматом генерировать преобразователь AST -> CST, а не в том как это вообще сделать можно. Понятное дело что это несложно, но писать

if node.kind == cppForSmtt:
 result.add "for ("


Для дерева разбора С++ это занятие унылое. Но на самом деле у меня просто из головы вылетело что я могу проанализировать грамматику и на ее основе что-то делать
источник

f

for(int c; (c = getc... in Compiler Development
hazer_hazer
Хммм.... Тогда все опциональные токены заменяешь на их присутствие

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

h

hazer_hazer in Compiler Development
for(int c; (c = getchar()) != EOF;)
У меня был вопрос в том как автоматом генерировать преобразователь AST -> CST, а не в том как это вообще сделать можно. Понятное дело что это несложно, но писать

if node.kind == cppForSmtt:
 result.add "for ("


Для дерева разбора С++ это занятие унылое. Но на самом деле у меня просто из головы вылетело что я могу проанализировать грамматику и на ее основе что-то делать
Тогда я не понял. Что значит "автоматом"?
источник

f

for(int c; (c = getc... in Compiler Development
Генератор кода для генераторов кода из AST. Звучит немного бредово, но если учесть что формулировка проблемы примерно

"Имея грамматику для CST, и список вспомогательных токенов, присутствующих в CST, но не в AST (получанном из CST фильтрацией токенов), написать преобразователь AST -> CST"

И меня интересовала автоматизация части "написать преобразователь"
источник

h

hazer_hazer in Compiler Development
for(int c; (c = getchar()) != EOF;)
Генератор кода для генераторов кода из AST. Звучит немного бредово, но если учесть что формулировка проблемы примерно

"Имея грамматику для CST, и список вспомогательных токенов, присутствующих в CST, но не в AST (получанном из CST фильтрацией токенов), написать преобразователь AST -> CST"

И меня интересовала автоматизация части "написать преобразователь"
не знаю какие тут могут быть оптимизации. можно сделать просто визитор с возвращаемым значением...
источник

f

for(int c; (c = getc... in Compiler Development
Оптимизации по времени программирования преобразователя. Просто не хочется писать это все руками, никаких дополнительных соображений больше нет.
источник

h

hazer_hazer in Compiler Development
for(int c; (c = getchar()) != EOF;)
Оптимизации по времени программирования преобразователя. Просто не хочется писать это все руками, никаких дополнительных соображений больше нет.
придется руками...
источник

а

а это кто in Compiler Development
for(int c; (c = getchar()) != EOF;)
Генератор кода для генераторов кода из AST. Звучит немного бредово, но если учесть что формулировка проблемы примерно

"Имея грамматику для CST, и список вспомогательных токенов, присутствующих в CST, но не в AST (получанном из CST фильтрацией токенов), написать преобразователь AST -> CST"

И меня интересовала автоматизация части "написать преобразователь"
ну вот есть генератор парсеров, а ты напиши генератор антипарсеров который по BNF сделает преобразователь AST -> CST
источник
2020 December 13

K

Kir in Compiler Development
for(int c; (c = getchar()) != EOF;)
У меня есть конкретное дерево разбора для кода (CST), и соответствующее ему абстрактное (AST), полученное из первого просто выбрасыванием всех вспомогательных токенов.

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

У меня была идея распарсить какое-то количество тестового кода, собрать статистику по тому где какие вспомогательные токены встречаются, и на основе этого сгенерировать код для преобразователя из AST в CST. Возможно с какими-то ручными изменениями после.

Может быть кто-то встречал что-то похожее и может порекомендовать какие-то статьи на эту тему? Если честно то у меня не очень получилось даже загуглить это, но может быть я не смог сформулировать.
Я в подобной ситуации просто хранил в каждом узле ленивый слайс исходника. Ещё у меня был претти-принтер
источник

PS

Pavel Samolysov in Compiler Development
Вот интересная статья, заголовочные файлы ещё себя покажут :) в том смысле что компиляция кода,  использующего заголовочные файлы параллелится гораздо лучше чем кода, использующего  модули. Другое дело, что здесь не сравнивается компиляция тонн шаблонов, так как полтора года назад модули С++ не умели в шаблоны. https://www.bfgroup.xyz/cpp_tooling_stats/modules/modules_perf_D1441R1.html
источник

PS

Pavel Samolysov in Compiler Development
В общем для голого Си модули наверное и не нужны, интересно туда их будут добавлять? Иначе Торвальдсу придётся выкинуть свой тредриппер.
источник

AT

Alexander Tchitchigi... in Compiler Development
Kir
Я в подобной ситуации просто хранил в каждом узле ленивый слайс исходника. Ещё у меня был претти-принтер
У меня с собой было CST, AST, CFG, SSA, IRs всех цветов и размеров и два претти-принтера. Не то чтобы это всё было строго необходимо, но если уж начал писать компилятор, трудно остановиться. А ещё ленивый слайс исходника в каждом узле. Я знал, что рано или поздно дойду и до этой дряни...
источник

PS

Pavel Samolysov in Compiler Development
Alexander Tchitchigin
У меня с собой было CST, AST, CFG, SSA, IRs всех цветов и размеров и два претти-принтера. Не то чтобы это всё было строго необходимо, но если уж начал писать компилятор, трудно остановиться. А ещё ленивый слайс исходника в каждом узле. Я знал, что рано или поздно дойду и до этой дряни...
Достойный эпиграф к любой книге про компиляторы. Надо ещё где-то SoN вставить
источник

AT

Alexander Tchitchigi... in Compiler Development
Pavel Samolysov
Достойный эпиграф к любой книге про компиляторы. Надо ещё где-то SoN вставить
Там уж либо SSA, либо SoN. Нельзя же упарываться до такой степени чтобы оба втащить! 😂
источник

PS

Pavel Samolysov in Compiler Development
Alexander Tchitchigin
Там уж либо SSA, либо SoN. Нельзя же упарываться до такой степени чтобы оба втащить! 😂
Так у него IR всех цветов и размеров, один SSA, другой SON
источник

K

Kir in Compiler Development
Alexander Tchitchigin
У меня с собой было CST, AST, CFG, SSA, IRs всех цветов и размеров и два претти-принтера. Не то чтобы это всё было строго необходимо, но если уж начал писать компилятор, трудно остановиться. А ещё ленивый слайс исходника в каждом узле. Я знал, что рано или поздно дойду и до этой дряни...
Четыре. Четыре претти-принтера
источник

K

Kir in Compiler Development
Alexander Tchitchigin
У меня с собой было CST, AST, CFG, SSA, IRs всех цветов и размеров и два претти-принтера. Не то чтобы это всё было строго необходимо, но если уж начал писать компилятор, трудно остановиться. А ещё ленивый слайс исходника в каждом узле. Я знал, что рано или поздно дойду и до этой дряни...
Я ещё ренджи и скоупы в каждом узле хванил, потому что если есть расширяемы рекорд - грех в него не запихать всё, что под руку попадётся
источник

BD

Berkus Decker in Compiler Development
Pavel Samolysov
В общем для голого Си модули наверное и не нужны, интересно туда их будут добавлять? Иначе Торвальдсу придётся выкинуть свой тредриппер.
А в голый си собираются добавлять модули?
источник