Leva rekurzija

S Vikipedije, slobodne enciklopedije

Definicija[uredi | uredi izvor]

„Gramatika je levo rekurzivna ako sadrži neterminal A, takav da se iz njega može izvesti rečenična forma koja počinje tim simbolom.”[1]

Neposredna leva rekurzija[uredi | uredi izvor]

Neposredna leva rekuzija se javlja u pravilima oblika

Gde su α i β rečenične forme i β ne počinje simbolom A.

Primer : Pravilo

sadrži neposrednu levu rekurziju. Analizator rekurzivnim spustom bi izgledao na primer ovako :

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

i analizator bi upao u beskonačnu rekurziju kada bi pokušao da analizira gramatiku koja sadrži ovo pravilo.

Posredna leva rekurzija[uredi | uredi izvor]

Posredna leva rekurzija u najjednostavnijem obliku mogla bi se definisati sledećim pravilima:

Iz kojih bi se moglo dobiti izvođenje:

Uopšteno govoreći, za neterminale , posredna leva rekurzija može se definisati postojanjem forme:

Gde su rečenične forme.

Eliminacija leve rekurzije[uredi | uredi izvor]

Eliminacija neposredne leve rekurzije[uredi | uredi izvor]

Sledi algoritam uklanjanja neposredne leve rekurzije. Postignuto je nekoliko unapređenja ovog metoda, uključujući i ona opisana u članku "Removing Left Recursion from Context-Free Grammars"[2], koji je napisao Robert C. Moore.

Za svako pravilo oblika

Gde važi:

  • Neterminal A poseduje levu rekurziju
  • je neprazna rečenična forma ()
  • je rečenična forma koja ne počinje simbolom A.

Zamenimo A-pravilo pravilom:

Gde je A’ novi neterminal za koji važi:

Novodobijeni simbol se često naziva „rep” ili „ostatak”.

Eliminacija posredne leve rekurzije[uredi | uredi izvor]

Ako je gramatika svojstvena, tj. ε-slobodna (bez pravila oblika ) i bez jednostukih pravila (ni za jedan neterminal A ne postoji izvođenje oblika ), ovo je opšti algoritam koji se može primeniti za uklanjnje posredne leve rekurzije:

Prethodno među neterminalima uspostavimo neki (bilo kakav) poredak , ... .

for i = 1 to n {
for j = 1 to i – 1 {
  • ako su pravila
  • svako pravilo oblika zamenimo sa
}
  • eliminišemo neposrednu levu rekurziju za
}

Primer[uredi | uredi izvor]

Posmatrajmo gramatiku aritmetičkih izraza:

Expr i Term su levo rekurzivna. Uvedimo nove pomoćne simbole Expr’ i Term’. Primena navedenog postupka daje sledeću gramatiku bez levo rekurzivnih pravila:

Pogledajte još[uredi | uredi izvor]

Beleške[uredi | uredi izvor]

  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