Устранение левой рекурсии — различия между версиями
Строка 1: | Строка 1: | ||
{{Определение | {{Определение | ||
− | |definition=Говорят, что [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная( | + | |definition=Говорят, что [[Контекстно-свободные грамматики, вывод, лево- и правосторонний вывод, дерево разбора|контекстно-свободная(КС) грамматика]] <tex>\Gamma</tex> содержит '''непосредственную левую рекурсию''', если она содержит правило вида <tex>A \rightarrow A\alpha</tex>. |
}} | }} | ||
{{Определение | {{Определение | ||
− | |definition=Говорят, что | + | |definition=Говорят, что КС-грамматика <tex>\Gamma</tex> содержит '''левую рекурсию''', если в ней существует вывод вида <tex>A \Rightarrow^* A\alpha</tex>. |
}} | }} | ||
Версия 05:21, 30 ноября 2011
Определение: |
Говорят, что контекстно-свободная(КС) грамматика содержит непосредственную левую рекурсию, если она содержит правило вида . |
Определение: |
Говорят, что КС-грамматика | содержит левую рекурсию, если в ней существует вывод вида .
Содержание
Устранение непосредственной левой рекурсии
Опишем процедуру, устраняющую все правила вида
для фиксированного нетерминала .- Запишем все правила вывода из
- - непустая последовательность терминалов и нетерминалов ( );
- - непустая последовательность терминалов и нетерминалов, не начинающаяся с .
в виде:
, где
- Заменим правила вывода из на .
- Создадим новый нетерминал .
Устранение произвольной левой рекурсии
Пусть
- множество всех нетерминалов.for i = 1 to n { for j = 1 to i – 1 { рассмотреть все правила вывода из: . заменить каждое правило на . } устранить непосредственную левую рекурсию для . }
Таким образом, после применения алгоритма все правила вывода имеют вид:
- , где - терминал, - произвольный нетерминал;
- , где , - нетерминалы из исходной грамматики;
- , где - новый нетерминал, - нетерминал из исходной грамматики.
Если теперь перенумеровать нетерминалы, сохранив порядок для старых и присвоив всем новым меньшие номера, то все правила будут иметь вид:
- , где - терминал;
- , где .
Алгоритм устранения левой рекурсии
Для произвольной грамматики
левую рекурсию можно устранить следующим образом:- Воспользуемся алгоритмом удаления . Получим грамматику без -правил -правил для языка .
- Воспользуемся алгоритмом устранения произвольной левой рекурсии.
- Если присутствовал в языке исходной грамматики, добавим новый начальный символ и правила .
Литература
- Хопкрофт Д., Мотвани Р., Ульман Д. — Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)