Удаление eps-правил из грамматики — различия между версиями
м (→Доказательство корректности) |
Kirelagin (обсуждение | вклад) м (→Алгоритм удаления ε-правил из грамматики) |
||
Строка 9: | Строка 9: | ||
== Алгоритм удаления ε-правил из грамматики == | == Алгоритм удаления ε-правил из грамматики == | ||
'''Вход:''' КС грамматика <tex> G=\langle N,\Sigma, P, S \rangle</tex>.<br/> | '''Вход:''' КС грамматика <tex> G=\langle N,\Sigma, P, S \rangle</tex>.<br/> | ||
− | '''Выход:''' КС грамматика <tex> G'=\langle N,\Sigma, P', S \rangle</tex> без <tex>\varepsilon</tex>-правил ( | + | '''Выход:''' КС грамматика <tex> G'=\langle N,\Sigma, P', S \rangle</tex> без <tex>\varepsilon</tex>-правил (может присутствовать правило <tex>S \rightarrow \varepsilon</tex>, но в этом случае <tex>S</tex> не встречается в правых частях правил). <tex>L(G') = L(G)</tex>. |
# Добавить все правила из <tex>P</tex> в <tex>P'</tex>. | # Добавить все правила из <tex>P</tex> в <tex>P'</tex>. |
Версия 23:01, 11 декабря 2011
Содержание
Используемые определения
Определение: |
Правила вида | называются -правилами.
Определение: |
Нетерминал | называется -порождающим, если .
Алгоритм удаления ε-правил из грамматики
Вход: КС грамматика
Выход: КС грамматика без -правил (может присутствовать правило , но в этом случае не встречается в правых частях правил). .
- Добавить все правила из в .
- Найти все . -порождаюшие нетерминалы
- Рассмотрим правила вида (*) , где — последовательности из терминалов и нетерминалов, — -порождающие нетерминалы. Добавить все возможные правила вида (*) в , в которых либо присутствует, либо отсутствует .
- Удалить все -правила из .
- Если в исходной грамматике выводилось пустое слово , то необходимо добавить новый нетерминал , сделать его стартовым, добавить правила .
Доказательство корректности
Теорема: |
Если грамматика была построена с помощью описанного выше алгоритма по грамматике , то . |
Доказательство: |
Сначала докажем, что, если не выполнять шаг 5 алгоритма, то получится грамматика
Ч.т.д. |
Алгоритм поиска ε-порождающих нетерминалов
Вход: КС грамматика
Выход: множество -порождающих нетерминалов.
- Найти все -правила. Составить множество, состоящее из нетерминалов, входящих в левые части таких правил.
- Перебираем правила грамматики . Если найдено правило , для которого верно, что каждый принадлежит множеству, то добавить в множество.
- Если на шаге 2 множество изменилось, то повторить шаг 2.
Теорема: |
Описанный выше алгоритм находит все -порождающие нетерминалы грамматики . |
Доказательство: |
Для доказательства корректности алгоритма достаточно показать, что если множество |
Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — С. 273: ISBN 5-8459-0261-4 (рус.)