Leva rekurzija

Извор: testwiki
Пређи на навигацију Пређи на претрагу

Definicija

„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

Neposredna leva rekuzija se javlja u pravilima oblika

A→Aα|β

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

Primer : Pravilo

Expr→Expr+Term

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

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

A→Bα|C

B→Aβ|D

Iz kojih bi se moglo dobiti izvođenje: A⇒Bα⇒Aβα⇒...

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

A0→A1α1|...

A1→A2α2|...

...

An→A0α(n+1)|...

Gde su α1,α2,...,αn rečenične forme.

Eliminacija leve rekurzije

Eliminacija neposredne leve rekurzije

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

A→Aα1|...|Aαn|β1|...|βm

Gde važi:

Zamenimo A-pravilo pravilom:

A→β1A′|...|βmA′

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

A′→ϵ|α1A′|...|αnA′

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

Eliminacija posredne leve rekurzije

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

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

-{for i = 1 to n}- {
-{for j = 1 to i – 1}- {
  • ako su Aj pravila
Aj→δ1|...|δk
  • svako pravilo oblika Ai→Ajγ zamenimo sa
Ai→δ1γ|...|δkγ
}
  • eliminišemo neposrednu levu rekurziju za Ai
}

Primer

Posmatrajmo gramatiku aritmetičkih izraza:

Expr→Expr+Term|Term
Term→Term∗Factor|Factor
Factor→(Expr)|Broj

-{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:

Expr→Term Expr′
Expr′→+Term Expr′|ϵ
Term→Factor Term′
Term′→∗Factor Term′|ϵ
Factor→(Expr)|Broj

Види још

Beleške

Шаблон:Референце

Шаблон:Подножје

  1. ↑ -{Notes on Formal Language Theory and Parsing Шаблон:Wayback, 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}-