ВУЗ:
Составители:
4.5.5. Удаление правил с терминальной правой частью
Пусть в грамматике G имеется с терминальной правой частью A→β, где β ∈ V
*
T
. Тогда
любой вывод с использованием этого правила имеет вид: S →
*
xAy → xβy. Здесь
нетерминал А в сентенциальной форме xAy появился на предыдущем шаге вывода B → uAv.
Если в это правило вместо А подставить β, получим правило B → uβv. Тогда длина вывода
некоторой цепочки сократится на один шаг. Следовательно, для того чтобы удалить
терминальное правило грамматики A→β, необходимо учесть следующие правила:
а) если для нетерминала А больше нет правил, тогда во всех правых частях А заменяется
на β;
б) если для нетерминала А есть другие правила, тогда добавляются новые правила, в
которых А заменяется на β.
Пример. Пусть дана КС-грамматика G:
S → aSb | bAa | B; A → ABa | b | ε; B → ab | ba.
Удалим правила для нетерминала В. Тогда эквивалентная грамматика G
1
будет включать
следующие правила:
S → aSb | bAa | ab | ba; A → Aaba | Abaa| b | ε.
4.5.6. Построение эквивалентной праворекурсивной КС-грамматики
Некоторые специальные методы грамматического разбора неприменимы к
леворекурсивным или праворекурсивным грамматикам, поэтому рассмотрим устранение
левой или правой рекурсии. В общем случае избавиться от рекурсии в правилах грамматики
невозможно, т.к. бесконечные языки порождаются грамматиками с конечным числом правил
только благодаря рекурсии. Поэтому можно говорить лишь о преобразовании одного вида
рекурсии в другой. Рассмотрим, как для любой леворекурсивной КС-грамматики построить
эквивалентную праворекурсивную КС-грамматику.
Пусть нетерминал А - леворекурсивен, т.е. для него имеются правила следующего вида:
A → Ax
1
| Ax
2
| . . . | Ax
p
| w
1
| . . . | w
k
, где x
i
и w
j
- цепочки над множеством V
T
∪ V
N
.
Введем дополнительные нетерминалы B и D и указанные правила заменим на
эквивалентные им:
A → AB
| D;
B → x
1
| x
2
| . . . | x
p
;
D → w
1
| w
2
| . . . | w
k
.
В результате замены получим вывод, который имеет вид:
A → AB→ ABB → ABBB → . . . → AB
*
→ DB
*
.
Таким образом, для нетерминала А можно определить эквивалентные правила:
A → DK;
K → BK | ε.
Выполняя подстановку D и B в эти правила, получим следующие праворекурсивные
правила:
A → w
1
K| w
2
K | . . . | w
k
K;
K → x
1
K
| x
2
K
| . . . | x
p
K | ε.
Пример. Пусть задана грамматика G со следующими правилами вывода: S → Sa | ba.
Требуется построить эквивалентную ей праворекурсивную грамматику.
Для решения задачи воспользуемся рассмотренным выше алгоритмом. В исходной
грамматике один леворекурсивный нетерминал S. Построим для него вывод:
S → SB | D;
B → a; D → ba. Вывод из S имеет вид: S → SB→ SBB→ . . . →DB
*
.
Запишем эквивалентные правила для S:
4.5.5. Удаление правил с терминальной правой частью
Пусть в грамматике G имеется с терминальной правой частью A→β, где β ∈ V*T. Тогда
любой вывод с использованием этого правила имеет вид: S →* xAy → xβy. Здесь
нетерминал А в сентенциальной форме xAy появился на предыдущем шаге вывода B → uAv.
Если в это правило вместо А подставить β, получим правило B → uβv. Тогда длина вывода
некоторой цепочки сократится на один шаг. Следовательно, для того чтобы удалить
терминальное правило грамматики A→β, необходимо учесть следующие правила:
а) если для нетерминала А больше нет правил, тогда во всех правых частях А заменяется
на β;
б) если для нетерминала А есть другие правила, тогда добавляются новые правила, в
которых А заменяется на β.
Пример. Пусть дана КС-грамматика G:
S → aSb | bAa | B; A → ABa | b | ε; B → ab | ba.
Удалим правила для нетерминала В. Тогда эквивалентная грамматика G1 будет включать
следующие правила:
S → aSb | bAa | ab | ba; A → Aaba | Abaa| b | ε.
4.5.6. Построение эквивалентной праворекурсивной КС-грамматики
Некоторые специальные методы грамматического разбора неприменимы к
леворекурсивным или праворекурсивным грамматикам, поэтому рассмотрим устранение
левой или правой рекурсии. В общем случае избавиться от рекурсии в правилах грамматики
невозможно, т.к. бесконечные языки порождаются грамматиками с конечным числом правил
только благодаря рекурсии. Поэтому можно говорить лишь о преобразовании одного вида
рекурсии в другой. Рассмотрим, как для любой леворекурсивной КС-грамматики построить
эквивалентную праворекурсивную КС-грамматику.
Пусть нетерминал А - леворекурсивен, т.е. для него имеются правила следующего вида:
A → Ax1 | Ax2 | . . . | Axp | w1| . . . | wk, где xi и wj - цепочки над множеством VT ∪ VN.
Введем дополнительные нетерминалы B и D и указанные правила заменим на
эквивалентные им:
A → AB | D;
B → x1 | x2 | . . . | xp;
D → w1| w2 | . . . | wk.
В результате замены получим вывод, который имеет вид:
A → AB→ ABB → ABBB → . . . → AB* → DB*.
Таким образом, для нетерминала А можно определить эквивалентные правила:
A → DK;
K → BK | ε.
Выполняя подстановку D и B в эти правила, получим следующие праворекурсивные
правила:
A → w1K| w2K | . . . | wkK;
K → x1K | x2K | . . . | xpK | ε.
Пример. Пусть задана грамматика G со следующими правилами вывода: S → Sa | ba.
Требуется построить эквивалентную ей праворекурсивную грамматику.
Для решения задачи воспользуемся рассмотренным выше алгоритмом. В исходной
грамматике один леворекурсивный нетерминал S. Построим для него вывод:
S → SB | D;
B → a; D → ba. Вывод из S имеет вид: S → SB→ SBB→ . . . →DB*.
Запишем эквивалентные правила для S:
Страницы
- « первая
- ‹ предыдущая
- …
- 31
- 32
- 33
- 34
- 35
- …
- следующая ›
- последняя »
