Составители:
9
Определение: Если и , то рекурсия называется правой, а
грамматика - праворекурсивной.
Определение: Если и , то рекурсия представляет собой цикл.
Любая КС-грамматика может быть как леворекурсивной, так и
праворекурсивной, а также леворекурсивной и праворекурсивной
одновременно.
Некоторые алгоритмы левостороннего разбора для КС-языков не работают с
леворекурсивными грамматиками, поэтому возникает необходимость
исключить левую рекурсию из правил грамматики.
Любую КС-грамматику можно преобразовать к нелеворекурсивному виду
или неправорекурсивному виду.
Алгоритм устранения левой рекурсии
Шаг 1. Обозначим нетерминальные символы грамматики так:
, .
Шаг 2. Рассмотрим правила для символа . Если эти правила не содержат
левой рекурсии, то перенесем их в множество правил без изменений, а
символ добавим в множество нетерминальных символов .
Иначе запишем правила для в виде
,
где ни одна из цепочек , не начинается с символов , таких, что
.
Вместо этого правила в множество запишем два правила вида:
Символы и включаем в множество .
Теперь все правила для начинаются либо с терминального символа, либо
с нетерминального символа , такого, что .
Шаг 3. Если , то грамматика построена, перейти к шагу 6, иначе
, и перейти к шагу 4.
Шаг 4. Для символа в множестве правил заменить все правила вида
, где , на правила вида , причем
- все правила для символа .
Так как правая часть правил уже начинается с
терминального символа или нетерминального символа , , то и правая
часть правил для символа будет удовлетворять этому условию.
Шаг 5. Если , то перейти к шагу 2, иначе и перейти к
шагу 4.
Шаг 6. Целевым символом грамматики становится символ ,
соответствующий символу исходной грамматики .
Пример устранения левой рекурсии
Рассмотрим в качестве примера грамматику для арифметических выражений
над символами и : , где
Определение: Если и , то рекурсия называется правой, а грамматика - праворекурсивной. Определение: Если и , то рекурсия представляет собой цикл. Любая КС-грамматика может быть как леворекурсивной, так и праворекурсивной, а также леворекурсивной и праворекурсивной одновременно. Некоторые алгоритмы левостороннего разбора для КС-языков не работают с леворекурсивными грамматиками, поэтому возникает необходимость исключить левую рекурсию из правил грамматики. Любую КС-грамматику можно преобразовать к нелеворекурсивному виду или неправорекурсивному виду. Алгоритм устранения левой рекурсии Шаг 1. Обозначим нетерминальные символы грамматики так: , . Шаг 2. Рассмотрим правила для символа . Если эти правила не содержат левой рекурсии, то перенесем их в множество правил без изменений, а символ добавим в множество нетерминальных символов . Иначе запишем правила для в виде , где ни одна из цепочек , не начинается с символов , таких, что . Вместо этого правила в множество запишем два правила вида: Символы и включаем в множество . Теперь все правила для начинаются либо с терминального символа, либо с нетерминального символа , такого, что . Шаг 3. Если , то грамматика построена, перейти к шагу 6, иначе , и перейти к шагу 4. Шаг 4. Для символа в множестве правил заменить все правила вида , где , на правила вида , причем - все правила для символа . Так как правая часть правил уже начинается с терминального символа или нетерминального символа , , то и правая часть правил для символа будет удовлетворять этому условию. Шаг 5. Если , то перейти к шагу 2, иначе и перейти к шагу 4. Шаг 6. Целевым символом грамматики становится символ , соответствующий символу исходной грамматики . Пример устранения левой рекурсии Рассмотрим в качестве примера грамматику для арифметических выражений над символами и : , где 9
Страницы
- « первая
- ‹ предыдущая
- …
- 7
- 8
- 9
- 10
- 11
- …
- следующая ›
- последняя »