Дефиниција

уреди

„Граматика је лево рекурзивна ако садржи нетерминал А, такав да се из њега може извести реченична форма која почиње тим симболом.”[1]

Непосредна лева рекурзија

уреди

Непосредна лева рекузија се јавља у правилима облика

 

Где су α и β реченичне форме и β не почиње симболом А.

Пример : Правило

 

садржи непосредну леву рекурзију. Анализатор рекурзивним спустом би изгледао на пример овако :

function Expr() {
Expr(); match('+'); Term();
}

и анализатор би упао у бесконачну рекурзију када би покушао да анализира граматику која садржи ово правило.

Посредна лева рекурзија

уреди

Посредна лева рекурзија у најједноставнијем облику могла би се дефинисати следећим правилима:

 

 

Из којих би се могло добити извођење:  

Уопштено говорећи, за нетерминале  , посредна лева рекурзија може се дефинисати постојањем форме:

 

 

 

 

Где су   реченичне форме.

Елиминација леве рекурзије

уреди

Елиминација непосредне леве рекурзије

уреди

Следи алгоритам уклањања непосредне леве рекурзије. Постигнуто је неколико унапређења овог метода, укључујући и она описана у чланку "Removing Left Recursion from Context-Free Grammars"[2], који је написао Robert C. Moore.

За свако правило облика

 

Где важи:

  • Нетерминал А поседује леву рекурзију
  •   је непразна реченична форма ( )
  •   је реченична форма која не почиње симболом А.

Заменимо А-правило правилом:

 

Где је А’ нови нетерминал за који важи:

 

Новодобијени симбол се често назива „реп” или „остатак”.

Елиминација посредне леве рекурзије

уреди

Ако је граматика својствена, тј. ε-слободна (без правила облика  ) и без једностуких правила (ни за један нетерминал А не постоји извођење облика   ), ово је општи алгоритам који се може применити за уклањње посредне леве рекурзије:

Претходно међу нетерминалима успоставимо неки (било какав) поредак  , ...  .

for i = 1 to n {
for j = 1 to i – 1 {
  • ако су   правила
 
  • свако правило облика   заменимо са
 
}
  • елиминишемо непосредну леву рекурзију за  
}

Пример

уреди

Посматрајмо граматику аритметичких израза:

 
 
 

Expr и Term су лево рекурзивна. Уведимо нове помоћне симболе Expr’ и Term’. Примена наведеног поступка даје следећу граматику без лево рекурзивних правила:

 
 
 
 
 

Погледајте још

уреди

Белешке

уреди
  1. ^ Notes on Formal Language Theory and Parsing Архивирано на веб-сајту Wayback Machine (28. август 2017), James Power, Department of Computer Science National University of Ireland, Maynooth Maynooth, Co. Kildare, Ireland.JPR02
  2. ^ Removing Left Recursion from Context-Free Grammars, Robert C. Moore, Microsoft Research, Redmond, WA, USA