You are on page 1of 36

Interpretacija programa

Gramatike
Krunoslav Puljić
2015/2016
Gramatika
• Kao što se gramatika koristi u proučavanju
prirodnih jezika, tako se formalna
gramatika koristi u generiranju i analizi
znakova formalnog jezika
Definicija
• Kontekstno neovisna gramatika je
uređena četvorka G=(V,T,P,S), gdje je:
 V konačan skup nezavršnih znakova
 T konačni skup završnih znakova i VT=
 P konačan skup produkcija oblika A 
◦ A je jedan nezavršni znak
◦  je niz znakova skupa (VT)*
  može biti i prazni niz 
 S početni nezavršni znak
Oznake
• U formalnoj gramatici koriste se sljedeće oznake
 Velika slova A, B, C, D, E i S su nezavršni znakovi
gramatike
 Mala slova a, b, c, d, e, brojke i podebljani nizovi
znakova su završni znakovi
 Velika slova X, Y i Z su završni ili nezavršni znakovi
 Mala slova u, v, w, x, y i z označavaju nizove završnih
znakova
 Mala grčka slova,  i  označavaju nizove koji se
sastoje od završnih i nezavršnih znakova
Pravila
• Ako više produkcija ima isti znak na lijevoj
strani, te produkcije se pišu u istom retku s
jednim znakom na lijevoj strani, a različite
desne strane odvajaju se operatorom |
• Npr. produkcije
A->a
A->b
se spajaju u
A->a|b
Gramatika
• Konteksno neovisne gramatike koriste se
za definiranje sintakse programskih jezika
 Produkcije gramatike najčešće su u Backus-
Naurovom obliku (BNF oblik)
◦ BNF je sličan formalizmu konteksno neovisne
gramatike, osim malih razlika u formatu zapisa i
uvedenih pokrata
Gramatika za aritmetičke izraze
• G=(V,T,P,S)
 V = {E}
 T = {a, +, *, (, )}
 P = {EE+E | E*E | (E) | a}
 S=E
• Npr. E a
E E+E2 a+a
E E*E2 a*a
E E*E (E)*E (E+E)*E3 (a+a)*a
Relacija 
• Za zadanu gramatiku G=(V,T,P,S) definira
se relacija  nad nizovima skupa (VT)*
• Ako je A produkcija iz skupa P i ako su
 i  iz (VT)* onda vrijedi
A  .
• Niz  generira se neposredno iz niza
A primjenom produkcije A
Relacija *
• Neka su 1, ... , m nizovi u (VT)*, m1 i
neka je 12, 23, ... , m-1m
• Gramatika G generira niz m iz niza 1, što
se zapisuje pomoću relacije *
1*m
• Relacija * jest refleksivno i tranzitivno
okruženje relacije 
Relacija i
• Generira li gramatika niz  iz niza 
primjenom i produkcija, to zapisujemo kao
 i 
• Gramatika G=(V,T,P,S) generira jezik
L(G) = { w | w T* za koji vrijedi Siw}
• Niz w je u jeziku L(G) ako vrijedi:
 w se sastoji isključivo od završnih znakova
 w je moguće generirati iz početnog
nezavršnog znaka S
Kontekstno neovisni jezici
• Kontekstno neovisne gramatike generiraju
klasu kontekstno neovisnih jezika (KNJ)
• Klasa KNJ sadrži i jezike koji nisu regularni
 Npr. jezik N={wcwR}
◦ w iz (a+b)*
 Npr. jezik N={0n1n}
Jezik N={wcwR}
• Zadana je gramatika G=(V,P,T,S) gdje je
 V={S}
 T={a,b,c}
 P={S  aSa | bSb | c}
 S=S (S je početno stanje)
• Počevši od početnog nezavršnog znaka S i
primjenom produkcija P, G generira niz u kojem
se neposredno ispred i iza nezavršnog znaka S
nalazi isti znak a ili b
• Primjenom produkcija SaSa i SbSb nastaje
niz S * wSwR, gdje se w sastoji od znakova a i
b, dok je wR niz w napisan obrnutim redoslijedom
Jezik N={wcwR}
• Primjenom produkcija Sc generira se niz
koji se sastoji isključivo od završnih
znakova gramatike, pa gramatika G
generira nizove
S * wSwR * wcwR,
tj. jezik
L(G) = {wcwR} = N
Generativno stablo
• Stablo je generativno stablo za gramatiku
G=(V,T,P,S) ako vrijedi:
 Čvorovi stabla označeni su znakovima VT {}
 Korijen stabla označen je početnim nezavršnim
