Удаление eps-правил из грамматики — различия между версиями
Boichenko (обсуждение | вклад) (Новая страница: «{{Определение |definition = Правила вида <tex>A \to \varepsilon</tex> называются <tex>\varepsilon</tex>-правилами. }} По …») |
Boichenko (обсуждение | вклад) |
||
| Строка 51: | Строка 51: | ||
<tex>B \to A \mid \varepsilon</tex> | <tex>B \to A \mid \varepsilon</tex> | ||
| + | |||
| + | == Ссылки == | ||
| + | [http://eli.thegreenplace.net/2010/02/08/removing-epsilon-productions-from-context-free-grammars/ Реализация алгоритма на Python] | ||
Версия 16:47, 14 октября 2010
| Определение: |
| Правила вида называются -правилами. |
По данной произвольной КС-грамматике можно построить новую КС-грамматику без -правил, эквивалентную исходной без терминала .
То есть, язык порождаемый грамматикой .
Перед представлением алгоритма преобразования, рассмотрим несколько примеров.
1. C -правилами: (Здесь и далее терминалы; нетерминалы; произвольные строки из теминалов и нетеминалов)
Без -правил:
2. Более интересный пример - -порождающий терминал встречается в продукции несколько раз:
Если удаляется -правило , то каждую продукцию ,содержащую справа, следует заменить на продукций, где - число встреченных в продукции , так как каждое такое может находиться в 2ух состояниях - есть оно в продукции или же нет. Да, из этих продукций могут быть повторения, нужно попытаться найти их и удалить лишние.
Итого, получаем грамматику без -правил:
Итак, приходим к следующему алгоритму удаления -правил:
- Пока есть -правило.(Обозначим его за )
Если - стартовое состояние - ничего не делаем и переходим к пункту 1. - Удалить его
- Каждую продукцию ,содержащую справа заменяем на продукций, как в примере 2. Переход к пункту 1.
Заметим, что на 3ем пункте мы можем породить еще одно -правило, например:
Получим: