You are on page 1of 52

Programski prevodioci 1

Lekcija – Parsiranje od dna ka


vrhu, prvi deo

©2006 Dragan Bojić 1


 Uvod
 BU parser u vidu potisnog automata
 SHIFT-REDUCE Parsiranje
 Konstrukcija LR(0) parsera
 Konflikti u SHIFT-REDUCE parsiranju

Programski prevodioci © 2006 Dragan Bojić 2


Pojam parsera
 Parser: algoritam koji utvrđuje, za
zadatu ulaznu sekvencu, da li pripada
jeziku zadate gramatike.
 Ako pripada, parser određuje izvođenje
posmatrane ulazne sekvence iz startnog
neterminala gramatike.

Programski prevodioci © 2006 Dragan Bojić 3


Strategije parsiranja
 Od vrha ka dnu (engl. top-down):
parser konstruiše stablo izvođenja
počev od korena ka listovima
 Od dna ka vrhu (engl. bottom-up):
parser konstruiše stablo izvođenja
počev od listova ka korenu

Programski prevodioci © 2006 Dragan Bojić 4


 Uvod
 BU parser u vidu potisnog automata
 SHIFT-REDUCE Parsiranje
 Konstrukcija LR(0) parsera
 Konflikti u SHIFT-REDUCE parsiranju

Programski prevodioci © 2006 Dragan Bojić 5


Potisni automat (pushdown automaton)

 Neformalno: potisni automat = konačni


automat + stek
 PA su jednako "jak" formalizam za opis
jezika kao bezkontekstne gramatike

Programski prevodioci © 2006 Dragan Bojić 6


Primer
1. <S> <S> <S> a
2. <S>  <S> b
3. <S>  <S> <S> <S> c
4. <S> d
a b c d -|
 SHIFT ACCEPT
<S> SHIFT SHIFT SHIFT
a REDUCE(1) REDUCE(1) REDUCE(1) REDUCE(1) REDUCE(1)
b REDUCE(2) REDUCE(2) REDUCE(2) REDUCE(2) REDUCE(2)
c REDUCE(3) REDUCE(3) REDUCE(3) REDUCE(3) REDUCE(3)
d REDUCE(4) REDUCE(4) REDUCE(4) REDUCE(4) REDUCE(4)

Programski prevodioci © 2006 Dragan Bojić 7


Rad potisnog automata
 Automat startuje sa definisanom startnom
konfiguracijom steka ().
 Automat skenira sekvencu koja se sastoji od ulaznih
simbola a,b,c,d,-| s leva na desno, znak po znak.
 U svakom koraku rada, akcija automata se određuje
čitanjem kontrolne tabele (reprezentuje kontrolnu
funkciju), za tekući vrh steka i tekući ulazni simbol (i
tekuće stanje, u slučaju da ima više stanja).
 Akcija se sastoji od ažuriranja ulaza, steka i stanja.

Programski prevodioci © 2006 Dragan Bojić 8


Formalna definicija potisnog
automata
 Potisni automat definisan je uređenom šestorkom (U,
Y, Ys, S, St, c) gde:
 U – skup ulaznih simbola. Primer: U = {a, b,c,d,-|}.
 Y – skup simbola steka. Npr. Y = {<S>,a,b,c,d,}.
 Ys – početna konfiguracija steka i definisana je
sekvencom simbola steka koja počinje simbolom .
Simbol  naziva se dnom steka.
 S – skup stanja potisnog automata. Primer: S =
{S0}. Napomena: nas interesuju isključivo potisni
automati sa jednim stanjem.
 St  S – startno stanje automata.

Programski prevodioci © 2006 Dragan Bojić 9


Formalna definicija potisnog
automata (nastavak)

 c: (U  {─┤})  Y  S  O predstavlja


kontrolnu funkciju koja za svaki ulazni
simbol (kojima se, iz praktičnih razloga,
dodaje marker kraja ulazne sekvence
─┤), svaki simbol steka i svako stanje
definiše određeni element skupa svih
mogućih operacija potisnog automata
O = Oy  S  Ou  {ACCEPT, REJECT},

Programski prevodioci © 2006 Dragan Bojić 10


Operacije potisnog automata
Nad stekom:
 Oy = {POP, PUSH(x), nepromenjen

stek} je skup mogućih operacija nad


stekom:
 POP označava skidanje jednog simbola

sa steka
 PUSH(x) označava stavljanje simbola

steka x na vrh steka

Programski prevodioci © 2006 Dragan Bojić 11


Operacije potisnog automata
 Nad ulaznom sekvencom:
 Ou = {ADVANCE, RETAIN}
 ADVANCE označava prelaz na sledeći
ulazni simbol
 RETAIN označava da se tekući simbol
ulaza ne menja

Programski prevodioci © 2006 Dragan Bojić 12


Operacije potisnog automata
 Za završetak rada:
 ACCEPT – kraj rada automata pri čemu
se ulazna sekvenca prihvata
 REJECT – kraj rada pri čemu se ulazna
sekvenca odbija

Programski prevodioci © 2006 Dragan Bojić 13


Operacije potisnog automata
Prema tome, svaka operacija automata sastoji se iz:
 određene operacije nad stekom
(ili ACCEPT/REJECT),
 promene stanja u određeno stanje s  S i
 određene operacije nad ulazom.

Programski prevodioci © 2006 Dragan Bojić 14


Algoritam rada potisnog automata
tekuće_stanje := St;
tekući_ulaz := prvi simbol ulazne sekvence;
tekući_stek := Ys;
loop
if c( tekući_ulaz, tekući_stek, tekuće_stanje ) = ACCEPT
then kraj rada uz prihvatanje ulazne sekvence;
else if c( tekući_ulaz, tekući_stek, tekuće_stanje ) =
REJECT
then kraj rada uz odbijanje ulazne sekvence
else
c(tekući_ulaz, tekući_stek, tekuće_stanje) je oblika (y,s,u);
primeniti na tekući_stek operaciju y;
tekuće_stanje := s;
primeniti na tekući_ulaz operaciju u;
end if
end loop;
Programski prevodioci © 2006 Dragan Bojić 15
Akcije u kontrolnoj tabeli BU parsera
Samo sledeće kombinacije se pojavljuju:
 ACCEPT - uspešan završetak parsiranja;
 REJECT - neuspešan završetak
parsiranja.
 SHIFT:
 PUSH(tekući_ulaz)
 ADVANCE
 REDUCE(p)
 POP x dužina desne strane p
 PUSH(leva strana p)
 RETAIN
Stanje se ne menja.
Programski prevodioci © 2006 Dragan Bojić 16
Primer rada potisnog BU parsera
Stanje steka: Preostali ulaz: Akcija
1.  dddaddacb-| SHIFT
2.  d ddaddacb -| REDUCE(4)
3.  <S> ddaddacb -| SHIFT
4.  <S> d daddacb -| REDUCE(4)
5.  <S> <S> daddacb -| SHIFT
6.  <S> <S> d addacb -| REDUCE(4)
7.  <S> <S> <S> addacb -| SHIFT
8.  <S> <S> <S> a ddacb -| REDUCE(1)
9.  <S> <S> ddacb -| SHIFT
10.  <S> <S> d dacb -| REDUCE(4)

Programski prevodioci © 2006 Dragan Bojić 17


Primer rada…
Stanje steka: Preostali ulaz: Akcija
11.  <S> <S> <S> dacb-| SHIFT
12.  <S> <S> <S> d acb -| REDUCE(4)
13.  <S> <S> <S> <S> acb -| SHIFT
14.  <S> <S> <S> <S> a cb -| REDUCE(1)
15.  <S> <S> <S> cb -| SHIFT
16.  <S> <S> <S> c b -| REDUCE(3)
17.  <S> b -| SHIFT
18.  <S> b -| REDUCE(2)
19.  <S> -| ACCEPT

Programski prevodioci © 2006 Dragan Bojić 18


Rad potisnog BU parsera
 u svakom koraku važi:
stek + ulaz = sentencijalna forma u
krajnje desnom izvođenju ulaza iz <S>
 parser potiskuje (akcija SHIFT) simbole
sa ulaza na stek dok ne kompletira
ručku
 SHIFT ≡ PUSH(tekući ulazni simbol),
ADVANCE
 tada se ručka zamenjuje levom stranom
smene (akcija REDUCE)
Programski prevodioci © 2006 Dragan Bojić 19
Parsiranje od dna ka vrhu (BU)
Koncept BU parsiranja
 Kod pristupa 'odozdo-nagore' parser otkriva
strukturu stabla izvođenja počev od listova
stabla nagore, određujući čvorove roditelja
prepoznavanjem leve strane smena na
osnovu poznate desne strane.

 redosled smena koje parser prepoznaje


tokom rada obrnut od redosleda pri krajnje
desnom izvođenju date sentence

Programski prevodioci © 2006 Dragan Bojić 20


Primer...
<S> rm <S>b rm <S><S><S>cb  rm
  
2 3 1
 rm<S><S><S><S>acb  rm <S><S><S> dacb  rm
 
4 4
 rm <S><S>ddacb rm <S><S><S>addacb rm
 
1 4
 rm <S><S>daddacb  rm <S>ddaddacb rm
 
4 4
rm dddaddacb

Programski prevodioci © 2006 Dragan Bojić 21


Pojam ručke (handle)
 Ručka sentencijalne forme  je pojava, u toj
sentencijalnoj formi, desne strane produkcije
koja je poslednja primenjena u krajnje
desnom izvođenju .

 Produkcija ručke je poslednja produkcija


primenjena u krajnje desnom izvođenju
sentencijalne forme.

 u prethodnom primeru, ručka za finalnu sentencu


je početno slovo d, a produkcija ručke je 4.

Programski prevodioci © 2006 Dragan Bojić 22


 Uvod
 BU parser u vidu potisnog automata
 SHIFT-REDUCE Parsiranje
 Konstrukcija LR(0) parsera
 Konflikti u SHIFT-REDUCE parsiranju

Programski prevodioci © 2006 Dragan Bojić 23


BU parsiranje po principu potiskivanja
i sažimanja (shift-reduce)

 Parser po principu potiskivanja i sažimanja


(engl. shift-reduce) predstavlja potisni
automat, koji je definisan:
 skupom ulaznih simbola
 skupom simbola steka
 početnim stekom i
 potisnom tabelom i kontrolnom
tabelom.

Programski prevodioci © 2006 Dragan Bojić 24


Primer SHIFT-REDUCE parsera
1.<S> <A><A><S>
2.<S> 
<S> <A> a a -|
3.<S> a
 <S> <A>11 ax  SHIFT REDUCE(2)
4.<A> a
<S> <S> REJECT ACCEPT
<A>11 <A>
12 a4 <A>11
SHIFT REJECT
ax a x REDUCE(4) REDUCE(3)
<A>12 <S> <A>
11 ax <A>12
SHIFT REDUCE(2)
a4 a4 REDUCE(4) REDUCE(4)
<S> <S> REJECT REDUCE(1)
(a)potisna tabela (b) kontrolna tabela
Programski prevodioci © 2006 Dragan Bojić 25
Elementi SR parsera
 Skup ulaznih simbola parsera sastoji se
od skupa terminalnih simbola zadate
gramatike proširenog simbolom -|.

Programski prevodioci © 2006 Dragan Bojić 26


Elementi SR parsera(...)
 Simboli parserskog steka obeležavaju vrste