znakom S
 Unutrašnji čvorovi označeni su nezavršnim
znakovima AV
 Neka su n1, n2, ... , nk svi čvorovi djeca čvora n.
Ako je n označen znakom A, a n1, n2, ... , nk
znakovima X1, X2, ... , Xk, onda je A  X1X2...Xk
produkcija iz skupa P
Generativno stablo
(nastavak)

• Stablo je generativno stablo za gramatiku


G=(V,T,P,S) ako vrijedi:
 znakom  moguće je označiti samo list stabla
◦ List stabla označen znakom  jedino je dijete svog
roditelja
 Listovi stabla označeni su znakovima iz skupa
T{} i čitani s lijeva na desno čine generirani niz
jezika L(G)
Generativno stablo
• Neka gramatika G generira niz završnih
znakova w
 Relacija S * w vrijedi
akko
postoji generativno stablo za gramatiku G
čiji su listovi označeni isključivo znakovima niza
w i znakom 
Primjer - Generativno stablo
• Generativno stablo za gramatiku koja
generira jezik N={wcwR} , tj. niz aabbcbbaa
S
1 korijen je čvor 1
S
a 6 2 7 a unutrašnji čvorovi su 2 do 5
S
a 8 3 9 a
listovi su 6 do 14
S
b 10 4 11 b
S
b 12 5 13 b

14 c
Regularna gramatika
• Gramatika koja generira regularne jezike
naziva se regularna gramatika
 desno ili lijevo linearna gramatika

 Produkcije su “linearne”
◦ sadrže samo jedan nezavršni znak s desne strane
od 
 taj nezavršni znak mora biti skroz lijevo ili skroz desno
◦ s lijeve strane sve KNG imaju samo jedan
nezavršni znak
Desno linearna gramatika
• Gramatika je desno linearna (DLG) ako
sve produkcije imaju najviše jedan
nezavršni znak, i to na krajnjem desnom
mjestu
 AwB ili Aw
◦ A i B su nezavršni znakovi iz V
◦ Niz w je niz završnih znakova iz T*, proizvoljne
duljine i uključujući prazni niz
 AabcB Aabc AB A
Desno linearna gramatika
• Sve produkcije desno linearne gramatike
moguće je svesti na oblik AaB i A

 AabcB
◦ AaT1 T1bT2 T2cB
 Aabc
◦ AaT1 T1bT2 T2cT3 T3
 AB
◦ A”desne strane svih produkcija koje imaju s lijeve strane B”
Lijevo linearna gramatika
• Gramatika je lijevo linearna (LLG) ako sve
produkcije imaju najviše jedan nezavršni
znak, i to na krajnjem lijevom mjestu
 ABw ili Aw
◦ A i B su nezavršni znakovi iz V
◦ Niz w je niz završnih znakova iz T*, proizvoljne
duljine i uključujući prazni niz
Primjer
• Zadan je regularni izraz 0(10)*
 Desno linearna gramatika
◦ S  0A
◦ A  10A | 
 Lijevo linearna gramatika
◦ S  S10 | 0
Linearne gramatike
• Vrijedi:
 Jezik je regularan akko postoji DLG koja ga generira
 Jezik je regularan akko postoji LLG koja ga generira
• Lijevo i desno linearne gramatike su regularne
gramatike
 Moguće je izgraditi konačni automat koji
prihvaća isti jezik kao i zadana DLG ili LLG
Konstrukcija KNG (DLG) iz DKA
• Slijedi konstrukcija kontekstno neovisne
gramatike za regularni izraz zadan
determinističkim konačnim automatom
 RI pretvaramo u DKA preko e-NKA, NKA i
minimizacije DKA
 ustvari ćemo konstruirati desno linearnu
