Устранение левой рекурсии
Версия от 20:21, 16 декабря 2012; Shagal (обсуждение | вклад) (→Устранение произвольной левой рекурсии)
Определение: |
Говорят, что контекстно-свободная(КС) грамматика содержит непосредственную левую рекурсию, если она содержит правило вида . |
Определение: |
Говорят, что КС-грамматика | содержит левую рекурсию(left recursion), если в ней существует вывод вида .
Методы нисходящего разбора(top=down parsers) не в состоянии работать с леворекурсивными грамматиками. Проблема в том, что продукция вида может применяться бесконечно долго, так и не выработав некий терминальный символ, который можно было бы сравнить со строкой. Поэтому требуется преобразование грамматики, которое бы устранило левую рекурсию.
Левая рекурсия может быть:
- непосредственной(immidiate)
- произвольной(indirect)
Содержание
Устранение непосредственной левой рекурсии
Опишем процедуру, устраняющую все правила вида
, для фиксированного нетерминала .- Запишем все правила вывода из
- — непустая последовательность терминалов и нетерминалов ( );
- — непустая последовательность терминалов и нетерминалов, не начинающаяся с .
в виде:
, где
- Заменим правила вывода из на .
- Создадим новый нетерминал .
Этот алгоритм не устраняет произвольную левую рекурсию,вызванную двумя или более шагами порождения.
Пример
S леворекурсивен, так как
, но эта рекурсия не является непосредственной.Устранение произвольной левой рекурсии
Пусть
— упорядоченное множество всех нетерминалов.for все нетерминалыfor все нетерминалы , такие, что Если есть правило вида и правила вывода из : . Заменить каждое правило на . устранить непосредственную левую рекурсию для .
Смысл вложенного цикла в том, чтобы избавиться от правил вида
таких, что .После вложенного цикла цепочка выводов вида
точно не придет в , а значит для может быть применен алгоритм удаление непосредственной левой рекурсии.Алгоритм устранения левой рекурсии
Для произвольной грамматики
левую рекурсию можно устранить следующим образом:- Воспользуемся алгоритмом удаления . Получим грамматику без -правил -правил для языка .
- Воспользуемся алгоритмом устранения произвольной левой рекурсии.
- Если присутствовал в языке исходной грамматики, добавим новый начальный символ и правила .
Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)
- Robert C. Moore — Removing Left Recursion from Context-Free Grammars