Здравствуйте, Aleх, Вы писали:
A>Кстати, чем плоха идея строить типа LL парсера (только обобщенного и с приоритетами) для разбора текста, заданного грамматикой в формате PEG?
A>Под обобщенный LL я имею ввиду делить стек при возникновении неоднозначности. То есть если по первому символу не возможно раскрыть правило, то делим стек. Ну а когда, возникает такая ситуация, что некоторое множество стеков одинаково, оставлять из них только один, который был порожден раскрытием правила, стоящим в начале перечисления альтернатив PEG выражения.
Описывать операторы одинакового неудобно в любых видах парсеров, если это не сделано специальным образом.
Описать приоритеты операторов элементарная задача. А вот выразить тоже самое в виде грамматики — это задача уже посложнее (сильно).
ЗЫ
Я не представляю что такое "типа LL парсера (только обобщенного и с приоритетами)".
Кроме того вообще не ясно что имеется в виду под стеком и как его можно делить.
LL и есть нисходящий парсер. Для разбора ПЕГ-а используется его разновидность нисходящий парсер с откатами.
В общем, идея описана настолько сумбурно, что можно только гадать, что же подразумевалось.
Судя по идее что-то разделять осмелюсь предположить что под LL имелся в виду LL-автомат (т.е. ДКА), а под "стеком" имелись в виду таблица такого автомата.
Если мои предположения верны, то ответ будет следующим...
В ANTLR 3 так и поступает. Он создает набор LL(1) ДКА.
Но у этой идеи есть ряд существенных недостатков:
1. Требуется отдельный лексер.
2. Трудно сделать модульную грамматику (в связи с п. 1).
3. Практически невозможно сделать такой парсер расширяемым в рантайме.
Учитывая, что например, наша реализация PEG-а на основе нисходящего парсера с откатами обеспечивает весьма высокую скорость парсинга и не обладает этими недостатками, идея генерации множества ДКА и возни с ними не кажется такой особо интересной.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.