SLR(1) - анализатор. SLR(1)-грамматика
Пусть грамматика не является LR(0)-грамматикой. Применим к ней алгоритм построения LR(0)-анализатора. Полученный LR-анализатор будет конфликтным
Есть модификация этого алгоритма, которая позволяет даже по не LR(0)-грамматике построить бесконфликтный LR-анализатор для определенного класса грамматик
Алгоритм построения SLR(1)-анализатора
SLR(1)-анализатор
LR-анализатор, построенный применением алгоритма построения SLR(1)-анализатора
Link to original
Алгоритм. Построение SLR(1)-анализатора
Модификация алгоритма, обеспечивающая построение бесконфликтного LR-анализатора для более широкого, чем LR(0) класса грамматик
Вход
Выход
Алгоритм
Заполнение столбцов ACTION
- Занумеровать правила грамматики от одного до
- Построить LR(0)-автомат по входной грамматике
- Построить множества FOLLOW (можно воспользоваться алгоритмом построение множества FOLLOW)
- В строке, соответствующей состоянию в столбце заносим допуск
- В каждой строке (состояние автомата), не заполненной в 3):
Заполнение столбцов GOTO
В каждой строке для каждого пункта в столбец заносим состояние
Link to original
SLR(1)-грамматика
Расширенная грамматика, такая что построенный по ней SLR(1)-анализатор является бесконфликтным
Пусть:
- - контекстно-свободная грамматика
- - расширенная грамматика, соответствующая
- - SLR(1)-анализатор, построенный по грамматике
Тогда:
называется SLR(1)-грамматикой, если является бесконфликтным
Link to original
Комментарий про вложенность классов LR(0) и SLR(1) грамматик
Всякая LR(0)-грамматика является SLR(1)-грамматикой
Пример построения SLR(1)-анализатора
Возьмем грамматику
Построим по ней LR(0)-автомат:

В силу вида состояния грамматика не является LR(0)-грамматикой
Строим множества FIRST и далее FOLLOW (для нетерминалов)

По алгоритму выше составляем SLR(1)-анализатор

Утверждение. Достаточное условие бесконфликтности SLR(1)-анализатора
Если в LR(0)-автомате, построенном по расширенной грамматике для каждого состояния с пунктами вида и множества FOLLOW и FOLLOW не пересекаются, то SLR(1)-анализатор построенный по такой грамматике не будет иметь конфликтов типа свертка-свертка
Link to original
LR(1)-автомат. LR(1)-анализатор, LR(1)-грамматика
LR(1)-пункт
LR(1)-пунктом расширенной грамматики называется набор , где:
- - правило вывода грамматики
Обозначается как
Link to original
Ядро LR(1)-пункта
Для LR(1)-пункта его ядром называется LR(0)-пункт
Link to original
Допустимый для активного префикса LR(1)-пункт
В расширенной грамматике её LR(1)-пункт допустим для активного префикса некоторой r-формы , если существует правосторонний вывод
и цепочка начинается с символа
Link to original
Комментарий: В процессе анализа после переноса в стек во входном потоке будет , поскольку – необработанная часть цепочки
Автомат LR(1)-пунктов
Определяется по аналогии с автоматом LR(0)-пунктов
Автоматом LR(1)-пунктов расширенной грамматики называется неполный эпсилон-НКА , где
- — множество LR(1)-пунктов грамматики
Функция переходов задается следующим образом:
Где - множество FIRST от цепочки
Link to originalПолагать, что
Комментарий: В процессе построения переходов такого автомата появляются только допустимые LR(1)-пункты
LR(1)-автомат
Определяется по аналогии с LR(0)-автоматом
эпсилон-замыкание автомата LR(1)-пунктов
Link to original
Комментарий: Возможно (и проще) построить LR(1)-автомат сразу, не прибегая к построению автомата LR(1)-пунктов
Пример построения LR(1)-автомата
Построим LR(1)-автомат по расширенной грамматике
По определению автомата потребуется множество FIRST. Найдем его, воспользовавшись, например, алгоритмом:

LR(1)-автомат автомат тогда будет выглядеть следующим образом

LR(1)-анализатор. Алгоритм построения LR(1)-анализатора
LR(1)-анализатор
LR-анализатор, построенный по алгоритму построения LR(1)-анализатора
Link to original
Алгоритм. Построение LR(1)-анализатора
Вход
Выход
Алгоритм
Подготовка
Построим LR(1)-автомат по входной грамматике
Заполнение таблицы ACTION
- Занумеровать правила грамматики от 1 до
- В строке состояния в столбце заносим допуск
- В строках состояний (кроме ) в столбце заносим свертку (), где
- В строках , не заполненных ранее, для каждого : Если есть пункт , то в столбце заносим перенос
Заполнение таблицы GOTO
В каждой строке для каждого :
Link to original
- Если существует пункт , то в столбце заносим состояние ,
LR(1)-грамматика
Расширенная грамматика называется LR(1)-грамматикой, если LR(1)-анализатор, построенный по этой грамматике не содержит конфликтов
Link to original
Пример построения LR(1)-анализатора
Построим LR(1)-анализатор по рассмотренной ранее грамматике

По определению рассмотренная грамматика является LR(1)-грамматикой