Re[2]: [Parsing] Pratt-парсер (любопытные ссылки)
От: VladD2 Российская Империя www.nemerle.org
Дата: 01.10.10 16:32
Оценка:
Здравствуйте, Aleх, Вы писали:

A>Кстати, чем плоха идея строить типа LL парсера (только обобщенного и с приоритетами) для разбора текста, заданного грамматикой в формате PEG?


A>Под обобщенный LL я имею ввиду делить стек при возникновении неоднозначности. То есть если по первому символу не возможно раскрыть правило, то делим стек. Ну а когда, возникает такая ситуация, что некоторое множество стеков одинаково, оставлять из них только один, который был порожден раскрытием правила, стоящим в начале перечисления альтернатив PEG выражения.


Описывать операторы одинакового неудобно в любых видах парсеров, если это не сделано специальным образом.

Описать приоритеты операторов элементарная задача. А вот выразить тоже самое в виде грамматики — это задача уже посложнее (сильно).

ЗЫ

Я не представляю что такое "типа LL парсера (только обобщенного и с приоритетами)".

Кроме того вообще не ясно что имеется в виду под стеком и как его можно делить.

LL и есть нисходящий парсер. Для разбора ПЕГ-а используется его разновидность нисходящий парсер с откатами.

В общем, идея описана настолько сумбурно, что можно только гадать, что же подразумевалось.

Судя по идее что-то разделять осмелюсь предположить что под LL имелся в виду LL-автомат (т.е. ДКА), а под "стеком" имелись в виду таблица такого автомата.

Если мои предположения верны, то ответ будет следующим...

В ANTLR 3 так и поступает. Он создает набор LL(1) ДКА.
Но у этой идеи есть ряд существенных недостатков:
1. Требуется отдельный лексер.
2. Трудно сделать модульную грамматику (в связи с п. 1).
3. Практически невозможно сделать такой парсер расширяемым в рантайме.

Учитывая, что например, наша реализация PEG-а на основе нисходящего парсера с откатами обеспечивает весьма высокую скорость парсинга и не обладает этими недостатками, идея генерации множества ДКА и возни с ними не кажется такой особо интересной.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.