Изменения

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

Алгоритм Эрли

528 байт добавлено, 09:14, 18 января 2012
Полезное свойство списка разбора. Скоро будет алгоритм Эрли.
{{Определение
|definition =
'''<tex>j</tex>-м '''списком ситуаций''' <tex>I_j</tex> для входной цепочки <tex>\omega = a_1 a_2 ... a_n</tex>, где <tex>0 \leqslant j \leqslant n</tex>, называется множество ситуаций <tex>\lbrace [A \rightarrow \alpha \cdot \beta , i] \mid \alpha \Rightarrow^* a_{i+1} ... a_j; \exists \gamma, \delta : S \Rightarrow^* \gamma A \delta, \gamma \Rightarrow^* a_1...a_i \rbrace</tex>. То есть <tex>\gamma \alpha </tex> выводит часть <tex>\omega</tex> c первого по <tex>j</tex>-й символ.}} {{Лемма|statement = <tex>(\exists \alpha : [S \rightarrow \alpha \cdot, 0] \in I_n) \Leftrightarrow \omega \in L(G)</tex>.|proof = Поскольку <tex>S \Rightarrow^* \gamma S \delta</tex> (при <tex>\gamma = \delta = \varepsilon</tex>), из определения <tex>I_n</tex> получаем, что <tex>([S \rightarrow \alpha \cdot, 0] \in I_n) \Leftrightarrow (S \Rightarrow \alpha \Rightarrow^* a_1 ... a_n = \omega)</tex>.
}}
==Алгоритм Эрли==
Добавим вспомогательный нетерминал <tex>S'</tex> и правило <tex>S' \rightarrow S</tex>.<br>
Построим список разбора для <tex>\omega</tex>.<br>
'''Инициализация.<br/>Добавим новый стартовый вспомогательный нетерминал <tex>S'</tex> и правило <tex>S' \rightarrow S</tex>.<br>
Добавим в <tex>I_0</tex> ситуацию <tex>[S' \rightarrow \cdot S, 0]</tex><br>
'''ПродолжениеПостроение <tex>I_j</tex> по <tex>I_0,...,I_{j-1}</tex>.<br/>
Пока в <tex>I_j</tex> можно добавить новые ситуации повторяем шаги 1—3.<br>
<i>Шаг 1.</i> Для каждой ситуации <tex>[B \rightarrow \alpha \cdot a_{j} \beta, i] \in I_{j-1}</tex>, где <tex>a_j</tex> — j-й символ в <tex>\omega</tex>, включить <tex>[B \rightarrow \alpha a_{j} \cdot \beta, i] </tex> в <tex>I_j</tex>.<br>

Навигация