LR-анализатор
LR-анализатор
LR-анализатором расширенной грамматики называется таблица Action/GOTO, в которой строки соответствуют состояниям какого-то ДКА , построенного по грамматике , столбцы символам из
ACTION GOTO Состояние Множество действий ACTION может быть 4 видов:
- - допуск
- - перенос ( - название состояния в соответсвующем LR(0)-автомате, по которому строится анализатор)
- - свертка (по правилу с номером )
- - ошибка анализа с номером (опционально)
В столбцах нетерминалов GOTO стоят состояния автомата
Вид автомата зависит от вида анализатора, который требуется построить
Link to originalТакже так могут называть автомат с магазинной памятью, который работает по правилам, опирающимся на таблицу анализатора
Бесконфликтный LR-анализатор
LR-анализатор называется бесконфликтным, если в каждой его ячейке action не более одного действия
Возможны 2 вида конфликтов
Link to original
LR-анализатор будет бесконфликтным, если он построен по LR(0)-грамматике
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)-грамматика)
Заполнение столбцов ACTION
- Занумеровать правила грамматики от одного до
- В строке, соответствующей состоянию в столбце заносим допуск
- В строках, соответствующих состоянию автомата , кроме заполненной ранее (состояние ), в каждом столбце (включая ) заносим свертку ( ),
- В строках , соответствующих состояниям, не заполненным ранее, для заносим перенос , если
Заполнение столбцов 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 | допуск |
Восстановленный вывод:
Вычеркиваем лишнее:
Окончательный восстановленный вывод:
Восстановленное дерево вывода:
