Изменения

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

Удаление eps-правил из грамматики

308 байт убрано, 00:33, 29 октября 2010
Нет описания правки
|definition = Правила вида <tex>A \to \varepsilon</tex> называются <tex>\varepsilon</tex>-правилами.
}}
{{ОпределениеПо данной произвольной |definition = Назовем КС-грамматике грамматику <tex>G=(N,\Sigma, P, S)</tex> можно построить новую КС-грамматику <tex>G_1</tex> грамматикой без <tex>\varepsilon</tex>-правил(или неукорачивающей), эквивалентную исходной без терминала если либо<texbr/>\varepsilon:(1) </tex>. P<br /tex>То есть, язык порождаемый грамматикой не содержит <tex>G: L(G)=L(G_1) - \{\varepsilon\}</tex>. ----Перед представлением алгоритма преобразованияправил, рассмотрим несколько примеров.либо  ----1. C :(2) есть точно одно <tex>\varepsilon</tex>-правилами: (Здесь и далее правило <tex>a, b, c, .. -S \to \varepsilon</tex> терминалы; и <tex>A, B, C, .. -S</tex> нетерминалы; не встречается в правых частях остальных правил из <tex>z, y, x .. -P</tex> произвольные строки из теминалов и нетеминалов).}}По данной произвольной КС-грамматике <tex>B \to zAzG</tex> часто бывает удобно строить новую КС-грамматику <tex>A \to a \mid \varepsilonG'</tex> Без без <tex>\varepsilon</tex>-правил:, эквивалентную исходной.==Алгоритм удаления &epsilon;-правил==:''Вход''. КС-грамматика <tex>B G=(N,\to zAz \mid zzSigma, P, S)</tex>. :''Выход''. Эквивалентная КС-грамматика <tex>A G'=(N',\to aSigma, P', S') </tex> ----2. Более интересный пример - без <tex>\varepsilon</tex>-порождающий терминал <tex>A</tex> встречается в продукции несколько разправил.:''Метод''.  (1) Построить <tex>B N_e=\to AzA{A \mid A \in N</tex> и <tex>A \to a Rightarrow_{G}^{*}\mid varepsilon\varepsilon}</tex>. Если удаляется (2) Построить <tex>\varepsilonP'</tex>-правило так: (a) Если <tex>A \to rightarrow \alpha_0 B_1 \alpha_1 B_2 \alpha_2 ... B_k \alpha_k \in P, k \varepsilongeqslant 0</tex>, то каждую продукцию ,содержащую и <tex>AB_i \in N_e</tex> справа, следует заменить на для <tex>2^1 \leqslant i \leqslant k</tex> продукций, где но ни один символ в цепочках <tex>a_j (1 \leqslant j \leqslant k) \notin N_e</tex> - число встреченных , то включить в продукции <tex>AP'</tex>, так как каждое такое все правила вида <tex>A\rightarrow \alpha_0 X_1 \alpha_1 X_2 \alpha_2 ... X_k \alpha_k</tex> может находиться в 2ух состояниях - есть оно в продукции или же нет. Да, из этих где <tex>2^kX_i-</tex> продукций могут быть повторения, нужно попытаться найти их и удалить лишние. Итого, получаем грамматику без либо <tex>\varepsilonB_i</tex>-правил: , либо <tex>B \to AzA \mid zA \mid Az \mid zvarepsilon</tex> , но не включать правило <tex>A \to arightarrow \varepsilon</tex>(это могло бы произойти ----Итак в случае, приходим к следующему <big>'''алгоритму удаления если все <tex>\varepsilonalpha_i</tex>-правил'''</big>: # Пока есть равны <tex>\varepsilon</tex>-правило). (Обозначим его за 3) Если <tex>A S \to \varepsilonin N_e</tex>), включить в <tex>P'<br /tex> Если правила <tex>AS' \rightarrow \varepsilon \mid S</tex> - стартовое состояние - ничего не делаем и переходим к пункту 1.# Удалить его# Каждую продукцию ,содержащую справа где <tex>AS'-</tex> заменяем на новый символ, и положить <tex>2^kN'=N \cup \{ S' \}</tex> продукций, как в примере 2. Переход к пункту 1.В противном случае ----Заметим, что на 3ем пункте мы можем породить еще одно положить <tex>\varepsilonN'=N</tex>-правило, например: и <tex>B \to AS'=S</tex>.  (4) Положить <tex>A G'=(N',\to \varepsilonSigma, P', S')</tex> Получим: . <tex>B \to A \mid \varepsilonBox</tex> == Ссылки Литература ==[http://eli* Ахо Альфред, Джеффри Ульман. Теория Синтаксического Анализа, Перевода и Компиляции. Том 1.* Джон Хопкрофт, Раджив Мотвани, Джеффри Ульман.thegreenplaceВведение в теорию автоматов, языков и вычислений.net/2010/02/08/removing-epsilon-productions-from-context-free-grammars/ Реализация алгоритма на Python]
Анонимный участник

Навигация