potisne i kontrolne tabele.
 svaki simbol steka odgovara nekom gramatičkom
simbolu.
 simboli steka kodiraju i dodatne informacije, o
kojima će biti reči pri razmatranju konstrukcije
parsera. Ove informacije su potrebne radi
jednoznačnog određivanja parserskih aktivnosti;
 zbog postojanja ovih dodatnih informacija, više
različitih simbola steka odgovara jednom istom
gramatičkom simbolu.

Programski prevodioci © 2006 Dragan Bojić 27


Elementi SR parsera(...)
 Potisna tabela određuje koji simbol
steka se u određenom trenutku
potiskuje na stek.
 Redovi potisne tabele označeni su
simbolima steka a kolone gramatičkim
simbolima.
 U svakom ulazu tabele nalazi se najviše
jedan stek simbol (prazni ulazi označavaju
grešku)

Programski prevodioci © 2006 Dragan Bojić 28


Elementi SR parsera(...)
 Kontrolna tabela određuje akciju parsera na
osnovu tekućeg simbola na vrhu steka i
tekućeg ulaznog simbola.
 Postoji četiri tipa parserskih akcija:
 ACCEPT - uspešan završetak parsiranja;
 REJECT - neuspešan završetak parsiranja.
 SHIFT (potiskivanje):
 PUSH(potisna_tabela[vrh_steka, tekući_ulaz])
 ADVANCE
 REDUCE(p)
 POP x dužina desne strane p
 PUSH(potisna_tabela[vrh_steka, leva strana p])
 RETAIN
Programski prevodioci © 2006 Dragan Bojić 29
Primer rada <S> <A>
 <S> <A>11 ax
a

a
SHIFT
-|
REDUCE(2)

SR parsera <S>
<A> <A>
<S> REJECT
SHIFT
ACCEPT
REJECT
11 12 a4 <A>11
ax a x REDUCE(4) REDUCE(3)
<A>
12 <S> <A>
11 ax <A>
12
SHIFT REDUCE(2)
a4 a4 REDUCE(4) REDUCE(4)
<S> <S> REJECT REDUCE(1)

sadržaj steka preost. ulaz akcija parsera


1.  aa-| SHIFT
2. ax a-| REDUCE(4)
3. <A>11 a-| SHIFT
4. <A>11a4 -| REDUCE(4)
5. <A>11<A>12 -| REDUCE(2)
6. <A>11<A>12<S>1 -| REDUCE(1)
7. <S>0 -| ACCEPT
 Uvod
 BU parser u vidu potisnog automata
 SHIFT-REDUCE Parsiranje
 Konstrukcija LR(0) parsera
 Konflikti u SHIFT-REDUCE parsiranju

Programski prevodioci © 2006 Dragan Bojić 31


Konstrukcija SR parsera za
LR(0) gramatike
 strategija odlučivanja se zasniva
isključivo na sadržaju steka.
 Ulazni simboli ne uzimaju se u obzir pri
odlučivanju.
 Značenje LR(0):
 ulaz se čita s Leva na desno;
 nalazi se desno (Rightmost) izvođenje
 gleda se 0 simbola na ulazu

Programski prevodioci © 2006 Dragan Bojić 32


Pojam LR(0) konfiguracije
(engl. configuration ili item)

 LR(0) konfiguracija predstavlja


gramatičku smenu sa dodatom tačkom
negde na desnoj strani
 A X1...Xi  Xi+1....Xn

Programski prevodioci © 2006 Dragan Bojić 33


Primer
 za gramatiku:
1. <S>  a
2. <S> ( <S> <R>
3. <R> , <S> <R>
4. <R> )

Programski prevodioci © 2006 Dragan Bojić 34


Primer
LR(0) konfiguracije 2. smene
 konfiguracija zatvaranja (tačka na početku)

