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) класса грамматик

Вход

Расширенная грамматика

Выход

SLR(1)-анализатор

Алгоритм

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

  1. Занумеровать правила грамматики от одного до
  2. Построить LR(0)-автомат по входной грамматике
  3. Построить множества FOLLOW (можно воспользоваться алгоритмом построение множества FOLLOW)
  4. В строке, соответствующей состоянию в столбце заносим допуск
  5. В каждой строке (состояние автомата), не заполненной в 3):
    • Для каждого пункта в столбцах заносим свертку ( - номер соответствующего правила рассматриваемого пункта )
    • Для каждого пункта в столбце заносим перенос

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

В каждой строке для каждого пункта в столбец заносим состояние

Link to original

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)-пунктов расширенной грамматики называется неполный эпсилон-НКА , где

Функция переходов задается следующим образом:

Где - множество 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)-анализатор

Алгоритм

Подготовка

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

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

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

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

В каждой строке для каждого :

  • Если существует пункт , то в столбце заносим состояние ,
Link to original

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

Расширенная грамматика называется LR(1)-грамматикой, если LR(1)-анализатор, построенный по этой грамматике не содержит конфликтов

Link to original

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

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

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