Устранение левой рекурсии — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
Строка 52: Строка 52:
 
==Литература==
 
==Литература==
 
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)
 
* ''Хопкрофт Д., Мотвани Р., Ульман Д.'' — '''Введение в теорию автоматов, языков и вычислений''', 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)
 +
* Robert C. Moore — [http://aclweb.org/anthology-new/A/A00/A00-2033.pdf Removing  Left  Recursion  from  Context-Free  Grammars ]
  
 
[[Категория: Теория формальных языков]]
 
[[Категория: Теория формальных языков]]
 
[[Категория: Контекстно-свободные грамматики]]
 
[[Категория: Контекстно-свободные грамматики]]

Версия 16:43, 8 декабря 2012

Определение:
Говорят, что контекстно-свободная(КС) грамматика Γ содержит непосредственную левую рекурсию, если она содержит правило вида AAα.


Определение:
Говорят, что КС-грамматика Γ содержит левую рекурсию, если в ней существует вывод вида AAα.


Устранение непосредственной левой рекурсии

Опишем процедуру, устраняющую все правила вида AAα, для фиксированного нетерминала A.

  1. Запишем все правила вывода из A в виде: AAα1||Aαn|β1||βm, где
    • α — непустая последовательность терминалов и нетерминалов (αε);
    • β — непустая последовательность терминалов и нетерминалов, не начинающаяся с A.
  2. Заменим правила вывода из A на Aβ1A||βmA|β1||βm.
  3. Создадим новый нетерминал Aα1A||αnA|α1||αn.

Устранение произвольной левой рекурсии

Пусть N={A1,A2,,An} — множество всех нетерминалов.

for i = 1 to n 
  for j = 1 to i – 1 
    рассмотреть все правила вывода из Aj: Ajδ1||δk.
    заменить каждое правило AiAjγ на Aiδ1γ||δkγ.
  устранить непосредственную левую рекурсию для Ai.

Таким образом, после применения алгоритма все правила вывода имеют вид:

  • Acα, где c — терминал, A — произвольный нетерминал;
  • AiAjα, где i<j, Ai,Aj — нетерминалы из исходной грамматики;
  • AiAjα, где Ai — новый нетерминал, Aj — нетерминал из исходной грамматики.

Если теперь перенумеровать нетерминалы, сохранив порядок для старых и присвоив всем новым меньшие номера, то все правила будут иметь вид:

  • Bicα, где c — терминал;
  • BiBjα, где i<j.

Алгоритм устранения левой рекурсии

Для произвольной грамматики Γ левую рекурсию можно устранить следующим образом:

  1. Воспользуемся алгоритмом удаления ε-правил. Получим грамматику без ε-правил для языка L(Γ){ε}.
  2. Воспользуемся алгоритмом устранения произвольной левой рекурсии.
  3. Если ε присутствовал в языке исходной грамматики, добавим новый начальный символ S и правила SS|ε.


Литература

  • Хопкрофт Д., Мотвани Р., Ульман Д.Введение в теорию автоматов, языков и вычислений, 2-е изд. : Пер. с англ. — Москва, Издательский дом «Вильямс», 2002. — 528 с. : ISBN 5-8459-0261-4 (рус.)
  • Robert C. Moore — Removing Left Recursion from Context-Free Grammars