PP04 LL (1) Gramatike
PP04 LL (1) Gramatike
T op-down algoritmi algoritmi koji sintaksno stablo kreiraju s vrha ka dnu, tj. ovi algoritmi pok#avaju da startni simbol gramatike preslikaju u kod koji analiziraju. Bottom-up algoritmi algortmi koji sintaksno stablo kreiraju s dna ka vrhu, tj. ovi algoritmi poku#avaju da ulazni kod redukuju na startni simbol gramatike.
3.
4.
5. 6.
U izvedenu sekvencu upisati startni simbol, proglasiti ga za tekuci u izvedenoj sekvenci i pro%itati prvi simbol iz ulaznog koda. Ukoliko je tekuci simbol u izvedenoj sekvenci neterminalni simbol, zameniti ga desnom stranom prve smene na %ijoj je levoj strani taj neterminalni simbol. Ukoliko je tekuci simbol u izvedenoj sekvenci terminalni simbol jednak teku'em ulaznom simbolu, prihvati ga (pre'i na analizu slede'eg simbola). Ukoliko je tekuci simbol u izvedenoj sekvenci terminalni simbol razli %it od teku'eg ulaznog simbola, poni#titi dejstvo poslednje primenjene smene. Ukoliko postoji jo# koja smena za preslikavanje istog neterminalnog simbola, poku #ati sa primenom slede'e smene, u suprotnom vratiti se jo# jedan korak nazad. Ukoliko se vra'anjem dodjemo do startnog simbola i ne postoji vi#e smena za njegovo preslikavanje, ulazni kod sadr i sintaksnu gre %ku. Ukoliko nakon prihvatanja poslednjeg ulaznog simbola, ni u izvedenoj sekvenci nema neobradjenih simbola, kod je sintaksno korektan.
Bilo koji top-down algoritam za sintaksnu analizu je primenljiv ukoliko gramatika ne sadr i levo-rekurzivne smene (kako direktne, tako i indirektne).
Indirektne levo-rekurzivne smene: U gramatici postoji indirektna leva rekurzija ukoliko postoji izvodjenje oblika:
X X
X ) Y Y) X|
Y ) 1 | 2 | 3
zameniti smenama:
X ) 1 | 2 | 3
a zatim se osloboditi direktnih levo-rekurzivnih smena (ukoliko postoje).
Primer 1:
Blok naredbi u jeziku Pascal definisan je slede 'im skupom smena: Blok begin NizNar end NizNar NizNar ; Naredba | Naredba Naredba Dodela | Blok Dodela ID := Izraz Izraz Izraz + CONST | CONST Metodom top-down proveriti da li je blok: begin ID := CONST end sintaksno korektno napisan.
Skup smena:
NizNar NizNar NizNar NizNar ; Naredba | Naredba Naredba NizNar ; Naredba NizNar |
zamenjujemo smenama:
2.
Skup smena:
Izraz Izraz Izraz Izraz + CONST | CONST CONST Izraz + CONST Izraz |
zamenjujemo smenama:
Korak 2: Analiza
LL(1) gramatike
n
LL(1) gramatike omogu'avaju top-down postupak sintaksne analize bez vra'anja. Osnovna ideja je da se ne poku#ava uvek sa primenom prve smene za preslikavanje teku'eg neterminalnog simbola, nego se pogleda slede'i simbol iz ulaznog niza i na osnovu toga odlu%i koja 'e se smena primeniti. Poreklo imena LL(1)
q q q
Ulazni niz se analizira s Leva na desno. Nalazi se Levo izvodjenje sintaksnog stabla. Pri odluci koja 'e se smena primeniti, pogleda se (1) naredni simbol iz ulaznog niza.
Za formalnu definiciju LL(1) gramatika potrebno je definisati funkcije FIRST i FOLLOW. Ukoliko postoji smena oblika X ) , defini#e se funkcija
FIRST() koja sadr i sve terminalne simbole koji mogu da se nadju na po %etku re%i izvedenih iz niza , tj. x FIRST() x Za svaki neterminalni simbol gramatike X defini#e se skup FOLLOW( X ) koji sadr i sve terminalne simbole koji u razvoju mogu da se nadju iza simbola X, tj. x FOLLOW( X) S X x, gde je S startni simbol gramatike.
Po definiciji FOLLOW funkcija startnog simbola gramatike sadr i grani%ni simbol #. Za odredjivanje FOLLOW funkcije neterminalnog simbola X posmatraju se desne strane smena u kojima se posmatrani simbol pojavljuje. Simbol X da desnoj strani smene mo e da se nadje u jednom od slede'ih koteksta: n Z X x xVT xFOLLOW(X) n Z XY YVN FIRST(Y)FOLLOW(X)
n
Z X FOLLOW(Z)FOLLOW(X)
Gramatika G jeste LL(1) gramatika ako i samo ako za svaki skup smena koji na levoj strani imaju isti neterminalni simbol va i:
1. 2.
FIRST(1) FIRST(2) FIRST(n) = Samo jedan od nizova 1, 2 , ,n se mo e preslikati u prazan niz *. Ukoliko se niz k preslikava u prazan niz, onda FIRST(1) FIRST(2) FIRST(k-1) FIRST(k+1) ... FIRST(n) FOLLOW( X )=
X ) 1 | 2 | | n
3.
Leva faktorizacija
n
Iz uslova 1. sledi da gramatika ne mo e biti tipa LL(1) ukoliko sadr i smene koje na levoj strani imaju isti neterminalni simbol na levoj i isti prvi simbol na desnoj strani, tj. LL(1) gramatika ne sadr i smene oblika: X ) Y1 | Y2 Ukoliko u gramatici postoje smene navedenog oblika, gramatika se transformi #e u LL(1) gramatiku tako #to se prikazani skup smena zamenjuje smenama: X ) Y X X ) 1 | 2 Navedena transformacija se naziva levom faktorizacijom.
2.
3.
U postupku se koriste 1 radni magacin koji %uva trenutno stanje u razvoju i niz koji pamti primenjene smene. Na po%etku analize se u radni magacin upisuje grani%ni simbol i startni simbol gramatike i pro%ita se prvi simbol iz ulaznog niza. Na osnovu simbola na vrhu radnog magacina i izdvojenog ulaznog simbola, odredjuje se akcija koju treba izv#iti. Sve mogu'e akcije zapam'ene su u LL(1) sintaksnoj tabeli. Korak 2 se ponavlja dok pro%itana akcija iz sintaksne tabele ne bude PRIHVATI (acc) ili GRESKA (err).
LL(1) sintaksna tabela ima onoliko vrsta koliko je ukupno neterminalnih i terminalnih simbola gramatike (ra unaju'i i grani%ni simbol kao fiktivni terminalni simbol) i onoliko kolona koliko je terminalnih simbola u gramatici. Elementi LL(1) sintaksne tabele su:
pop, acc, M ( A, a ) = (, i ) err ako je A = a (a VT ) ako je A = # i a = # ako je i - ta smena oblika A i (a FIRST ( ) ( FIRST ( ) a FOLLOW ( A))) u ostalim slu%lu%ajeima
Primfer 2:
n
Metodom LL(1) sintaksne anaize proveriti da li je blok definisan u primeru 1 sintaksno ispravno zapisan.
Analiza skupova smena koje na levoj strani imaju isti neterminalni simbol. I par takvih smena:
(3) NizNar ; Naredba NizNar (4) NizNar FIRST( ; Naredba NizNar ) = {;} FIRST( ) = { } FIRST( ; Naredba NizNar ) FIRST( ) = Samo jedna od navedenih smena se preslikava u prazan niz. FOLLOW( NizNar ) = FOLLOW( NizNar) = { end } FIRST( ; Naredba NizNar ) FOLLOW( NizNar ) =
q q
Naredba Naredba
Dodela Blok
FIRST( Dodela ) = { ID } FIRST( Blok ) = { begin } FIRST( Dodela ) FIRST( Blok ) = Ni jedna od navedenih smena se ne preslikava u prazan niz.
+ CONST Izraz
FIRST( + CONST Izraz ) = { + } FIRST( ) = { } FIRST( + CONST Izraz ) FIRST( ) = Samo jedna od navedenih smena se preslikava u prazan niz. FOLLOW( Izraz ) = { ;, end } FIRST(+ CONST Izraz ) FOLLOW( Izraz ) =