ВУЗ:
Составители:
52
Все эти порождающие правила имеют требуемый вид, а левый
рекурсивный цикл заменен прямой левой рекурсией. Чтобы исключить
прямую левую рекурсию, введем новый нетерминальный символ Z и заменим
правила
D
→
ecbz
D
→
Ddcbz
на
D
→
ecbz
D
→
ecbzZ
Z
→
dcbz
Z
→
dcbzZ
Заметим, что до и после преобразования D генерирует регулярное
выражение
(ecbz) (dcbz)*
Обобщая, можно показать, что если нетерминал A появляется в левых
частях r + s порождающих правил, r из которых используют прямую левую
рекурсию, а s – нет, т.е.
A
→
Aα
1
, A
→
Aα
2
,..., A
→
Aα
r
A
→
β
1
, A
→
β
2
,..., A
→
β
s
то эти правила можно заменить на следующие:
si1
ZβA
βA
i
i
≤≤
⎭
⎬
⎫
→
→
ri1
ZαZ
αZ
i
i
≤≤
⎭
⎬
⎫
→
→
Неформальное доказательство заключается в том, что до и после
преобразования A генерирует регулярное выражение
(β
1
| β
2
|... | βs) (α
1
| α
2
|... | α
r
) *
Следует обратить внимание, что устранив левую рекурсию (или левый
рекурсивный цикл), мы еще не получаем LL(1)-грамматику, т.к. для
некоторых нетерминалов в левой части правил полученных грамматик
существуют альтернативные правые части, начинающиеся с одних и тех же
символов. Поэтому после устранения левой рекурсии следует продолжить
преобразование грамматики к LL(1) виду.
52
Все эти порождающие правила имеют требуемый вид, а левый
рекурсивный цикл заменен прямой левой рекурсией. Чтобы исключить
прямую левую рекурсию, введем новый нетерминальный символ Z и заменим
правила
D → ecbz
D→ Ddcbz
на
D → ecbz Z → dcbz
D → ecbzZ Z → dcbzZ
Заметим, что до и после преобразования D генерирует регулярное
выражение
(ecbz) (dcbz)*
Обобщая, можно показать, что если нетерминал A появляется в левых
частях r + s порождающих правил, r из которых используют прямую левую
рекурсию, а s – нет, т.е.
A → Aα1, A → Aα2,..., A → Aαr
A → β1, A → β2,..., A → βs
то эти правила можно заменить на следующие:
A → βi ⎫ Z → αi ⎫
⎬ 1≤i ≤ s ⎬ 1≤i ≤ r
A → βi Z ⎭ Z → αi Z ⎭
Неформальное доказательство заключается в том, что до и после
преобразования A генерирует регулярное выражение
(β1 | β2 |... | βs) (α1 | α2 |... | αr) *
Следует обратить внимание, что устранив левую рекурсию (или левый
рекурсивный цикл), мы еще не получаем LL(1)-грамматику, т.к. для
некоторых нетерминалов в левой части правил полученных грамматик
существуют альтернативные правые части, начинающиеся с одних и тех же
символов. Поэтому после устранения левой рекурсии следует продолжить
преобразование грамматики к LL(1) виду.
Страницы
- « первая
- ‹ предыдущая
- …
- 50
- 51
- 52
- 53
- 54
- …
- следующая ›
- последняя »
