LR-анализатор

LR-анализатор

LR-анализатором расширенной грамматики называется таблица Action/GOTO, в которой строки соответствуют состояниям какого-то ДКА , построенного по грамматике , столбцы символам из

ACTIONGOTO
Состояние

Множество действий ACTION может быть 4 видов:

  • - допуск
  • - перенос ( - название состояния в соответсвующем LR(0)-автомате, по которому строится анализатор)
  • - свертка (по правилу с номером )
  • - ошибка анализа с номером (опционально)

В столбцах нетерминалов GOTO стоят состояния автомата

Вид автомата зависит от вида анализатора, который требуется построить

Также так могут называть автомат с магазинной памятью, который работает по правилам, опирающимся на таблицу анализатора

Link to original

Бесконфликтный LR-анализатор

LR-анализатор называется бесконфликтным, если в каждой его ячейке action не более одного действия

Возможны 2 вида конфликтов

Link to original

LR-анализатор будет бесконфликтным, если он построен по LR(0)-грамматике

LR(0)-грамматика

Пусть:

Тогда:

называется LR(0)-грамматикой, если каждое состояние автомата содержащее LR(0)-пункт с точкой на конце (то есть пункты вида ) содержит единственный этот пункт

Link to original

Пример LR(0)-грамматики

Грамматика , рассмотренная ранее является LR(0), так как ее LR(0)-автомат удовлетворяет определению

Алгоритм построения LR(0)-анализатора

LR(0)-анализатор

LR-анализатор построенный по LR(0)-грамматике

Link to original

Алгоритм. Построение LR(0)-анализатора

Вход

LR(0)-грамматика

Выход

LR(0)-анализатор

Алгоритм

Построим LR(0)-автомат по входной грамматике (должны уже были построить для проверки, что входная грамматика LR(0)-грамматика)

Заполнение столбцов ACTION

  1. Занумеровать правила грамматики от одного до
  2. В строке, соответствующей состоянию в столбце заносим допуск
  3. В строках, соответствующих состоянию автомата , кроме заполненной ранее (состояние ), в каждом столбце (включая ) заносим свертку ( ),
  4. В строках , соответствующих состояниям, не заполненным ранее, для заносим перенос , если

Заполнение столбцов GOTO

В каждой строке для заносим состояние , если функция перехода определена

Link to original

Пример построение LR(0)-анализатора

Построим по той же LR(0)-грамматике ее LR(0)-анализатор

LR(0)-автомат грамматики:

Правила грамматики нумеруем в естественном порядке

Сам LR(0)-анализатор: заполняется согласно алгоритму выше

Что можно сказать, глядя на LR-анализатор

  • Пустые ячейки в анализаторе означают, что входная цепочка не соответствует правилам языка
  • В столбцах ACTION можно добавить действия, называемые обработчиками ошибок
  • В столбцах GOTO обращение к пустым ячейкам невозможно

Пример работы анализатора

Рассмотрим анализ цепочки по построенному анализатору

состояние№ тактастекуказательдействие
1Перенос
2Перенос
3свертка по 4 :
4свертка по 3 :
5свертка по 2 :
6Перенос
7свертка по 2 :
8допуск

Восстановленный вывод:

Вычеркиваем лишнее:

Окончательный восстановленный вывод:

Восстановленное дерево вывода: