Удаление eps-правил из грамматики — различия между версиями

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

Версия 00:33, 29 октября 2010

Определение:
Правила вида [math]A \to \varepsilon[/math] называются [math]\varepsilon[/math]-правилами.


Определение:
Назовем КС-грамматику [math]G=(N,\Sigma, P, S)[/math] грамматикой без [math]\varepsilon[/math]-правил (или неукорачивающей), если либо
(1) [math]P[/math] не содержит [math]\varepsilon[/math]-правил, либо
(2) есть точно одно [math]\varepsilon[/math]-правило [math]S \to \varepsilon[/math] и [math]S[/math] не встречается в правых частях остальных правил из [math]P[/math].

По данной произвольной КС-грамматике [math]G[/math] часто бывает удобно строить новую КС-грамматику [math]G'[/math] без [math]\varepsilon[/math]-правил, эквивалентную исходной.

Алгоритм удаления ε-правил

Вход. КС-грамматика [math] G=(N,\Sigma, P, S)[/math].
Выход. Эквивалентная КС-грамматика [math] G'=(N',\Sigma, P', S') [/math] без [math]\varepsilon[/math]-правил.
Метод.
   (1) Построить [math]N_e=\{A \mid A \in N[/math] и [math]A \Rightarrow_{G}^{*}\varepsilon\}[/math].
   (2) Построить [math]P'[/math] так:
       (a) Если [math]A \rightarrow \alpha_0 B_1 \alpha_1 B_2 \alpha_2 ... B_k \alpha_k   \in P, k \geqslant 0[/math] и [math]B_i \in N_e[/math] для [math]1 \leqslant i \leqslant k[/math],
           но ни один символ в цепочках [math]a_j (1 \leqslant j \leqslant k) \notin N_e[/math], то включить в [math]P'[/math] все правила
           вида [math]A \rightarrow \alpha_0 X_1 \alpha_1 X_2 \alpha_2 ... X_k \alpha_k[/math]
           где [math]X_i-[/math] либо [math]B_i[/math], либо [math]\varepsilon[/math], но не включать правило [math]A \rightarrow \varepsilon[/math] (это могло бы произойти 
           в случае, если все [math]\alpha_i[/math] равны [math]\varepsilon[/math]).
    (3) Если [math]S \in N_e[/math], включить в [math]P'[/math] правила
                               [math]S' \rightarrow \varepsilon \mid S[/math]
        где [math]S'-[/math] новый символ, и положить [math]N'=N \cup \{ S' \}[/math]. В противном случае 
        положить [math]N'=N[/math] и [math]S'=S[/math].
    (4) Положить [math] G'=(N',\Sigma, P', S')[/math]. [math]\Box[/math]

Литература

  • Ахо Альфред, Джеффри Ульман. Теория Синтаксического Анализа, Перевода и Компиляции. Том 1.
  • Джон Хопкрофт, Раджив Мотвани, Джеффри Ульман. Введение в теорию автоматов, языков и вычислений.