Size: a a a

Compiler Development

2020 June 23

f

fldlg2 in Compiler Development
Peter Sovietov
Самый простой и красивый способ — использование PEG. И на уровне текста, и на уровне термов-деревьев.
Да, но меня смущает, как PEG-парсеры подходят к проблеме неоднозначности.
источник

PS

Peter Sovietov in Compiler Development
fldlg2
Да, но меня смущает, как PEG-парсеры подходят к проблеме неоднозначности.
Ну, когда мы сопоставляем AST-узлы по шаблонам, то упорядоченный выбор ведь не кажется чем-то искусственным?
источник

f

for(int c; (c = getc... in Compiler Development
Alexander Tchitchigin
Так Вы накаком языке пишите-то?
Nim - там есть AST макросы, очень удобно как раз для таких вещей. Если получится правильно (чисто) написать то скорее всего вообще не будет заметно что там какая-то сверхсложная машинерия работает внутри.
источник

f

fldlg2 in Compiler Development
Peter Sovietov
Ну, когда мы сопоставляем AST-узлы по шаблонам, то упорядоченный выбор ведь не кажется чем-то искусственным?
Как именно AST сопоставляется шаблонам — это личное дело архитекторов программы. В ANTLR пытались родить формализм для этой трансформации, но отказались от него.  А синтаксический разбор — это другое дело, тут есть классические формальные методы, и PEG/GLR их упраздняют. Хорошо ли это, я не уверен.
источник

PS

Peter Sovietov in Compiler Development
fldlg2
Как именно AST сопоставляется шаблонам — это личное дело архитекторов программы. В ANTLR пытались родить формализм для этой трансформации, но отказались от него.  А синтаксический разбор — это другое дело, тут есть классические формальные методы, и PEG/GLR их упраздняют. Хорошо ли это, я не уверен.
PEG это легкая декларативная надстройка над обычным рекурсивным спуском. Важно, что с одним формализмом PEG можно и синтаксическим разбором заниматься, и преобразованиями программ на уровне AST. В результате получается удивительно компактный «швейцарский нож» для задач компиляции.
источник

AT

Alexander Tchitchigi... in Compiler Development
for(int c; (c = getchar()) != EOF;)
Nim - там есть AST макросы, очень удобно как раз для таких вещей. Если получится правильно (чисто) написать то скорее всего вообще не будет заметно что там какая-то сверхсложная машинерия работает внутри.
Тогда, скорее всего — просто визитором. (Это на вопрос как parse tree перегонять в AST.)
источник

f

fldlg2 in Compiler Development
Peter Sovietov
PEG это легкая декларативная надстройка над обычным рекурсивным спуском. Важно, что с одним формализмом PEG можно и синтаксическим разбором заниматься, и преобразованиями программ на уровне AST. В результате получается удивительно компактный «швейцарский нож» для задач компиляции.
Да, конечно, это понятно. Но вот тривиальный смешной пример: что произойдёт если PEG-у скормить ту же левую рекурсию? (Я не знаю, как поведут себя самые продвинутые из реализаций генераторов, но догадываюсь, что случится во всех остальных.)
источник

PS

Peter Sovietov in Compiler Development
fldlg2
Да, конечно, это понятно. Но вот тривиальный смешной пример: что произойдёт если PEG-у скормить ту же левую рекурсию? (Я не знаю, как поведут себя самые продвинутые из реализаций генераторов, но догадываюсь, что случится во всех остальных.)
Самый очевидный способ — добавить запоминание для поддержки левой рекурсии. Это давно уже используется в популярных PEG-инструментах.
источник

f

fldlg2 in Compiler Development
Peter Sovietov
Самый очевидный способ — добавить запоминание для поддержки левой рекурсии. Это давно уже используется в популярных PEG-инструментах.
Не могу навскидку представить, как это может помочь, но подумаю-почитаю.
источник

PS

Peter Sovietov in Compiler Development
fldlg2
Не могу навскидку представить, как это может помочь, но подумаю-почитаю.
источник

f

fldlg2 in Compiler Development
Спасибо. Тогда остаётся (для меня) вопрос неоднозначности и производительности.
источник

PS

Peter Sovietov in Compiler Development
fldlg2
Спасибо. Тогда остаётся (для меня) вопрос неоднозначности и производительности.
Ну, я бы, например, был более озабочен вопросами преобразования программ средствами PEG :) PEG для синтаксического анализа — штука и так известная и проверенная.
источник

f

fldlg2 in Compiler Development
Peter Sovietov
Ну, я бы, например, был более озабочен вопросами преобразования программ средствами PEG :) PEG для синтаксического анализа — штука и так известная и проверенная.
Всё зависит от области применения, наверное.
источник

PS

Peter Sovietov in Compiler Development
fldlg2
Всё зависит от области применения, наверное.
Возможно. Или причина в том, что на тему PEG для AST есть только 2-3 академических статьи, да пара малоизвестных/забытых инструментов :)
источник

IK

Ivan Kochurkin in Compiler Development
fldlg2
Да, конечно, это понятно. Но вот тривиальный смешной пример: что произойдёт если PEG-у скормить ту же левую рекурсию? (Я не знаю, как поведут себя самые продвинутые из реализаций генераторов, но догадываюсь, что случится во всех остальных.)
И что произойдет?
источник

f

fldlg2 in Compiler Development
Ivan Kochurkin
И что произойдет?
Не знаю. В наивных реализациях — переполнение стека во время парсинга, например.
источник

PS

Peter Sovietov in Compiler Development
С одной стороны, преобразования уровня абстрактного синтаксиса, вроде бы, не нужны там, где нужно просто перевести текст во внутреннее представление, безо всяких оптимизаций.

Но, как правильно уже было замечено ранее, часто полезно осуществить предварительный разбор сначала для обобщенного-relaxed варианта грамматики, в затем уточняющую трансляцию (и часто не одну) провести уже на уровне абстрактного синтаксиса. И здесь «классические формальные методы» уже не помогут.
источник

f

fldlg2 in Compiler Development
Peter Sovietov
С одной стороны, преобразования уровня абстрактного синтаксиса, вроде бы, не нужны там, где нужно просто перевести текст во внутреннее представление, безо всяких оптимизаций.

Но, как правильно уже было замечено ранее, часто полезно осуществить предварительный разбор сначала для обобщенного-relaxed варианта грамматики, в затем уточняющую трансляцию (и часто не одну) провести уже на уровне абстрактного синтаксиса. И здесь «классические формальные методы» уже не помогут.
Не помогут. Но (занудствую последний раз) если можно разделить формализуемое и неформализуемое и повластвовать, то почему бы и не разделить?
источник

PS

Peter Sovietov in Compiler Development
fldlg2
Не помогут. Но (занудствую последний раз) если можно разделить формализуемое и неформализуемое и повластвовать, то почему бы и не разделить?
Я просто предлагаю заранее не опускать руки (читай: переходить на шаблон посетителя и проч.) :)
источник

f

fldlg2 in Compiler Development
Peter Sovietov
Я просто предлагаю заранее не опускать руки (читай: переходить на шаблон посетителя и проч.) :)
Резонно.
источник