Leva rekurzija

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 α | β {\displaystyle A\rightarrow A\alpha \,|\,\beta }

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

Primer : Pravilo

E x p r E x p r + T e r m {\displaystyle Expr\rightarrow 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 {\displaystyle A\rightarrow B\alpha \,|\,C}

B A β | D {\displaystyle B\rightarrow A\beta \,|\,D}

Iz kojih bi se moglo dobiti izvođenje: A B α A β α . . . {\displaystyle A\Rightarrow B\alpha \Rightarrow A\beta \alpha \Rightarrow ...}

Uopšteno govoreći, za neterminale A 0 , A 1 , . . . , A n {\displaystyle A_{0},A_{1},...,A_{n}} , posredna leva rekurzija može se definisati postojanjem forme:

A 0 A 1 α 1 | . . . {\displaystyle A_{0}\rightarrow A_{1}\alpha _{1}\,|...}

A 1 A 2 α 2 | . . . {\displaystyle A_{1}\rightarrow A_{2}\alpha _{2}\,|...}

. . . {\displaystyle ...}

A n A 0 α ( n + 1 ) | . . . {\displaystyle A_{n}\rightarrow A_{0}\alpha _{(n+1)}\,|...}

Gde su α 1 , α 2 , . . . , α n {\displaystyle \alpha _{1},\alpha _{2},...,\alpha _{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 {\displaystyle A\rightarrow A\alpha _{1}\,|\,...\,|\,A\alpha _{n}\,|\,\beta _{1}\,|\,...\,|\,\beta _{m}}

Gde važi:

  • Neterminal A poseduje levu rekurziju
  • α i {\displaystyle \alpha _{i}} je neprazna rečenična forma ( α i ϵ {\displaystyle \alpha _{i}\neq \epsilon } )
  • β i {\displaystyle \beta _{i}} je rečenična forma koja ne počinje simbolom A.

Zamenimo A-pravilo pravilom:

A β 1 A | . . . | β m A {\displaystyle A\rightarrow \beta _{1}A^{\prime }\,|\,...\,|\,\beta _{m}A^{\prime }}

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

A ϵ | α 1 A | . . . | α n A {\displaystyle A^{\prime }\rightarrow \epsilon \,|\,\alpha _{1}A^{\prime }\,|\,...\,|\,\alpha _{n}A^{\prime }}

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

Eliminacija posredne leve rekurzije

Ako je gramatika svojstvena, tj. ε-slobodna (bez pravila oblika A . . . | ϵ | . . . {\displaystyle A\rightarrow ...|\epsilon |...} ) i bez jednostukih pravila (ni za jedan neterminal A ne postoji izvođenje oblika A . . . A {\displaystyle A\Rightarrow ...\Rightarrow 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 A 1 {\displaystyle A_{1}} , ... A n {\displaystyle A_{n}} .

for i = 1 to n {
for j = 1 to i – 1 {
  • ako su A j {\displaystyle A_{j}} pravila
A j δ 1 | . . . | δ k {\displaystyle A_{j}\rightarrow \delta _{1}|...|\delta _{k}}
  • svako pravilo oblika A i A j γ {\displaystyle A_{i}\rightarrow A_{j}\gamma } zamenimo sa
A i δ 1 γ | . . . | δ k γ {\displaystyle A_{i}\rightarrow \delta _{1}\gamma |...|\delta _{k}\gamma }
}
  • eliminišemo neposrednu levu rekurziju za A i {\displaystyle A_{i}}
}

Primer

Posmatrajmo gramatiku aritmetičkih izraza:

E x p r E x p r + T e r m | T e r m {\displaystyle Expr\rightarrow Expr\,+\,Term\,|\,Term}
T e r m T e r m F a c t o r | F a c t o r {\displaystyle Term\rightarrow Term\,*\,Factor\,|\,Factor}
F a c t o r ( E x p r ) | B r o j {\displaystyle Factor\rightarrow (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:

E x p r T e r m   E x p r {\displaystyle Expr\rightarrow Term\ Expr'}
E x p r + T e r m   E x p r | ϵ {\displaystyle Expr'\rightarrow {}+Term\ Expr'\,|\,\epsilon }
T e r m F a c t o r   T e r m {\displaystyle Term\rightarrow Factor\ Term'}
T e r m F a c t o r   T e r m | ϵ {\displaystyle Term'\rightarrow {}*Factor\ Term'\,|\,\epsilon }
F a c t o r ( E x p r ) | B r o j {\displaystyle Factor\rightarrow (Expr)\,|\,Broj}

Pogledajte još

  • Eliminacija e-pravila
  • Eliminacija nekorisnih simbola
  • Eliminacija jednostrukih pravila

Beleške

  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