<S>   ( <S> <R>


 bazične konfiguracije (tačka nije na početku):
<S>  (  <S> <R>
<S>  ( <S>  <R>
<S>  ( <S> <R> 
 druga oznaka za poslednju konfiguraciju
<R>3

Programski prevodioci © 2006 Dragan Bojić 35


Primer
 za praznu smenu <X>   jedna
konfiguracija, u oznaci
<X>    ili <X>  
 proširenje gramatike (uniformiše pravila
konstrukcije parsera)
0. <S’>  <S> ─┤

Programski prevodioci © 2006 Dragan Bojić 36


Konstrukcija karakterističnog LR(0)
automata – detektora ručki

 Stanja automata su skupovi


konfiguracija
 Iterativna konstrukcija grafa prelaza
koristeći operacije Closure0 i Goto0

Programski prevodioci © 2006 Dragan Bojić 37


Konstrukcija karakterističnog LR(0)
automata – detektora ručki

 Operacija Closure0 nad skupom


konfiguracija s:
 Closure0(s) = s{<B> |
<A><B>Closure0(s)}

<A>  <B> iterativno <A>   <B>...


<B>   1 <B>   <C>...
dodaje .
se . <C>   ...
<B>   i

Programski prevodioci © 2006 Dragan Bojić 38


Konstrukcija karakterističnog LR(0)
automata – detektora ručki

 Operacija Goto0 nad stanjem s i


ulaznim simbolom X:
 Goto0(s,X)=Closure0({<A> X |
<A> Xs}

...
X
<A>    X  <A>   X 
...

Programski prevodioci © 2006 Dragan Bojić 39


Algoritam konstrukcije
karakterističnog LR(0) automata
 Startno stanje detektora ručki se dobija kao
Closure0({<S’>  <S> ─┤}).
 Stanje S' u koje se prelazi iz nekog stanja S
pod ulazom X, dobija se kao rezultat
procedure GoTo0(S,X).
 Polazeći od startnog stanja, sistematski se
određuju prelazi za svaki ulazni simbol, što
generiše nova stanja.
 Ova stanja se procesiraju na isti način kao
startno, sve dok postoji neko neobrađeno
stanje.

Programski prevodioci © 2006 Dragan Bojić 40


Karakteristični automat za
gramatiku iz primera
<S’> –>  <S> --|

Programski prevodioci © 2006 Dragan Bojić 41


Karakteristični automat za
gramatiku iz primera
<S’> –>  <S> --|
<S> –> a
<S> –> (<S> <R>

Closure0

Programski prevodioci © 2006 Dragan Bojić 42


Karakteristični automat za
gramatiku iz primera
<S>0
<S’> –>  <S> --| <S>
<S> –> a <S’> –> <S> --|
startno <S> –> (<S> <R> a a1
stanje
<S>–> a 
(

(2
<S> –> ( <S> <R>
GOTO0 na

Programski prevodioci © 2006 Dragan Bojić 43


Karakteristični automat za
gramatiku iz primera
<S>0
<S’> –>  <S> --| <S>
<S’> –> <S> --|
<S> –> a
startno <S> –> (<S> <R> a a1
stanje
<S>–> a 

(2
<S> –> ( <S> <R>
<S> –>  a
<S> –>  (<S> <R>
CLOSURE0 na nova stanja

Programski prevodioci © 2006 Dragan Bojić 44


Karakteristični automat za
gramatiku iz primera
<S>0 --|0
<S’> –>  <S> --| <S> --|
<S’> –> <S> --| <S’> –> <S> --|
<S> –> a
startno <S> –> (<S> <R> a a1
stanje
<S>–> a 

( a

(2 <S>2
<S> –> ( <S> <R> <S> <S> –> (<S>  <R>
<S> –>  a <R> –>  , <S> <R>
<S> –>  (<S> <R> <R> –>  )
(

GOTO0 na nova stanja

Programski prevodioci © 2006 Dragan Bojić 45


Karakteristični automat za
gramatiku iz primera
<S>0 --|0
<S’> –>  <S> --| <S> --|
<S’> –> <S> --| <S’> –> <S> --|
<S> –> a
startno <S> –> (<S> <R> a a1
stanje
<S>–> a 

( a

(2 <S>2 <R>2
<S> –> ( <S> <R> <S> <S> –> (<S>  <R> <R> <S> –> ( <S> <R>
<S> –>  a <R> –>  , <S> <R>
<S> –>  (<S> <R> a <R> –>  ) ) )
4
<R> –> ) 
(
,3 , <S>3 )
( <S>
<R> –> ,  <S> <R> <R> –> , <S> <R>
<S> –>  a , <R> –>  ,<S><R>
<S> –>  (<S> <R> <R>–>  )
karakteristični automat
ujedno predstavlja <R> 3 <R>
<R> –> , <S> <R> 
potisnu tabelu parsera
Programski prevodioci © 2006 Dragan Bojić 46
Popunjavanje LR(0) kontrolne tabele
na osnovu karakterističnog automata
(razmatra se ulaz u vrsti V, kojoj odgovara skup
konfiguracija S):
 Ako S sadrži konfiguraciju oblika <X>    x , ulaz

treba popuniti akcijom SHIFT.


 Ako S sadrži konfiguraciju oblika <Y>   , odnosno

tačka se nalazi na kraju desne strane, ulaz treba


popuniti akcijom REDUCE(<Y>  ). Izuzetno, ako se
radi o nultoj smeni, akcija je ACCEPT.
 Vrste koje nisu pokrivene ni 1. ni 2. pravilom treba da

sadrže akciju REJECT.


 Ukoliko gornja pravila na jednoznačan način određuju

akciju za svaki ulaz kontrolne tabele, gramatika pripada


klasi LR(0).
Programski prevodioci © 2006 Dragan Bojić 47
Primer
<S> <R> ( , ) a ─┤
 <S>0 (2 a1 SHIFT
<S>0 ─┤ 0 SHIFT
─┤ 0 ACCEPT
a1 REDUCE(1)
(2 <S>2 (2 a1 SHIFT
<S>2 <R>2 ,3 )4 SHIFT
<R>2 REDUCE(2)
, 3 <S>3 (2 a1 SHIFT
<S>3 <R>3 ,3 )4 SHIFT
<R>3 REDUCE(3)
)4 REDUCE(4)
                                     
potisna tabela kontrolna tabela
Programski prevodioci © 2006 Dragan Bojić 48
 Uvod
 BU parser u vidu potisnog automata
 SHIFT-REDUCE Parsiranje
 Konstrukcija LR(0) parsera
 Konflikti u SHIFT-REDUCE parsiranju

Programski prevodioci © 2006 Dragan Bojić 49


Konflikti u SR parsiranju
 pri konstrukciji tabele mogu se pojaviti
konflikti:
 SHIFT/REDUCE, na primer, ako stanje sadrži
<X>  a 
<Y> a  b
 REDUCE/REDUCE, na primer, ako stanje sadrži
<X>  c 
<Y> d 

Programski prevodioci © 2006 Dragan Bojić 50


Konflikti u SR parsiranju
 prazne smene uvek izazivaju konflikt
=> LR(0) ne dozvoljava prazne smene
 <S’>   <S> ─┤
 <S>   a
 <S>  

Programski prevodioci © 2006 Dragan Bojić 51


Konflikti u SR parsiranju
 tada gramatika nije LR(0) i (teorijski)
nije moguće napraviti LR(0) parser;
 u praksi (yacc):
 S/R konflikt uvek razrešava u korist S, osim
ako se %prec direktivom eksplicitno ne
zada drugačije
 R/R konflikt (ozbiljniji problem) prema
redosledu navođenja smena

Programski prevodioci © 2006 Dragan Bojić 52

You might also like