Size: a a a

Compiler Development

2021 May 24

K

Kir in Compiler Development
А лексер из регулярок никто делать не заставляет!

Пакрат он как бы O(N)
источник

DP

Dmitry Popov in Compiler Development
Не заставляет, это просто пример. Ускоряемся за счет опрощения, обеднения.
источник

DP

Dmitry Popov in Compiler Development
Коэффициент у пакрата большой, конечно, но количество работы на один входной символ/токен ограничего константой (числом правил), так что формально O(N).
источник

DP

Dmitry Popov in Compiler Development
Насчет LL(inf), кстати. Тот самый оператор, что монадные парсер комбинаторы делает монадными, дает возможность выбирать поведение динамически в зависимости от того, что недавно (или давно) распарсили. Т.е. это контекстно-зависимая уже? Есть ли формальная разница между контекстно-зависимой грамматикой и LL(inf)?
источник

DP

Dmitry Popov in Compiler Development
(if LL(inf) is a thing at all)
источник

K

Kir in Compiler Development
Есть, это джве разные категории по Хомскому
источник

K

Kir in Compiler Development
Долгих ему лет
источник

DP

Dmitry Popov in Compiler Development
Эти разные категории и их различение мне никогда полностью не давались, выглядели каким-то дуриловом. Когда класс языков (множеств строк) притягивают к особенностям реализации конкретного алгоритма парсинга... Экстенсиональное определение вместо интенсионального.
источник

K

Kir in Compiler Development
0) регулярки - *, +, ?, нет рекурсии
1) контекстно-свободные грамматики, их сабсет без конфликтов парсит LR - (0) + рекурсия
2) контекстно-зависимые - это когда можно не по одному нетерминалы заменять, а AB -> CD, это уже лента Тьюринга
3) неограниченные грамматики - всё остальное
источник

K

Kir in Compiler Development
источник

DP

Dmitry Popov in Compiler Development
Ну вот "без конфликтов" это прихоть конкретного алгоритма, что именно он считает конфликтом. Добавляем приоритеты или последовательный выбор, конфликт снимается. Это уже другой класс или еще нет?
источник

K

Kir in Compiler Development
А, вру - машина Тьюринга это уже неограниченные
источник

DP

Dmitry Popov in Compiler Development
Просто такая классификация выглядит как "ну я знаю такие три парсера, вот будет вам такие три класса".
источник

K

Kir in Compiler Development
Не-а. Если LR нашёл конфликт, он будет конфликтом при любых эквивалентных трансформациях, и без дополнительных средств его не разрешить.
источник

KT

Kirill Timofeev in Compiler Development
привет
а посоветуйте, пожалуйста, что классическое обзорное/короткое почитать про то как правильно писать dataflow/controlflow анализаторы? Без каких-то супер кишок, чтобы можно было за несколько вечеров прочитать
источник

DP

Dmitry Popov in Compiler Development
А что такое "без дополнительных средств"? Кто мешает последовательный выбор использовать, как в PEG?
источник

K

Kir in Compiler Development
Дополнительные средства - это left-biased choice, которые выводят нас из формализма Хомского
источник

K

Kir in Compiler Development
И приоритеты, которые то же самое, только ручек настройки больше
источник

DP

Dmitry Popov in Compiler Development
Ну вот, шаг в сторону, и классификация разваливается
источник

K

Kir in Compiler Development
Ну, да. Но, классификация Хомского не только про парсеры, но ещё и про генерацию. LR можно заставть порождать тексты на языке по грамматике. Не знаю, кому это может быть нужно, правда.
источник