Upload
vanbao
View
231
Download
4
Embed Size (px)
Citation preview
Interpretacija programa
Krunoslav Puljić
2015/2016
Gramatika neograničenih produkcija
Kontekstno ovisna gramatika
Kontekstno neovisna
gramatika
Hijerarhija automata i gramatika
Regularna
gramatika
Turingov stroj
Linearno ograničeni automat
Potisni automat
Konačni
automat
Rekurzivno prebrojivi jezici
Kontekstno ovisni jezici
Kontekstno neovisni
jezici
Regularni
jezici
Leksička
analiza
Sintaksna
analiza
Semantička
analiza
Formalni jezici
• Znak – apstraktni pojam koji se ne definira
– 0, 1; a, b, c, d
• Abeceda – konačan skup znakova
– Binarna abeceda {0,1};
• Niz – konačan slijed znakova abecede pozicioniranih jedan do drugog
– Nizovi 001, 11010, 1100011 nad abecedom {0,1}
– Duljina niza |ω|
– Prazan niz ɛ
– Nadovezivanje nizova
Formalni jezici
• Formalni jezik - skup nizova nad abecedom
– Intuitivno: jezik je skup riječi
– Prazan skup L1 = { }
– Skup s jednim elementom: praznim nizom • L2 = { ɛ }
– Skup nizova u kojima je broj 0 i 1 paran
• L3 = { 00, 11, 0011, 1001, 1010, ... }
• L3 je zadan nad binarnom abecedom i nije konačan skup
– Skup svih mogućih nizova nad abecedom Σ
• L4 = Σ* = { ɛ, 0, 1, 00, 01, 10, 11, 000, 001, 010, ... }
• L4 nije konačan
Formalni jezici
• Operacije nad formalnim jezicima
– Unija L U N
– Presjek L ∩ N
– Razlika L – N
– Nadovezivanje L N
– Kartezijev produkt L
N
– Partitivni skup 2L – skup svih podskupova
– Kleeneov operator L*
– Kleeneov operator L+
– Komplement jezika Lc
Formalni jezici – Kleenov operator
• L2 = L L ; L3 = L L L
• L0 = { ɛ }; Li = Li-1 L
• L* = L0 U L1 U L2 U L3 U ...
• L+ = L1 U L2 U L3 U L4 U ...
Regularni jezici
• Jezik je regularan akko postoji konačni automat koji ga prihvaća – Za bilo koji regularan jezik moguće je izgraditi konačni
automat koji ga prihvaća
– Bilo koji konačni automat prihvaća jedan od regularnih jezika
• Regularni jezici su najjednostavniji jezici – ...jer je za njihovo prihvaćanje potrebno izgraditi
najjednostavniji automat – konačni
• Regularni izrazi – jednostavan način opisa regularnih jezika
Konačni automati
• Deterministički konačni automat (DKA) – Koristi se u leksičkoj analizi gotovo svih jezičnih procesora
• DKA se sastoji od konačnog skupa stanja i funkcije prijelaza – Funkcija prijelaza jednoznačno je određena znakom na
ulazu i stanjem u kojem se nalazi automat • Za pojedini znak i stanje postoji samo jedan prijelaz
– Jedno od stanja je početno stanje • Tu automat započinje svoj rad
– Ako DKA nakon pročitanih svih znakova niza x prijeđe u jedno od prihvatljivih (završnih) stanja, niz x se prihvaća
• Inače se ne prihvaća
DKA
• DKA prikazujemo dijagramom stanja ili tablicom prijelaza
DKA primjer
S
a Primjer:
Jezik L = { ɛ, a, a2, a3, ... } nad abecedom { a }
a*
Jezik L = { a, a2, a3, ... } nad abecedom { a }
a+
S2
a
S1
a
DKA
• DKA je uređena petorka (Q, ∑, δ, q0, F) gdje je
– Q – konačni skup stanja
– ∑ – konačan skup ulaznih znakova
– δ – funkcija prijelaza Q
∑ → Q
– q0 ∊ Q – početno stanje
– F ⊆ Q – skup prihvatljivih (završnih) stanja
DKA primjer
• Prikaz konačnog automata
pomoću usmjerenog grafa
• Koristi se i naziv dijagram
stanja
• Abeceda
D = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
• Jezik
L = { riječi “djeljive s 3” }
L = { ɛ, 0, 3, 6, 9, 12, 15, ... }
• dozvoljene vodeće nule
npr. 003
• L je podskup od D*
D
J S
1, 4, 7
2, 5, 8
0, 3, 6, 9
2, 5, 8
1, 4, 7
2, 5, 8
1, 4, 7
0, 3, 6, 9
0, 3, 6, 9
DKA primjer
Q = { S, J ,D }
∑ = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }
Δ (J, 2) = S (npr.)
q0 = S
F = { S }
D
J S
1, 4, 7
2, 5, 8
0, 3, 6, 9
2, 5, 8
1, 4, 7
2, 5, 8
1, 4, 7
0, 3, 6, 9
0, 3, 6, 9
Sta
nje
Ulazni znak Oznaka prihvatljivosti
0 1 2 3 4 5 6 7 8 9
S S J D S J D S J D S 1
J J D S J D S J D S J 0
D D S J D S J D S J D 0
Prikaz konačnog
automata pomoću
tablice prijelaza D
J S
1, 4, 7
2, 5, 8
0, 3, 6, 9
2, 5, 8
1, 4, 7
2, 5, 8
1, 4, 7
0, 3, 6, 9
0, 3, 6, 9
Funkcija prijelaza δ
• novo stanje = δ (staro stanje, ulazni znak)
• δ : Q
∑ → Q
Proširenje funkcije δ
• Definira se i δ’ : Q
∑* → Q.
– Određuje stanje DKA nakon što je pročitan niz
(riječ) w.
– ∑* je skup svih mogućih nizova ulaznih
znakova
• w, x, y, z će označavati ulazne nizove iz ∑*
• a, b, c, ... , 0, 1, 2, ... će označavati ulazne znakove
• p, q, ... će označavati stanja
Proširenje funkcije δ
• δ’(q,w) određuje stanje DKA nakon što je u
stanju q pročitan niz ulaznih znakova w
• δ’(q,w) se definira ovako:
1) δ’(q, ε) = q, gdje je ε prazni niz
2) za bilo koji niz ulaznih znakova w i za bilo
koji ulazni znak a vrijedi:
• δ’(q, wa) = δ(δ’(q, w) , a), gdje je w∊Σ*, i a∊Σ
Proširenje funkcije δ
• (1) kaže da DKA ne može promijeniti
stanje, a da ne pročita barem jedan ulazni
znak
• (2) definira kako se računa stanje u koje
prelazi DKA čitanjem niza znakova wa
Proširenje funkcije δ
• Ako u (2) uvrstimo w= ε, dobije se
– δ’(q, a) = δ’(q, εa) = δ(δ’(q, ε),a) = δ(q, a)
– Ako ne razlikujemo ulazni znak a∊Σ i niz a∊Σ *
duljine |a|=1, funkcije δ i δ’ imaju jednaku
vrijednost za sve one argumente za koje su
obje strane definirane
• Zato koristimo samo jednu oznaku (δ) za obje
funkcije
Prihvaćanje niza
• DKA dka=(Q, ∑, δ, q0, F) prihvaća niz x ako je
δ(q0, x)=p ∊ F
• DKA prihvaća skup
–L(dka) = { x ∊ Σ * : δ(q0, x) ∊ F }
–L(dka) ⊆ Σ *
• Za sve nizove koji nisu u L(dka) kažemo da
ih DKA ne prihvaća
Model konačnog automata
• Dijelovi DKA:
– Konačna ulazna traka
– Glava za čitanje
– Upravljačka jedinica
• Upravljačka jedinica pamti samo stanje u kojem se
nalazi (nema druge memorije)
– Upravljačka jedinica u stanju q pročita ulazni znak a s ulazne
trake, promijeni stanje u novo stanje δ(q, a) i pomakne glavu za
čitanje jedno mjesto u desno
– Ako je novo stanje prihvatljivo, onda DKA prihvaća do tada
pročitani niz (ali bez znaka na kojem je pozicionirana glava za
čitanje)
• Pomakom glave izvan krajnje desne pozicije, prihvaća se ili ne prihvaća cijeli
niz ispisan na traci, ovisno o stanju u kojem se DKA nalazi
Upravljačka jedinica
Stanje
a1 ... ai ... an-1 Ulazna traka
Glava za čitanje
Model konačnog automata
• Usporedba s Turingovim strojem (za sada)
– Traka je konačna
– Sa trake se samo čita (nema pisanja)
– Glava ide samo u desno
• Čitanje znaka “potroši” taj znak s trake
Primjeri...
• Q = {pp, nn, pn, np}
• Σ = {0, 1}
• q0 = pp
• F = {pp, nn}
• δ(pp,1)=pn, δ(pp,0)=np, δ(pn,1)=pp, δ(pn,0)=nn,
δ(np,1)=nn, δ(np,0)=pp, δ(nn,1)=np, δ(nn,0)=pn
• DKA prihvaća sve nizove nula i jedinica koji imaju:
– paran broj jedinica i paran broj nula, ili
– neparan broj jedinica i neparan broj nula
Primjeri...
• DKA s prethodnog slajda se može prikazati i dijagramom stanja i tablicom prijelaza
np
pn pp
0
nn
0
1
1
1
0
1
0
0 1
pp np pn 1
pn nn pp 0
np pp nn 0
nn pn np 1
Prihvaćanje niza
• Postupak prihvaćanja niza
Prihvaćanje niza
• Tablica prijelaza i dijagram stanja
olakšavaju postupak prihvaćanja niza
Zadatak
• Implemetirajte DKA
– Koristite C++
• Dev-C++ ili Visual Studio ili vi i gcc
• Python, Java itd.
– Neka abeceda bude {0,1}, tj. podskup int-ova (enum)
– Stanja označite malim slovima engleske abecede
{a,b,c, ... ,z}, tj. podskup char-ova
– Sami osmislite kako ćete unositi funkciju prijelaza
– Zadajte i početno stanje i skup završnih stanja
• Provjerite da se radi o stanjima, te javite grešku
• ili ih ubacite u skup stanja ako ih nema
Zadatak
• Implemetirajte DKA
– Implementirajte učitavanje DKA iz datoteke
Minimizacija DKA
• Za bilo koji DKA moguće je izgraditi
proizvoljno mnogo drugih DKA koji
prihvaćaju isti jezik
– Ideja: izgraditi DKA s što manjim brojem
stanja
• Teorem: minimalni DKA je jedinstven
Istovjetnost stanja DKA
• Stanje p DKA M=() je istovjetno stanju p’
DKA M’=() akko DKA M u stanju p
prihvaća isti skup nizova kao i DKA M’ u
stanju p’
– Za bilo koji niz w skupa * mora vrijediti:
δ(p,w) i δ’(p’,w) su oba završna ili oba
nezavršna stanja
Istovjetnost stanja DKA
• Relacija istovjetnosti je tranzitivna
– Da bismo smanjili broj stanja zadanog DKA,
grupa istovjetnih stanja se zamijeni jednim
jedinstvenim stanjem
• Primjer: neka su p4 i p5 istovjetna stanja
c d
p1 p1 p4 0
p2 p3 p5 1
p3 p5 p1 0
p4 p2 p3 1
p5 p2 p3 1
c d
p1 p1 X 0
p2 p3 X 1
p3 X p1 0
X p2 p3 1
X p2 p3 1 postaje
višak
Istovjetnost DKA
• DKA M i M’ su istovjetni akko su istovjetna
njihova početna stanja q0 i q0’
Ispitivanje istovjetnosti stanja
• Istovjetnost stanja p i q svodi se na
ispitivanje dva uvjeta:
– Uvjet podudarnosti: p F i q F ili p F i q F
– Uvjet napredovanja: a mora vrijediti da su
stanja δ(p,a) i δ(q,a) istovjetna
Pronalaženje istovjetnih stanja
• Primjer:
c d
p0 p0 p3 0
p1 p2 p5 0
p2 p2 p7 0
p3 p6 p7 0
p4 p1 p6 1
p5 p6 p5 0
p6 p6 p3 1
p7 p6 p3 0
Pronalaženje istovjetnih stanja
• Nekoliko algoritama
• Algoritam 1: gradimo tablicu (korak 1)
– Za sve ulazne znakove gradimo poseban
stupac
– Par stanja za koji ispitujemo istovjetnost
upisuje se u prvi redak
c d
p0, p7
c d
p0 p0 p3 0
p1 p2 p5 0
p2 p2 p7 0
p3 p6 p7 0
p4 p1 p6 1
p5 p6 p5 0
p6 p6 p3 1
p7 p6 p3 0
Pronalaženje istovjetnih stanja
• Nekoliko algoritama
• Algoritam 1: gradimo tablicu (korak 2)
– Uvjet podudarnosti ispituje se za sve parove
stanja koje upisujemo u retke tablice
• Ako par nije podudaran, početna stanja nisu
istovjetna
• Ako je par podudaran određujemo nove
parove stanja ovisno o znaku abecede
u stupcu
c d
p0, p7 p0, p6
p3
p0 i p7 su oba
nezavršna pa su
podudarna
c d
p0 p0 p3 0
p1 p2 p5 0
p2 p2 p7 0
p3 p6 p7 0
p4 p1 p6 1
p5 p6 p5 0
p6 p6 p3 1
p7 p6 p3 0
Pronalaženje istovjetnih stanja • Nekoliko algoritama
• Algoritam 1: gradimo tablicu (korak 3)
– Za novi par postoje tri mogućnosti:
• Dva ista stanja
– Nema akcije
• Dva različita stanja koja su se već pojavila
– Nema akcije
• Dva različita stanja koja se još nisu pojavila
– Ubacujemo novi redak u tablicu
c d
p0, p7 p0, p6 p3
p0, p6 ubačen novi
redak
c d
p0 p0 p3 0
p1 p2 p5 0
p2 p2 p7 0
p3 p6 p7 0
p4 p1 p6 1
p5 p6 p5 0
p6 p6 p3 1
p7 p6 p3 0
Pronalaženje istovjetnih stanja • Algoritam 1: gradimo tablicu (korak 4)
– Ako se u prethodnom koraku ne pojavi niti
jedan novi redak u tablici, onda je par stanja
zapisan u prvom retku tablice istovjetan
• Kao i svi ostali parovi stanja zapisani u ostalim
recima tablice
– Zbog uvjeta napredovanja
– Ako postoji novi redak, vraćamo se na
korak 2
c d
p0, p7 p0, p6 p3
p0, p6 Stanja nisu
podudarna pa niti
početni par nije
istovjetan. KRAJ.
c d
p0 p0 p3 0
p1 p2 p5 0
p2 p2 p7 0
p3 p6 p7 0
p4 p1 p6 1
p5 p6 p5 0
p6 p6 p3 1
p7 p6 p3 0
Pronalaženje istovjetnih stanja • Provjerimo eventualnu istovjetnost stanja
p0 i p1
c d
p0, p1 podudarna stanja
c d
p0 p0 p3 0
p1 p2 p5 0
p2 p2 p7 0
p3 p6 p7 0
p4 p1 p6 1
p5 p6 p5 0
p6 p6 p3 1
p7 p6 p3 0
c d
p0, p1 p0, p2 p3, p5
p0, p2 podudarna stanja
p3, p5
c d
p0, p1 p0, p2 p3, p5
p0, p2 p0, p2 p3, p7
p3, p5
p3, p7
Pronalaženje istovjetnih stanja • Provjerimo eventualnu istovjetnost stanja
p0 i p1
c d
p0 p0 p3 0
p1 p2 p5 0
p2 p2 p7 0
p3 p6 p7 0
p4 p1 p6 1
p5 p6 p5 0
p6 p6 p3 1
p7 p6 p3 0
c d
p0, p1 p0, p2 p3, p5
p0, p2 p0, p2 p3, p7
p3, p5 podudarna stanja
p3, p7
c d
p0, p1 p0, p2 p3, p5
p0, p2 p0, p2 p3, p7
p3, p5 p6 p5, p7
p3, p7
p5, p7
Pronalaženje istovjetnih stanja • Provjerimo eventualnu istovjetnost stanja
p0 i p1
• budući da nema novih redaka u tablici, par
stanja u prvom retku prvog stupca je
podudaran
– kao i parovi stanja u ostalim recima prvog stupca
c d
p0 p0 p3 0
p1 p2 p5 0
p2 p2 p7 0
p3 p6 p7 0
p4 p1 p6 1
p5 p6 p5 0
p6 p6 p3 1
p7 p6 p3 0
c d
p0, p1 p0, p2 p3, p5
p0, p2 p0, p2 p3, p7
p3, p5 p6 p5, p7
p3, p7 p6 p3, p7 podudarna stanja
p5, p7 p6 p3, p5 podudarna stanja
Pronalaženje istovjetnih stanja • p0 i p1 su istovjetna, kao i p0 i p2
– zbog tranzitivnosti i komutativnosti su sva tri
stanja istovjetna p0 ~ p1 ~ p2
• uvedimo za njih oznaku A
• p3 i p5 su istovjetna, kao i p5 i p7
– zato su sva tri stanja istovjetna p3 ~ p5 ~ p7
• uvedimo za njih oznaku B
c d
p0 p0 p3 0
p1 p2 p5 0
p2 p2 p7 0
p3 p6 p7 0
p4 p1 p6 1
p5 p6 p5 0
p6 p6 p3 1
p7 p6 p3 0
c d
p0, p1 p0, p2 p3, p5
p0, p2 p0, p2 p3, p7
p3, p5 p6 p5, p7
p3, p7 p6 p3, p7 podudarna stanja
p5, p7 p6 p3, p5 podudarna stanja
Pronalaženje istovjetnih stanja • p0 ~ p1 ~ p2
• uvedimo za njih oznaku A
• p3 ~ p5 ~ p7
• uvedimo za njih oznaku B
c d
p0 p0 p3 0
p1 p2 p5 0
p2 p2 p7 0
p3 p6 p7 0
p4 p1 p6 1
p5 p6 p5 0
p6 p6 p3 1
p7 p6 p3 0
c d
A A B 0
A A B 0
A A B 0
B p6 B 0
p4 A p6 1
B p6 B 0
p6 p6 B 1
B p6 B 0
c d
A A B 0
B p6 B 0
p4 A p6 1
p6 p6 B 1
Nedohvatljiva stanja
– Red ToDo; Skup D, Done;
– Ubaci q0 u ToDo i u D;
– Dok ToDo nije prazan radi:
• Skini stanje s pocetka reda
• Ubaci ga u Done
• Pogledaj do kuda možeš doći iz tog stanja
• Ubaci nova stanja (not Done) u ToDo
• Ubaci sva stanja u D
– http://web.studenti.math.pmf.unizg.hr/~nuno/
ip/2015/
Zadatak
• Implemetirajte funkciju koja provjerava da li DKA
prihvaća zadanu riječ
– Riječ = niz (polje, vektor) znakova abecede
• string?
• Primjenite DKA na nekoliko jednostavnih
primjera, te provjerite da li automat prihvaća
zadane riječi