Парсер GLR - GLR parser

А Парсер GLR (GLR означает «обобщенный LR», где L означает «слева направо», а R означает «крайний правый (вывод)») является расширением Парсер LR алгоритм обработки недетерминированный и неоднозначные грамматики.[1] Теоретическая основа была представлена ​​в статье 1974 г.[2] от Бернарда Лэнга (вместе с другими общими контекстно-свободными парсерами, такими как GLL). Он описывает систематический способ создания таких алгоритмов и предоставляет единообразные результаты в отношении доказательств правильности, сложности в отношении классов грамматики и методов оптимизации. Первая реальная реализация GLR была описана в статье 1984 г. Масару Томита, его также называют «параллельным синтаксическим анализатором». Томита представил пять этапов в своей оригинальной работе,[3] хотя на практике это второй этап, который распознается как парсер GLR.

Хотя алгоритм эволюционировал с момента его первоначальной формы, принципы остались неизменными. Как показано в более ранней публикации,[4] Лэнга в первую очередь интересовали более простые в использовании и более гибкие парсеры для расширяемое программирование языков. Целью Томиты было разобрать естественный язык текст тщательно и качественно. Стандарт Парсеры LR не может вместить недетерминированный и неоднозначный характер естественный язык, а алгоритм GLR может.

Алгоритм

Вкратце, алгоритм GLR работает аналогично алгоритму Парсер LR алгоритма, за исключением того, что, учитывая конкретную грамматику, синтаксический анализатор GLR будет обрабатывать все возможные интерпретации данного ввода в поиск в ширину. На интерфейсе GLR генератор парсеров преобразует входную грамматику в таблицы парсера аналогично генератору LR. Однако если таблицы синтаксического анализа LR допускают только один переход состояния (учитывая состояние и входной токен), таблицы синтаксического анализа GLR допускают несколько переходов. Фактически, GLR позволяет сдвигать / уменьшать и уменьшать / уменьшать конфликты.

Когда встречается конфликтующий переход, стек синтаксического анализа разделяется на два или более параллельных стека синтаксического анализа, где состояние, соответствующее каждому возможному переходу, находится наверху. Затем считывается следующий входной токен и используется для определения следующего перехода (переходов) для каждого из «верхних» состояний - и может произойти дальнейшее разветвление. Если какое-либо заданное верхнее состояние и входной токен не приводят хотя бы к одному переходу, тогда этот «путь» через таблицы синтаксического анализа недействителен и может быть отброшен.

Критическая оптимизация позволяет использовать общие префиксы и суффиксы этих стеков, что ограничивает общий пространство поиска и использование памяти, необходимое для анализа вводимого текста. Сложные структуры, возникающие в результате этого улучшения, делают поисковый граф ориентированный ациклический граф (с дополнительными ограничениями на «глубины» различных узлов), а не дерево.

Преимущества

Распознавание с использованием алгоритма GLR имеет ту же временную сложность наихудшего случая, что и CYK алгоритм и Алгоритм Эрли: О(п3).[нужна цитата ] Однако у GLR есть два дополнительных преимущества:

  • Время, необходимое для запуска алгоритма, пропорционально степени недетерминизма в грамматике: на детерминированных грамматиках алгоритм GLR работает в О(п) время (это не относится к Эрли[нужна цитата ] и алгоритмы CYK, но оригинальные алгоритмы Эрли могут быть изменены для обеспечения этого)
  • Алгоритм GLR является «интерактивным», то есть потребляет входные токены в определенном порядке и выполняет как можно больше работы после использования каждого токена.

На практике грамматики большинства языков программирования являются детерминированными или «почти детерминированными», что означает, что любой недетерминизм обычно разрешается с помощью небольшого (хотя, возможно, неограниченного) количества токенов.[нужна цитата ]. По сравнению с другими алгоритмами, способными обрабатывать полный класс контекстно-свободных грамматик (например, Earley или CYK), алгоритм GLR дает лучшую производительность на этих «почти детерминированных» грамматиках, потому что только один стек будет активен в течение большей части процесс разбора.

GLR можно комбинировать с LALR (1) алгоритм в гибридном синтаксическом анализаторе, обеспечивающий еще более высокую производительность.[5]

Смотрите также

Рекомендации

  1. ^ Масару Томита (6 декабря 2012 г.). Обобщенный анализ LR. Springer Science & Business Media. ISBN  978-1-4615-4034-2.
  2. ^ Ланг, Бернард (1974). Loeckx, J. (ред.). «Детерминированные методы для эффективных недетерминированных парсеров». Автоматы, языки и программирование, 2-й коллоквиум. Конспект лекций по информатике. Саарбрюккен: Springer. 14: 255–269. Дои:10.1007/3-540-06841-4_65. ISBN  978-3-540-06841-9. ISSN  0302-9743.
  3. ^ Масару Томита. Эффективный синтаксический анализ естественного языка. Kluwer Academic Publishers, Бостон, 1986.
  4. ^ Ланг, Бернард (декабрь 1971 г.). «Параллельный недетерминированный восходящий анализ». Уведомления ACM SIGPLAN. Материалы международного симпозиума по расширяемым языкам. 6 (12): 56–57. Дои:10.1145/942582.807982.
  5. ^ "Elkhound, Elsa и Cqual ++: статический анализ с открытым исходным кодом для C ++".

дальнейшее чтение

  • Грун, Дик; Джейкобс, Сериэль Дж. Х (2008). Методы синтаксического анализа. Springer Science + Business Media. ISBN  978-0-387-20248-8.
  • Томита, Масару (1984). «Парсеры LR для естественных языков». COLING. 10-я Международная конференция по компьютерной лингвистике. С. 354–357.
  • Томита, Масару (1985). «Эффективный контекстно-свободный алгоритм синтаксического анализа для естественных языков». IJCAI. Международная совместная конференция по искусственному интеллекту. С. 756–764.