Sony Alpha DSLR-A900
- 1 year ago
- 0
- 0
SLR(1) — восходящий алгоритм синтаксического разбора.
Представляет собой расширение алгоритма LR(0) . В ряде случаев работает тогда, когда построение LR(0) таблицы разбора для данной грамматики невозможно из-за конфликтов сдвиг-приведение или приведение-приведение. Таким образом, класс грамматик, разбираемых по SLR(1) (кр. «SLR(1)-грамматик») шире, чем класс LR(0)-грамматик.
Алгоритм собственно разбора (исполнения анализатора по входному потоку) одинаков и у SLR(1), и у LR(0) — и, шире, у LALR(1) . Различаются только алгоритмы построения таблицы разбора по грамматике в процессе генерации анализатора.
Для каждого нетерминала A в грамматике генерируется множество терминалов First(A), определенное следующим образом:
Эти же множества используются для построения анализатора LL(1).
Далее на основе множеств First(A) генерируются множества Follow(A), определенные следующим образом
(возможно обобщение этих условий для случая наличия правил B -> null)
Далее производится генерация таблицы разбора, как для LR(0), с отличием при занесении действий приведения. Приведение для состояния S и входного символа C заносится в таблицу только тогда, когда в S есть цепочка, соответствующая целой правой части правила, и нетерминал N из левой части правила удовлетворяет условию «C входит в Follow(N)».
Это приводит к тому, что для SLR(1) совершается меньше попыток поставить «приведение» в клеточку таблицы разбора, что уменьшает риск возникновения конфликтов с приведениями, иногда вовсе избавляет от них и делает грамматику, не разбираемую по LR(0), разбираемой.
Почти не имеет (кроме учебного) из-за узкого класса разбираемых грамматик. Практическое применение имеет LALR(1), который есть обобщение SLR(1).
Арифметические выражения с унарными и бинарными операциями и скобками разбираются по SLR(1)