GLR отлично подходит, если вы хотите разобрать дерево / лес и не возражаете против черных ящиков.Это позволяет вам вводить все, что вы хотите CFG , за счет проверки неоднозначностей во время анализа путем исчерпывающего тестирования, вместо статического разрешения конфликтов LR / LALR.Некоторые говорят, что это хороший компромисс.Инструмент DMS Ира Бакстера или Elkhound, который имеет бесплатную грамматику C ++, полезен для этого класса проблем. ANTLR также полезен для большого класса языковых приложений, но использует подход «сверху вниз», генерирующий парсеры рекурсивного спуска, называемые LL (*), которые допускают семантические предикаты.Я приведу здесь без доказательств, что предикаты позволяют вам анализировать контекстно-зависимые языки за пределами CFG.Программисты любят вставлять действия в грамматику, любят хорошую обработку ошибок и любят одношаговую отладку.Л.Л. хорош во всех трех.LL - это то, что мы делаем вручную, чтобы его было легче понять.Не верьте бессмыслице в Википедии о том, что LR лучше обрабатывает ошибки .Тем не менее, если вы откатываете много назад с ANTLR, ошибки действительно хуже с LL (*) (у PEG есть эта проблема).
Повторный откат.GLR также спекулирует (то есть возвращается), как PEG, ANTLR и любая другая недетерминированная стратегия.В любом недетерминированном состоянии LR GLR «разветвляет» подпарсеры, чтобы опробовать любой жизнеспособный путь.В любом случае, LL имеет хороший контекст для обработки ошибок.Если LR знает, что оно соответствует выражению, LL знает, что это выражение в присваивании или IF
-условие;LR знает, что это может произойти, но не уверен - и эта неопределенность заключается в том, где он получает свою силу.
GLR - O(n^3)
худший случай.packrat / PEG - O(n)
худший случай.ANTLR имеют значение O(n^2)
из-за циклического прогнозируемого DFA, но на практике O(n)
.На самом деле не имеет значения.GLR достаточно быстр.
ANTLR это AN прочее T ool для L ang R признание не анти-LR, но оно мне тоже нравится;)
Честно говоря, как и многие молодые программисты в 80-х, я не понимал LALR и не любил черные ящики (теперь я копаюкрасота двигателя GLR но все же предпочитаю LL).Я создал коммерческий компилятор на основе LL (k) и решил создать инструмент для генерации того, что я создал вручную.ANTLR не для всех, и такие крайние случаи, как C ++, могли бы быть лучше обработаны с помощью GLR, но многие люди находят, что ANTLR вписывается в их зону комфорта.С января 2008 года было загружено 134 000 бинарных файлов ANTLR в пределах ANTLRWorks и общее количество почтовых индексов (согласно Google Analytics).См. нашу статью на LL (*) с большим количеством эмпирических данных.