Устранение левой рекурсии
Версия от 06:57, 27 ноября 2011; 192.168.0.2 (обсуждение)
| Определение: |
| Говорят, что контекстно-свободная(к.с.) грамматика содержит непосредственную левую рекурсию, если она содержит правило вида . |
| Определение: |
| Говорят, что к.с. грамматика содержит левую рекурсию, если в ней существует вывод вида . |
Устранение непосредственной левой рекурсии
Опишем процедуру, устраняющую все правила вида для фиксированного нетерминала .
- Запишем все правила вывода из в виде:
, где
- - непустая последовательность терминалов и нетерминалов ()
- - непустая последовательность терминалов и нетерминалов, не начинающаяся с .
- Заменим правила вывода из на:
- Создадим новый нетерминал
Устранение произвольной левой рекурсии
Пусть - множество всех нетерминалов
for i = 1 to n {
for j = 1 to i – 1 {
рассмотреть все правила вывода из :
заменить каждое правило на
}
устранить непосредственную левую рекурсию для
}
Таким образом, после применения алгоритма все правила вывода имеют вид:
- , где - терминал, - произвольный нетерминал
- , где , - нетерминалы из исходной грамматики
- , где - новый нетерминал, - нетерминал из исходной грамматики
Если теперь перенумеровать нетерминалы, сохранив порядок для старых и присвоив всем новым меньшие номера, то все правила будут иметь вид:
- , где - терминал
- , где
Алгоритм устранения левой рекурсии
Для произвольной грамматики левую рекурсию можно устранить следующим образом:
- Воспользуемся алгоритмом удаления -правил. Получим грамматику без -правил для языка
- Воспользуемся алгоритмом устранения произвольной левой рекурсии
- Если присутствовал в языке исходной грамматики, добавим новый начальный символ и правила
Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)