Формальные языки, грамматики и основы построения трансляторов. Кревский И.Г - 52 стр.

UptoLike

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) виду.