Основы конструирования компиляторов

          

Левая факторизация


Oсновная идея левой факторизации в том, что в том случае, когда неясно, какую из двух альтернатив надо использовать для развертки нетерминала A, нужно изменить A-правила так, чтобы отложить решение до

тех пор, пока не будет достаточно информации для принятия правильного решения.

Если A

Левая факторизация
Левая факторизация
Левая факторизация
1 |
Левая факторизация
Левая факторизация
2 - два A-правила и входная цепочка начинается с непустой строки, выводимой из
Левая факторизация
, мы не знаем, разворачивать ли по первому правилу или по второму. Можно отложить решение, развернув A
Левая факторизация
Левая факторизация
A'. Тогда после анализа того, что выводимо из
Левая факторизация
, можно развернуть по A'
Левая факторизация
Левая факторизация
1 или по A'
Левая факторизация
Левая факторизация
2. Левофакторизованные правила принимают вид

Левая факторизация

Левая факторизация

Алгоритм 4.8. Левая факторизация грамматики.

Вход. КС-грамматика G.

Выход. Левофакторизованная КС-грамматика G', эквивалентная G.

Метод. Для каждого нетерминала A ищем самый длинный префикс

Левая факторизация
, общий для двух или более его альтернатив. Если
Левая факторизация
Левая факторизация
e, т.е. существует нетривиальный общий префикс, заменяем все A-правила

Левая факторизация
где z обозначает все альтернативы, не начинающиеся с
Левая факторизация
, на

Левая факторизация

Левая факторизация

где A' - новый нетерминал. Повторно применяем это преобразование, пока никакие две альтернативы не будут иметь общего префикса.

Пример 4.7. Рассмотрим вновь грамматику условных

операторов из примера 4.6:

S
Левая факторизация
if E then S | if E then S else S | a
E
Левая факторизация
b

После левой факторизации грамматика принимает вид

S
Левая факторизация
if E then SS'| a
S'
Левая факторизация
else S | e
E
Левая факторизация
b

К сожалению, грамматика остается неоднозначной, а значит, и не LL(1).



Содержание раздела