Преобразования КС-грамматик
Рассмотрим ряд преобразований, позволяющих «улучшить» вид контекстно-свободной грамматики, без изменения порождаемого ею языка.
Назовем символ X
(N
T) недостижимым в КС-грамматике G = (N, T, P, S), если X не появляется ни в одной выводимой цепочке этой
грамматики. Иными словами, символ X является недостижимым, если в G не существует вывода S
*
X
ни для каких
,
(N
T)*.
Алгоритм 4.1. Устранение недостижимых символов.
Вход. КС-грамматика G = (N, T, P, S).
Выход. КС-грамматика G' = (N', T', P', S) без недостижимых символов, такая, что L(G') = L(G).
Метод. Выполнить шаги 1-4:
Положить V 0 = {S} и i = 1.
Положить V i = {X | в P есть A
X и A V i-1} V i-1.
Если V iV i-1, положить i = i+1 и перейти к шагу 2. В противном случае перейти к шагу 4.
Положить N' = V iN, T' = V iT. Включить в P' все правила из P, содержащие только символы из V i.
Назовем символ X
(N
T) бесполезным в КС-грамматике G = (N, T, P, S), если в ней не существует вывода вида S
*xXy
*xwy, где w, x, y принадлежат T*. Очевидно, что каждый недостижимый символ является бесполезным.
Алгоритм 4.2. Устранение бесполезных символов.
Вход. КС-грамматика G = (N, T, P, S).
Выход. КС-грамматика G' = (N', T', P', S) без бесполезных символов, такая, что L(G') = L(G).
Метод. Выполнить шаги 1-5:
- Положить N0 = и i = 1.
- Положить Ni = {A|A P и (Ni-1 T)*} Ni-1.
- Если NiNi-1, положить i = i+1 и перейти к шагу 2. В противном случае положить Ne = Ni и перейти к шагу 4.
- Положить G1 = ((NNe){S}, T, P1, S), где P1 состоит из правил множества P, содержащих только символы из Ne T.
- Применив к G1 алгоритм 4.1, получить G' = (N', T', P', S).
КС-грамматика без бесполезных символов называется приведенной. Легко видеть, что для любой КС-грамматики существует эквивалентная приведенная. В дальнейшем будем предполагать, что все рассматривамые
грамматики - приведенные.
Все публикации раздела