297
правок
Изменения
→Автомат
Таким образом, мы определяем новые состояния, в которое автомат перейдет после переноса того или иного терминала или нетерминала.
Заметим, что хранить в каждом состоянии только по одной ситуации не имеет смысла, поэтому пусть в каждое стостояние будет представлять множество ситуаций, а переходы {| 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>левой части которого находится этот нетерминал.
==== Построение автомата ==== Теперь обсудим алгоритм построения конечного автомата. Обозначим <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>|}возвращаемся ко второму шагу.
=== Управляющая таблица ===