Материал: Описание КР 1

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

УСТРАНЕНИЕ ЛЕВОЙ РЕКУРСИИ

Левая рекурсия устраняется путем преобразования грамматики в праворекурсивную грамматику.

Если имеются правила грамматики следующего вида

A -> A α | β,

то это леворекурсивная грамматика. Цепочка β не начинается с нетерминала A.

Левая рекурсия устраняется с помощью введения дополнительного нетерминала А':

А -> β А'

А' -> α А'

| ϵ,

где ϵ – пустая цепочка. Это праворекурсивная грамматика, которая порождает тот же язык, что и исходная грамматика.

ПРАВОРЕКУРСИВНАЯ ГРАММАТИКА

ПРИМЕР

S -> a S |

Правая рекурсия не создает никаких проблем для программирования нисходящего синтаксического анализа сверху вниз от кроны к корню дерева разбора.

Поэтому на практике нет необходимости исключать правую рекурсию из грамматики.

ОБЩИЙ СЛУЧАЙ РЕКУРСИИ

ПРИМЕР

S -> a S b |

ПРАКТИЧЕСКИЕ ЗАДАЧИ, ОСНОВАННЫЕ НА УСТРАНЕНИИ ЛЕВОЙ РЕКУРСИИ

ЗАДАЧА № 01:

Исключить левую рекурсию из грамматики

A -> A B d | A a | a

B -> B e | b

РЕШЕНИЕ

Грамматика после исключения левой рекурсии такова

A -> a A'

B -> b B'

A' -> B d A' | a A'

| ϵ

B' -> e B' | ϵ

ЗАДАЧА № 02:

Исключить левую рекурсию из грамматики

E -> E + E | E * E | a

РЕШЕНИЕ

Грамматика после исключения левой рекурсии такова

E -> a E'

E' -> + E E'

| * E E' | ϵ

Задача № 03:

Исключить левую рекурсию из грамматики

E -> E + T | T

T -> T * F | F

F -> id

РЕШЕНИЕ

Грамматика после исключения левой рекурсии такова

E -> T E'

T -> F T'

F -> id

E' -> + T E'

| ϵ

T' -> * F T'

| ϵ

ЗАДАЧА № 04:

Исключить левую рекурсию из грамматики

S -> ( L ) | a

L -> L , S | S

РЕШЕНИЕ

Грамматика после исключения левой рекурсии такова

S -> ( L ) | a

L -> ( L ) L' | a L'

L' -> , S L' | ϵ

ЗАДАЧА № 05:

Исключить левую рекурсию из грамматики

S -> S 0 S 1 S | 01

РЕШЕНИЕ

Грамматика после исключения левой рекурсии такова

S -> 01 S'

S' -> 0 S 1 S S' | ϵ

ЗАДАЧА № 06:

Исключить левую рекурсию из грамматики

S -> A

A -> A d | A e | a B | ac

B -> b B c | f

РЕШЕНИЕ

Грамматика после исключения левой рекурсии такова

S -> A

A -> a B A' | ac A'

B-> b B c | f

A' -> d A' | e A' | ϵ

ЗАДАЧА № 07:

Исключить левую рекурсию из грамматики

A -> A A α | β

РЕШЕНИЕ

A -> β A'

A' -> A α A'

| ϵ

ЗАДАЧА № 08:

Исключить левую рекурсию из грамматики

A -> B a | A a | c

B -> B b | A b | d

РЕШЕНИЕ

Это случай скрытой левой рекурсии.

ШАГ-01:

Сначала устраним левую рекурсию из правила A -> B a | A a | c

Исключив отсюда левую рекурсию, получаем:

A -> B a A' | c A'

A' -> a A' | ϵ

Теперь данная грамматика переписывается так

A -> B a A' | c A'

A' -> a A' | ϵ

B -> B b | A b | d

ШАГ-02:

Подставляя продукции нетерминала A в B -> A b, получаем следующую грамматику

A -> B a A' | c A'

A' -> a A' | ϵ

B -> B b | B a A’ b | c A’ b | d

ШАГ-03:

Теперь, исключив левую рекурсию из продукций нетерминала B, получаем следующую грамматику:

A -> B a A' | c A'

B -> c A' b B' | d B'

A' -> a A' | ϵ

B' -> b B'

| a A' b B' | ϵ

Это окончательная грамматика после устранения левой рекурсии.

ЗАДАЧА № 09:

Исключить левую рекурсию из грамматики