LR(0)-разбор

Материал из Викиконспекты
Версия от 11:59, 21 августа 2015; Margarita (обсуждение | вклад) (Управляющая таблица)
Перейти к: навигация, поиск

LR(0)-разбор означает, что разборщик для принятия решения не смотрит на символы строки, а смотрит только на состояние стека и определяет переходы по нему.

LR(0)-Разбор

Иллюстрация алгоритма

Заметим, что LR(0)-анализатор принимает решение о своих действиях только на основании содержимого магазина, не учитывая символы входной цепочки. Для иллюстрации построения таблиц LR(0)-анализатора мы будем использовать грамматику:

EE+TETTnT(E)

Для начала переходим к Пополненной грамматике:

E0EEE+TETTnT(E)

Определение:
Пусть Γ=Σ,N,S,P — КС-грамматика и Aw1w2P. Композицию [Aw1w2,u], где uΣk, назовем LR(k)-ситуацией (англ. LR(k)-item)

LR(0)-ситуации не должны содержать терминальной цепочки, так как k=0, то есть мы можем записывать их следующим образом: [Aw1w2]

Построение автомата

В начале работы магазин пуст, и указатель входной цепочки находится перед ее первым символом. Этому состоянию соответствует ситуация [E0E]. Для терминалов или нетерминалой, мы строим переходы к другим ситуациям по следующей схеме:

[Aαcβ]c[Aαcβ]

[AαBβ]B[AαBβ]

[AαBβ]ε[Bγ]

Получаем следующий НКА:

Eps-dfa.png

Избавимся от ε-переходов и получим ДКА:

LRk dfa.png

Управляющая таблица

Теперь можно построить управляющую таблицу. Поступим следующим образом:

1. для каждого ребра IXJ мы поместим в позицию [I,X] таблицы

  • s J (сокр. от shift) , если X — терминал,
  • J, если X — нетерминал.

2. для состояния, содержащего ситуацию [Aw], поместим r(n) (сокр. от reduce) в позицию [I,Y] для каждого терминала Y, где n — это номер правила в изначальной грамматике.

3. пустая ячейка означает ошибочную ситуацию.

Вспомним грамматику и пронумеруем правила для 2 пункта:

(0) E0E(1) EE+T(2) ET(3) Tn(4) T(E)

Управляющая таблица будет выглядеть так:

E T n + ( ) $
0 1 2 s3 s4
1 s5 r(0)
2 r(2) r(2) r(2)
3 r(3) r(3) r(3)
4 6 2 s3 s4
5 7 s3 s4
6 s5 s8
7 r(1) r(1) r(1)
8 r(4) r(4) r(4)

Формальное описание

Базовые операции

Теперь опишем алгоритм формально.

Для построения множества состояний определим базовые операции closure(I) и goto(I,X), где I – множество ситуаций, X – символ грамматики (терминал или нетерминал). Операция closure добавляет ситуации к множеству ситуаций, у которых точка стоит слева от нетерминала. Добавляются те ситуации, которые получаются из правил, в левой части которого находится этот нетерминал.

 [] closure (I) 
     do 
         for каждой ситуации [A  w.Xv] из I 
             for  каждого правила грамматики X  u
                  I += [X  .u]  // Операция += добавляет элемент к множеству 
     while I изменилось
     return I     


Операция goto "переносит" точку после символа X. Это означает переход из одного состояния в другое под воздействием символа X.

 [] goto (I, X) 
     J={}   // {} обозначает пустое множество 
     for каждой ситуации [A  w.Xv] из I
         J += [A wX.v]
     return closure (J)

Алгоритм построения конечного автомата

Теперь обсудим алгоритм построения анализатора. Обозначим T множество состояний, E – множество переходов.

 E, T build()
   E = {}    
   T = {closure ([S'  .S])}
   do 
       for каждого состояния I из T 
           for каждой ситуации [A  w.Xv] из I
               J = goto(I, X)
               T += {J}       // ко множеству состояний добавляется новое состояние 
               E += (I  J)  // ко множеству ребер добавляется ребро, идущее из состояния I в состояние J. Этот переход осуществляется по символу X 
   while E или T изменились 
   return E, T

Поскольку для символа $ операция goto(I,$) не определена , мы выполняем действие accept.

Пример LR(0)-разбора

Пример будет для строки (n1+n2)+n3

Строка Стек s=top() a=w[ip] action[s,a] Комментарий
(n1+n2)+n3$ 0 0 ( shift 4 Перенос "("
n1+n2)+n3$ 0 (4 4 n1 shift 3 Перенос "n1"
+n2)+n3$ 0 (4 n13 3 + reduce 3 Свертка: Tn
+n2)+n3$ 0 (4 T2 2 + reduce 2 Свертка: ET
+n2)+n3$ 0 (4 E6 6 + shift 5 Перенос "+"
n2)+n3$ 0 (4 E6 +5 5 n2 shift 3 Перенос "n2"
)+n3$ 0 (4 E6 +5 n23 3 ) reduce 3 Свертка: Tn
)+n3$ 0 (4 E6 +5 T7 7 ) reduce 1 Свертка: EE+T
)+n3$ 0 (4 E6 6 ) shift 8 Перенос ")"
+n3$ 0 (4 E6 )8 8 + reduce 4 Свертка: T(E)
+n3$ 0 T2 2 + reduce 2 Свертка: ET
+n3$ 0 E1 1 + shift 5 Перенос "+"
n3$ 0 E1 +5 5 n3 shift 3 Перенос "n3"
$ 0 E1 +5 n33 3 $ reduce 3 Свертка: Tn
$ 0 E1 +5 T7 7 $ reduce 1 Свертка: EE+T
$ 0 E1 1 $ reduce 0 Допуск

См. также

Источники информации