Kanonski LR analizator

С Википедије, слободне енциклопедије

Kanonski LR analizator ili LR(1) je LR-analizator čije se tabice analize konstruišu slično kao kod LR(0) analizatora osim što ajtemi u ajtem-skupovima takođe sadrže i Sledeći tj. terminal koji analizator očekuje posle desne strane pravila. Skup Sledeći(A) za dati neterminal A sadrži sve završne simbole koji se mogu pojaviti neposredno iza simbola A, bez obzira na kontekst. Na primer, za pravilo A → B C ajtem bi mogao biti

A → B · C, a

što znači da je analizator pročitao nisku kojoj odgovara neterminal B, da očekuje nisku kojoj odgovara neterminal C iza koga sledi terminal 'a'. LR(1) analizator može da obradi veoma veliku klasu gramatika, međutim problem je što su često tablice analize jako velike. To se najčešće rešava spajanjem ajtem-skupova ukoliko su identični do na Sledeći. To su onda LALR-analizatori.

Konstruisanje LR(1) analizatora[уреди | уреди извор]

LR(1)-ajtem se sastoji od

LR(0)-ajtema A→α•β

i

preduvidnog simbola x

a obično se predstavljaju u obliku

A→α•β ,x

Intuitivno, takav ajtem nam govori koliko smo do sada pročitali (α), šta možemo da očekujemo (β), i preduvid koji se slaže sa onim što bi sledilo ukoliko bismo izvršili svođenje po pravilu A→α•β. Time što smo dodali preduvidnu informaciju pri formiranju ajtema, omogućava nam da donesemo pametniju odluku o svođenju. Preduvid LR(1)-ajtema je direktno koristi jedino kad razmišljamo o akciji svođenja (na primer, kad je metasimbol • sa desnom kraju).

Jezgro LR(1)-ajtema (A→α•β ,x ) je LR(0)-ajtem (A→α•β). Različiti LR(1)-ajtemi mogu imati isto jezgro, a razlikovati se zbog preduvidnog simbola. Koristimo prednost tog preduvidnog simbola da odlučimo koje svođenje da koristimo. (Jer bi ista situacija kod SLR analizatora možda dovela do svođenje/svođenje konflikta.)

Početni ajtem[уреди | уреди извор]

Uvodimo početni ajtem

[S’ → · S, ┤].

Oznaka ┤ označava kraj ulaza.

Pravilo zatvorenja[уреди | уреди извор]

Ako stanje sadrži ajtem:

[A → α · B β, a]

onda su u tom stanju i ajtemi oblika :

[B → · γ, Prvi(βα)]

za svako B-pravilo gramatike.

Pravilo prelaza[уреди | уреди извор]

Pravilo prelaza je ostalo isto. Ako neko stanje sadrži ajtem:

[A → α · B β, a]

tada postoji prelaz po simbolu B iz stanja koje sadrži taj ajtem u stanje koje sadrži ajtem:

[A → α B · β, a]

Akcija prebacivanja[уреди | уреди извор]

Akcije prebacivanja se takođe nisu menjale. Ukoliko je ajtem [A → α · b β, a] u stanju Ik i Ik prelazi u stanje Ij po simbolu 'b', onda dodajemo akciju :

T[k ,a]=(prebacivanje, j )

Akcija Svođenja[уреди | уреди извор]

Ukoliko je [A → α · , a] u stanju Ik, onda dodajemo akciju (svođenje, A→α). Primetimo da se više ne koristi informacija iz skupa Sledeci(A).


Primer[уреди | уреди извор]

Za gramatiku izraza:

T

T→T * F

|F

F→( E )

|a

početni ajtem je:

S→•E {┤}

a graf za skup Prvi: S → E → T → F → (,b

tj. Prvi( E ) = Prvi( T ) = Prvi( F ) = { (, b }

Početni ajtem se nalazi u stanju 0. Primenjujući na njega pravilo zavorenja dobijamo: Stanje 0:

S→•E {┤}
E→•E+T {┤}
E→•T {┤}

Međutim, pravilo zatvorenja se sad primenjuje na dodate ajteme. Time dobijamo da je Stanje 0:

S→•E {┤}
E→•E+T {┤}
E→•T {+}
E→•E+T {+}
E→•T {┤}
T→•T * F {┤}

Ovo i dalje nije potpuno stanje 0, jer se postupak nastavlja sve dok nijedan novi LR(1)-ajtem ne može da se doda stanju 0. Drugim rečima,prva tri stanja izgledaju:

Stanje 0:
S→•E {┤}
E→•E+T {┤,+}
E→•T {┤,+}
T→•T * F {┤,+,*}
T→•F {┤,+,*}
F→•(E) {┤,+,*}
F→•b {┤,+,*}
Stanje 1:
S→E• {┤}
E→E•+T {┤,+}
Stanje 2:
E→T• {┤,+}
T→T• * F {┤,+,*}

I slično za ostala stanja.