Изменения

Перейти к: навигация, поиск

LR(0)-разбор

1002 байта убрано, 12:27, 3 сентября 2015
Автомат
Таким образом, мы определяем новые состояния, в которое автомат перейдет после переноса того или иного терминала или нетерминала.
Заметим, что хранить в каждом состоянии только по одной ситуации не имеет смысла, поэтому пусть в каждое стостояние будет представлять множество ситуаций, а переходы {{---}} термилалы и нетермилалы. Для этого определим базовые ==== Базовые операции <tex>closure (I)</tex> и <tex>goto (I, X)</tex>, где <tex>I</tex> – множество ситуаций, <tex>X</tex> – символ грамматики (терминал или нетерминал). Операция <tex>closure</tex> добавляет ситуации к множеству ситуаций, у которых точка стоит слева от нетерминала. Добавляются те ситуации, которые получаются из правил, в левой части которого находится этот нетерминал.====
Заметим, что хранить в каждом состоянии только по одной ситуации не имеет смысла, поэтому пусть в каждое стостояние будет представлять множество ситуаций, а переходы {| border="0" |align="left" colspan="4"|{---}} термилалы и нетермилалы. Для этого определим базовые операции <font size=2tex> [] '''closure''' (I) '''do''' '''for''' каждой ситуации [A </tex>\toи </tex> w.Xv] из goto (I '''for''' каждого правила грамматики , X )</tex>\to, где </tex> u I += [X </tex>\to{{---}} множество ситуаций, </tex> .u] X<font color=green> // Операция += добавляет элемент к множеству </fonttex> '''while''' I изменилось '''return''' I </font>|{{---}}символ грамматики (терминал или нетерминал).
* Операция <tex>goto</tex> "переносит" точку после символа <tex>Xclosure</tex>добавляет ситуации к множеству ситуаций, у которых точка стоит слева от нетерминала. Это означает переход Добавляются те ситуации, которые получаются из одного состояния правил, в другое под воздействием символа <tex>X</tex>левой части которого находится этот нетерминал.
{| border="0" |align="left" colspan="4"|* Операция <font size=2tex> [] '''goto''' (I, X) J={} <font color=green> // {} обозначает пустое множество </fonttex> '''for''' каждой ситуации [A "переносит" точку после символа <tex>\toX</tex> w.Xv] Это означает переход из I J += [A одного состояния в другое под воздействием символа <tex> \to X</tex>wX.v] '''return''' closure (J)</font>|}
==== Построение автомата ==== Теперь обсудим алгоритм построения конечного автомата. Обозначим <tex>T</tex> множество состояний, <tex>E</tex> {{---}} множество переходов. {| border="0" |align="left" colspan="4"|<font size=2> E, T '''build'''() E = {} T = {closure ([S' # Изначальное состояние содержит одно правило: <tex>E_0 \toE</tex> .S])}, '''do''' '''for''' каждого # Для текущего состояния I из T '''for''' каждой ситуации [A делаем операцию <tex>\toclosure</tex> w.Xv] из I, J = goto(I# По всем возможный символам для каждой ситуации добавляем переходы, X) T += {J} используя операцию <font color=greentex> // ко множеству состояний добавляется новое состояние goto</fonttex>, E += (I # Если множество <tex>\toT</tex> J) или <font color=greentex> // ко множеству ребер добавляется ребро, идущее из состояния I в состояние J. Этот переход осуществляется по символу X E</fonttex> '''while''' E во втором или T изменились '''return''' Eтретьем пункте изменилось, T</font>|}возвращаемся ко второму шагу.
=== Управляющая таблица ===
297
правок

Навигация