formal_language_theory / lectures / unit_4
.pdf§ 4.3. Нормальная форма Грейбах
Определение 4.4. Говорят, что КС-
грамматика G = (VN, VT, P, S) представлена в
нормальной форме Грейбах, если каждое её правило имеет вид
A a , где a V , V * .
T N
Для доказательства того, что всякая КСграмматика может быть приведена к нормальной форме Грейбах, нам потребуется обосновать эквивалентность используемых при этом преобразований.
61
Лемма 4.2 — о подстановке.
Пусть G = (VN, VT, P, S) — cfg,
A 1B 2 P, A, B VN , 1, 2 V *, и
{B i i V , i =1, 2,..., m} — множе-
ство всех B-порождений, т. е. правил с нетерминалом B в левой части.
Пусть грамматика G1= (VN, VT, P1, S) получается из грамматики G отбрасыва-
нием правила A 1B 2 и добавлением правил вида A 1 i 2, i =1, 2,..., m.
Тогда L(G) = L(G1).
Ret 75 Ret 78 Ret 80 Ret 81 Ret 122
62
Лемма о подстановке
Доказательство.
I. Докажем, что L(G1) L(G).
|
|
|
Пусть S |
* |
* |
G |
x, x VT . |
|
|
1 |
|
Использование в этом выводе правила
A 1 i 2 P1\ P
равносильно двум шагам вывода в G:
A G
1 B 2
G
1 i 2.
Шаги вывода в грамматике G1, на которых используются другие правила, общие для двух этих грамматик, являются шагами
вывода в грамматике G. Поэтому S * x.
G
63
Лемма о подстановке
II. Докажем, что L(G) L(G1).
Пусть S * x. G Если в этом выводе используется правило
A 1B 2 P \ P1,
то рано или поздно для замены B будет
использовано правило вида
B i P..
Эти два шага вывода в грамматике G
равносильны одному
A G1
шагу вывода в G1:
1 i 2.
64
Лемма о подстановке
Шаги вывода в грамматике G, на которых используются другие правила, общие для двух грамматик, являются шагами вывода в грамматике G1.
Поэтому S * x. G1 Что и требовалось доказать.
65
Лемма 4.3 — об устранении левой рекурсии.
Пусть G = (VN, VT, P, S) — КСграмматика,
{A A i A VN, i V , i = 1, 2, ..., m} —
множество всех леворекурсивных A-порождений, {A j j = 1, 2, ..., n} — множество всех прочих
A-порождений.
Пусть G1 = (VN {Z}, VT, P1, S) — КС-
грамматика, образованная добавлением нового нетерминала Z и заменой всех A-порождений
правилами: |
|
1) A j , |
2) Z i , |
A j Z, j = 1, 2, ..., n; |
Z i Z, i = 1, 2,..., m. |
Тогда L(G1) = L(G). |
|
Ret 74 Ret 76 Ret 80 Ret 81 Ret 84 Ret 124 |
66 |
|
Об устранении левой рекурсии
Доказательство. Прежде всего заметим, что посредством левосторонних выводов в грамматике G при использовании одних лишь A-порождений порождаются множества вида
{ 1, 2,..., n}{ 1, 2,..., m}*,
и это является в точности множеством, порождаемым правилами грамматики G1, имеющими A или Z в левых частях.
67
Об устранении левой рекурсии
I. Докажем, что L(G) L(G1). Пусть x L(G). Левосторонний
можем перестроить Именно, каждый
в вывод S * G раз, когда1
x.
вывод S * x мы G
в левостороннем
выводе встречается последовательность шагов:
tA |
tA i1 tA i2 i1 |
|
... |
tA ip... i2 i1 |
||||||||||||
|
G |
|
|
G |
|
|
G |
|
|
G |
* |
|
|
|
G |
|
|
|
|
|
|
|
V |
* |
|
|
|
|
|
|
|||
|
G |
t j ip... i2 i1 (t |
T |
, V |
|
), |
|
|
|
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
заменим их последовательностью шагов: |
|
|
|
|||||||||||||
tA |
|
t j Z |
t j ip Z |
... t j |
ip ... i |
2 Z |
|
|||||||||
G |
|
G |
|
|||||||||||||
|
1 |
|
G |
1 |
G |
1 |
|
G |
1 |
|
|
|
1 |
|||
|
|
t j ip |
... i2 i1 . |
|
|
|
|
|
|
|
|
|
|
|
||
|
G |
1 |
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
образом |
|
вывод |
является |
|||||||||
Полученный таким |
|
выводом цепочки x в грамматике G1, хотя и не левосторонним. Следовательно, x L(G1).
68
Об устранении левой рекурсии
II. Докажем, что L(G1) L(G).
Пусть x L(G1). Рассмотрим левосторонний
|
|
|
|
|
|
вывод S |
* |
|
x, |
и перестроим его в |
вывод в |
G |
|
||||
|
1 |
|
|
|
|
грамматике G следующим образом. |
|
||||
Всякий |
раз, |
как Z появляется в |
сентен- |
циальной форме, мы приостанавливаем левосторонний порядок вывода, и вместо того, чтобы производить замены нетерминалов в цепочке , предшествующей Z, займемся замещением Z с помощью правил вида Z Z.
69
Об устранении левой рекурсии
Далее, вместо того, чтобы производить подстановки в цепочке , продолжим использовать соответствующие правила для Z, пока, наконец, Z не будет замещено цепочкой, его не содержащей.
После этого следует заняться выводами терминальных цепочек из и .
Результат этого, уже не левостороннего, вывода будет тем же самым, что и при исходном левостороннем выводе в грамматике G.
70