WikiSort.ru - Не сортированное

ПОИСК ПО САЙТУ | о проекте

SLR(1) — восходящий алгоритм синтаксического разбора.

Представляет собой расширение алгоритма LR(0). В ряде случаев работает тогда, когда построение LR(0) таблицы разбора для данной грамматики невозможно из-за конфликтов сдвиг-приведение или приведение-приведение. Таким образом, класс грамматик, разбираемых по SLR(1) (кр. «SLR(1)-грамматик») шире, чем класс LR(0)-грамматик.

Алгоритм собственно разбора (исполнения анализатора по входному потоку) одинаков и у SLR(1), и у LR(0) — и, шире, у LALR(1). Различаются только алгоритмы построения таблицы разбора по грамматике в процессе генерации анализатора.

Описание

Для каждого нетерминала A в грамматике генерируется множество терминалов First(A), определенное следующим образом:

  • если в грамматике есть правило с A в левой части и правой частью, начинающейся с терминала, то данный терминал входит в First(A)
  • если в грамматике есть правило с A в левой части и правой частью, начинающейся с нетерминала (обозначим B), то First(B) строго входит в First(A)
  • никакие иные терминалы не входят в First(A)

Эти же множества используются для построения анализатора LL(1).

Далее на основе множеств First(A) генерируются множества Follow(A), определенные следующим образом

  • если в грамматике есть правило, где встречается A не на последней позиции, и за ним следует терминал, то терминал входит в Follow(A).
  • если в грамматике есть правило, где встречается A не на последней позиции, и за ним следует нетерминал (обозначим B), то First(B) строго входит в Follow(A)
  • если в грамматике есть правило, где встречается A на последней позиции, то Follow(C) строго входит в Follow(A), где C — левая часть правила.
  • никакие иные терминалы не входят в Follow(A)

(возможно обобщение этих условий для случая наличия правил B -> null)

Далее производится генерация таблицы разбора, как для LR(0), с отличием при занесении действий приведения. Приведение для состояния S и входного символа C заносится в таблицу только тогда, когда в S есть цепочка, соответствующая целой правой части правила, и нетерминал N из левой части правила удовлетворяет условию «C входит в Follow(N)».

Это приводит к тому, что для SLR(1) совершается меньше попыток поставить «приведение» в клеточку таблицы разбора, что уменьшает риск возникновения конфликтов с приведениями, иногда вовсе избавляет от них и делает грамматику, не разбираемую по LR(0), разбираемой.

Практическое применение

Почти не имеет (кроме учебного) из-за узкого класса разбираемых грамматик. Практическое применение имеет LALR(1), который есть обобщение SLR(1).

Арифметические выражения с унарными и бинарными операциями и скобками разбираются по SLR(1)

См. также

LALR(1)

LR(0)

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

LL(1)

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

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии