Генератор парсера LALR - LALR parser generator
Эта статья нужны дополнительные цитаты для проверка.Август 2011 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
А генератор синтаксического анализатора lookahead слева направо (LALR) это программный инструмент, который читает Грамматика BNF и создает Парсер LALR который способен анализировать файлы, написанные в компьютерный язык определяется грамматикой BNF. Парсеры LALR желательны, потому что они очень быстрые и маленькие по сравнению с другими типами парсеров.
Есть и другие виды генераторы парсеров, Такие как Простой парсер LR, Парсер LR, Парсер GLR, LL парсер и Парсер GLL генераторы. Что отличает один от другого, так это тип грамматики BNF, которую они способны принять, и тип алгоритма синтаксического анализа, который используется в сгенерированном синтаксическом анализаторе. Генератор парсера LALR принимает грамматику LALR в качестве входных данных и генерирует парсер, который использует алгоритм анализа LALR (который управляется таблицами парсера LALR).
На практике LALR предлагает хорошее решение, потому что грамматики LALR (1) более мощные, чем SLR (1), и могут анализировать большинство практичных грамматик LL (1). Грамматики LR (1) более мощные, чем LALR (1), но канонические синтаксические анализаторы LR (1) могут быть чрезвычайно большими по размеру и считаются непрактичными. Минимальные парсеры LR (1) имеют небольшой размер и сопоставимы с парсерами LALR (1).
История
Франк Де Ремер изобрел парсеры LALR в своей докторской диссертации под названием «Практические переводчики LR (k)» в 1969 году в Массачусетском технологическом институте. Это был важный прорыв, потому что трансляторы LR (k), по определению Дональд Кнут в его статье 1965 года «О переводе языков слева направо» были слишком велики для реализации в компьютерных системах 1960-х и 1970-х годов.
Первым генератором парсера LALR и, вероятно, самым популярным за многие годы был "yacc "(Еще один компилятор компилятора), созданный Стивен Джонсон в 1975 году в AT&T Labs.[1] Другой, «TWS», был создан Фрэнком Де Ремером и Томом Пеннелло. Сегодня доступно множество генераторов парсеров LALR, многие из которых вдохновлены оригинальным Yacc и в значительной степени совместимы с ним, например GNU bison, игра слов на оригинальном Yacc /Як. Видеть Сравнение детерминированных генераторов парсеров контекстно-свободных языков для более подробного списка.
Обзор
Парсер LALR и его альтернативы, парсер SLR и Канонический парсер LR, имеют похожие методы и таблицы синтаксического анализа; их главное отличие заключается в алгоритме анализа математической грамматики, используемом инструментом генерации синтаксического анализатора. Генераторы LALR принимают больше грамматик, чем генераторы SLR, но меньше грамматик, чем полные LR (1). Полный LR включает в себя гораздо большие таблицы синтаксического анализа, и его следует избегать, если это явно не требуется для определенного компьютерного языка. Реальные компьютерные языки часто можно выразить как грамматики LALR (1). В тех случаях, когда это невозможно, обычно достаточно грамматики LALR (2). Если генератор синтаксического анализатора допускает только грамматики LALR (1), синтаксический анализатор обычно вызывает некоторый рукописный код всякий раз, когда он встречает конструкции, требующие расширенного просмотра вперед.
Подобно Парсер SLR и генератор синтаксического анализатора Canonical LR, генератор синтаксического анализатора LALR сначала создает конечный автомат LR (0), а затем вычисляет опережающие наборы для всех правил грамматики, проверяя неоднозначность. Канонический LR создает полные наборы опережающих просмотров. LALR использует наборы слияния, то есть сливает наборы предвидения, в которых ядро LR (0) одинаково. SLR использует СЛЕДИТЬ наборы как наборы предвидения, которые связывают правую часть ядра LR (0) с терминалом предвидения. Это большее упрощение, чем в случае LALR, поскольку многие конфликты могут возникать из-за того, что ядра LR (0) совместно используют одну и ту же правую часть и опережающий терминал, конфликты, которых нет в LALR. Вот почему у SLR меньше возможностей распознавания языка, чем у LALR, причем Canonical LR сильнее, чем у обоих, поскольку он не включает никаких упрощений.
Смотрите также
- Сравнение генераторов парсеров - для более полного списка, который также включает генераторы парсеров LL, SLR, GLR и LR.
Рекомендации
- ^ Стивен С. Джонсон (1975). «Yacc: еще один компилятор-компилятор». AT&T Bell Laboratories.
- Альфред В. Ахо, Рави Сетхи и Джеффри Д. Уллман. Компиляторы: принципы, методы и инструменты Эддисон-Уэсли, 1986 г. (также известный как Книга Дракона описывает традиционные методы построения парсеров LALR (1).)
- Ричард Борнат Понимание и написание компиляторов, Macmillan, 1979. (Описывает принципы автоматического анализа слева направо и способы построения таблиц синтаксического анализатора, что такое следующий набор и т. Д., на английском, а не по математике - свободно доступно со страницы автора по адресу [1].)
дальнейшее чтение
- Кнут, Д. Э. (Июль 1965 г.). «О переводе языков слева направо» (PDF). Информация и контроль. 8 (6): 607–639. Дои:10.1016 / S0019-9958 (65) 90426-2. Архивировано из оригинал (PDF) 15 марта 2012 г.. Получено 29 мая 2011.CS1 maint: ref = harv (связь)
- Де Ремер, Франклин Л. (1969). Практические переводчики языков LR (k) (PDF) (Кандидат наук.). Массачусетский технологический институт. Архивировано из оригинал (PDF) на 2013-08-19. Получено 2013-08-19.CS1 maint: ref = harv (связь)
- Эффективное вычисление LALR (1) Look-Ahead Sets, DeRemer and Pennello, TOPLAS (1982)