gramatiku
Konstrukcija KNG (DLG) iz DKA
• Regularni jezik je zadan pomoću DKA
M=(W,,,q0,F)
• Gradi se konteksno neovisna gramatika
G=(V,T,P,S) za koju vrijedi L(G)=L(M)
1. Skup T završnih znakova gramatike
jednak je skupu  ulaznih znakova DKA
2. Skup V nezavršnih znakova gramatike
jednak je skupu stanja DKA
Konstrukcija KNG (DLG) iz DKA
3. Početni nezavršni znak S gramatike
jednak je početnom stanju q0 DKA
4. Na temelju prijelaza DKA (A,a)=B iz
stanja A u stanje B za ulazni znak a,
gradi se produkcija AaB, gdje su A i B
nezavršni znakovi, a a je završni znak
5. Za sva prihvatljiva stanja AF grade se
produkcije A, gdje je A nezavršni
znak, a  je prazan niz
Primjer: KNG (DLG) iz DKA
DKA a b Gramatika G
S A B 1 SaA SbB S
A B A 0 AaB AbA
B S A 1 BaS BbA B
Q={S,A,B} V
={a,b} T
q0=S S
F={S,B} S B
Primjer: KNG (DLG) iz DKA
DKA a b Gramatika G
S A B 1 SaA SbB S
A B A 0 AaB AbA
B S A 1 BaS BbA B
• Npr. za niz aba koji se prihvaća:
• U DKA imamo S a A b A a B, BF, aba se prihvaća
• U G imamo S  aA  abA  abaB  aba
• Prihvaćaju se i npr. , aa, bbba
• Ne prihvaćaju se i npr. a, bbb
Konstrukcija NKA iz DLG
• Vrijedi tvrdnja:
 A * wB akko (A,w)=B
• Za jezik zadan DLG-om, koja ima odgovarajući
oblik produkcija, moguće je izgraditi NKA koji
prihvaća isti jezik
 AaB i A
◦ A i B su nezavršni znakovi, a je završni znak
 Nezavršni znakovi postaju stanja, završni su abeceda
 Ako postoji produkcija A onda je A završno stanje
 Na temelju produkcije AaB gradi se prijelaz
(A,a)=(A,a){B}
Primjer konstrukcije NKA iz DLG
• G=({V,B}, {s,b}, {VsB, BbB | sB | }, V)
• V definira varijablu, B definira brojke ili slova
• s označava jedno slovo, a b jednu brojku

• NKA M=({V,B}, {s,b}, , V, {B})


 s b
V {B}  0
B {B} {B} 1

• ustvari smo dobili DKA jer su skupovi jednočlani


DLG i NKA
• Moguće je izgraditi DKA koji prihvaća isti
jezik kao i zadana DLG
 DLG se može preurediti tako da su joj sve
produkcije oblika AaB i A
 Nakon toga primjeni se već opisani algoritam
izgradnje NKA iz zadane DLG
 NKA se pretvori u DKA
• DKA smo već ranije naučili pretvoriti u
DLG
e-NKA iz LLG
• Moguće je izgraditi konačni automat koji
prihvaća isti jezik kao i zadana LLG
 desne strane produkcija LLG se napišu
obrnutim redoslijedom
◦ tako će produkcije postati desno linearne
◦ generirane riječi će biti napokano napisane riječi
početnog jezika
 Na temelju dobivene DLG konstruira se NKA
koji prihvaća “naopake” riječi
 Na temelju NKA konstruiramo e-NKA koji
prihvaća jezik polazne LLG
e-NKA iz LLG
• e-NKA za LLG iz NKA za DDG generiramo
na sljedeći način:
 NKA preuredimo tako da ima samo jedno
završno stanje
◦ ako ih imamo više, napravimo e-prijelaze u
jednistveno novo završno stanje
 u e-NKA
◦ početno stanje definiramo kao jedinstveno završno
stanje iz NKA
◦ završno stanja definiramo kao početno stanje NKA
◦ funkciju prijelaza gradimo zamjenom smjera
usmerenih grana u NKA
LLG iz e-NKA
• konstruiramo e-NKA za jezik LR
• na temelju e-NKA konstruiramo DLG
• DLG pretvorimo u LLG
RJ  KNJ
• Klasa regularnih jezika je pravi podskup
klase kontesno neovisnih jezika
 Jezik N={wcwR} je konteksno neovisan, a nije
regularan
◦ Prema lemi o pumpanju za regularne jezike
 Svaki regularan jezik je konteksno neovisan
◦ Prema konstrukciji KNG (DLG) iz DKA

Konteksno neovisni
jezici KNJ
Regularni
jezici RJ
Literatura
• Siniša Srbljić: Jezični procesori 1 [JP1]
• Siniša Srbljić: Jezični procesori 2 [JP2]

You might also like