šansona o ljubavi i prijateljstvima šansona o starim putnicima o otrcanim refrenima šansona o ulicama i pločnicima izgubljena ili nađena na obalama Seine |
što živi u mome sjećanju što silazi na moju gitaru i svira mi onu pjesmu malu šansona sa stolnjaka od papira šansona što budi snove muzike bezazlene |
šansona o ljubavi i kajanju šansona što mami suze brbljavice iz kolibice šansona za Serge ili Edith stara ili jošneobjavljena u svakom slučaju poznata |
šansona tek obična pjesma za sva godišnja doba o vremenu što prolazi šansona koju zviždimo za sebe koju pjevušimo u pola glasa ili koju prihvaća gomila |
šansona tek obična pjesma za sva godišnja doba pomalo dosadna muzika šansona koju znam napamet koju najčešće pjevam kada me obuzmu misli sjetne (šansona) o ljubavi i prijateljstvima |
pjesme chansons (georges moustaki/sanja seljan) |
U ovom su poglavlju opisane gramatike - veoma značajni formalizmi za specificiranje jezika. Veći dio poglavlja posvećen je beskontekstnim gramatikama i jezicima.
Gramatike su jedna od najznačajnijih klasa generatora jezika. Ovdje će biti razmatrane klase gramatika koje se ponekad nazivaju gramatike Chomskog ili gramatike fraznih struktura.
Gramatika jezika L koristi dva disjunktna skupa znakova. To su skup neterminalnih znakova, često označen s N, i skup terminalnih znakova (alfabet), ozna#&269en s T. Skup terminalnih znakova osnova je za tvorbu rečenica jezika. Neterminalni znakovi nisu dio jezika. Koriste se u definiranju pravila za generiranje rečenica jezika.
Glavni dio gramatike jest konačan skup tvorbenih pravila ili produkcija, označenih s P, kojima je opisan način generiranja rečenica jezika. Produkcija je par nizova znakova iz skupa (Kartezijevog produkta)
(N U T)* N(N U T)*x (N UT)*
Prva komponenta je bilo koji niz koji sadrži najmanje jedan neterminalni simbol. Druga komponenta može biti bilo što, pa i prazan niz. Jezik definiran gramatikom je skup nizova znakova koji se sastoje samo od terminalnih znakova i mogu biti izvedeni počevši s jednim posebnim znakom iz N, najčešće označenim sa S. Prije nego što to pokažemo, evo definicije gramatike.
Definicija 2.1
Gramatika je četvorka G= (N,T,P,S), gdje su:
N konačan skup neterminalnih znakova,
T konačan skup terminalnih znakova (alfabet) uz uvjet da je T∩N=Ø,
P konačan skup parova nizova:
{(&alpha, &beta): &alpha=&alpha1&gamma&alpha2;&alpha1,&alpha2, &beta&epsilon (NUT) *, &gamma &epsilon N} (niz a je iz (NUT)+ i mora sadržati bar jedan znak iz skupa N),
S poseban znak iz N, S&epsilonN, nazvan početni znak (ili početni simbol).
Element (&alpha,β) iz P piše se &alpha&rarrβ i naziva produkcija. Simbol "&rarr" čita se "producira", "može biti zamijenjeno s" ili " preobličuje se u".
Primjer 2.1
Primjer gramatike je G= (N,T,P,S) , gdje su:
N = {A, S}
T = {0, 1}
P{(S, 0A1), (0A, 00A1),(A, ε)}
Početni simbol je S. Skup produkcija P moemo napisati i kao
S &rarr 0A1
0A &rarr 00A1
A → &epsilon
Ako P u nekoj gramatici sadrži produkcije:&alpha &rarr &beta1 ... &alpha &rarr &betan
piše se&alpha &rarr &beta1| &beta2|... |&betan
Znak "|" čita se "ili". &betai su alternative za α. Ako u P postoji produkcija oblika&alpha &rarr &epsilon | &beta | &beta&beta | &beta&beta&beta | ...
piše se &alpha &rarr {&beta}.Vitičaste zagrade omeđuju niz koji može biti izostavljen ili napisan jedanput, dvaput, triput, itd. Produkcija oblika:
&alpha &rarr &epsilon | β
piše se &alpha &rarr [&beta ].U daljnjem ćemo tekstu neterminale označivati velikim slovima, engl. abecede. Terminali će biti mala slova engl. abecede i ostali znakovi: (brojke, +,-,*,/, (, ), itd.). Neterminal na početku prve produkcije bit će početni simbol.
S &rarr &alpha1 | &alpha2 | ... |&alphan, &alphai &epsilon (N U T)*, i ≥ 1
i izabere se, proizvoljno, jedna alternativa za S. Na primjer, S&rarr&alpha1. Ako je alpha1&epsilonT*, dobiven je jedan niz iz jezika L(T), a ako je &alpha1&epsilon (NUT)+, bilo koji podniz od &alpha1, koji se pojavljuje na lijevoj strani u skupu produkcija, treba zamijeniti jednom od njegovih alternativa. Postupak se ponavlja u novo dobivenom nizu sve dok se ne dobije niz iz T*, a to je ujedno i niz iz L(T), jezika kojeg gramatika Ggenerira. Iscrpljujući sve mogućnosti takvog postupka na kraju bi se dobili svi nizovi koji tvore jezik L(T). Umjesto oznake L(T) često se koristi notacija čita se 'jezik generiran gramatikomG'.Primjer 2.2
Gramatika G= (N,T,P,S), gdje je P:
S &rarr OS | 1
generira jezik L(G)={1, 01, 001, >0001, . . . }={0nl: n≥0}. Na primjer, ako se za S izabere alternativa OS pa se S u tom nizu zamijeni s OS, dobije se niz 00S. Ako se potom za S izabere druga alternativa, konačno se dobije niz 001, jedan element jezika L(Q) .
Poslije neformalnog opisa načina generiranja rečenica jezika primjenom produkcija gramatike, slijede definicije kojima se uvodi notacija i relacije kojima je u potpunosti određeno izvođenje rečenica jezika.Definicija 2.2
Rečenična forma gramatike G= (N,T,P,S) definirana je rekurzivno:
1)Početni znak je rečenična forma.
2)Ako je &alpha&delta&gamma, gdje su &alpha,&gamma &epsilon (NUT)*, rečenična forma i &delta&rarr&beta P, tada je &alpha&delta&gamma također rečenična forma.
Rečenična forma koja ne sadrži nijedan neterminal naziva se rečenica.
Definicija 2.3
Nad skupom (NUT)* gramatike G= (N,T,P,S)definira se relacija =>, čita se "izravno izvodi", na sljedeći način: Ako je &alpha&delta&gamma niz iz (NUT)*i &delta&rarr&beta produkcija iz P, tada
&alpha&delta&gamma ==> &alpha&beta&gamma
Ako za &alpha0, &alpha1, ..., &alphan, &alphai&epsilon(NUT)*) , n≥l, vrijedi
&alpha0 ==> &alpha1 ==> ... ¨==> &alphan
tada je &alpha0 n==> &alphan niz izvođenja duljine n. Općenito se piše
&alphao * ==> &alphan, n≥0, &alphao + ==>; &alphan, n>0
i kaže da &alphao izvodi &alphan.
Shodno dvjema prethodnim definicijama jezik generiran gramatikom G može se napisati kaoL(G) = {&omega&epsilonT* : S* ==>&omega}
što čitamo: "Jezik L generiran gramatikom G jest skup rečenica dobivenih nizom svih mogućih izvođenja krenuvši od početnog simbola S ".Primjer 2.3
Gramatika s produkcijama:
E &rarr T | T+E
T &rarr F | T*F
F &rarr a | (E)
generira jednostavne aritmetičke izraze. Ako je E početni simbol, rečenične forme su:
E T F a T+E T*F+E (E) a+a a*a (a)
Primjer izvođenja:
E ==> T+E ==> T*F+E ==> F*F+E ==> a*F+E ==> a*a+E ==> a*a+T ==> a*a+F ==> a*a+a
što se može napisati i kao
E 8==> a*a+a ili E ==> a*a+a
Niz a*a+a je jedna rečenica jezika koji gramatika s danim produkcijama generira.
Definicija 2.4
Za gramatiku G=(N,T,P,S) kaže se da je:
1) Linearna zdesna ili tipa 3 ako je svaka produkcija iz P oblika
A → xB ili A &rarr x A,B&epsilonN, x &epsilon T*
Linearna slijeva ako je svaka produkcija iz P oblika
A → Bx ili A → x
Gramatika linearna zdesna naziva se regularna gramatika ako je svaka produkcija oblika
A → aB ili A → a A,B&epsilonN, a&epsilonT
i jedino je dopuštena produkcija S →&epsilon, ali se tada S ne smije pojavljivati niti u jednoj alternativi ostalih produkcija.
2) Beskontekstna ili tipa 2 ako je svaka produkcija iz P oblika:
A → &alpha A&epsilonN, &alpha&epsilon(NUT)*
3)Kontekstna ili tipa 1 ako je svaka produkcija iz P oblika
    &alpha → &beta
uz uvjet da je |&alpha|≤|&beta|
4) Bez ograničenja ili tipa 0 ako produkcije ne zadovoljavaju nijedno od navedenih ograničenja.
Jezik je bez ograničenja ako je generiran gramatikom tipa 0, kontekstan ako je generiran gramatikom tipa 1, beskontekstan ako je generiran gramatikom tipa 2 i regularan ako je generiran gramatikom tipa 3. četiri tipa gramatika i jezika uvedenih prethodnom definicijom nazivaju se hijerarhija Chomskog.Primjer 2.4
Na idućoj slici prikazana je silueta jednog objekta aproksimirana gramatikama tipa 3, 2 i 1, a tek u potpunosti opisana gramatikom tipa 0:
Primjer 2.5
Evo primjera regularne, beskontekstne i kontekstne gramatike, te gramatike bez ograničenja:
1) Regularna:
S → aS | bS | &epsilon
generira jezik L={a,b}* tj. regularni skup označen regularnim izrazom (a+b)*
2) Beskontekstna:
S → aSb | ab
generira jezik L= {anbn: n≥ 1}.
3) Kontekstna:
S → aSBC | abc CB → BC
bB → bb bC → bC
cC → cc
generira jezik L= {anbncn: n≥ 1}.
4) I, na kraju, primjer gramatike bez ograničenja:
S → CD
C → aCa | bCb | &epsilon
AD → aD
BD → bD
Aa → aA
Ab → bA
Ba → aB
Bb → bB
D → &epsilon
generira jezik L={ωω: ωε{a,b}*}
Definicija 2.5
Za beskontekstnu gramatiku G= (N,T,P,S) kaže se da je:
1)Rekurzivna slijeva ako P sadrži produkciju oblika
A → A &alpha &alpha&epsilon (NUT)+
2)Rekurzivna zdesna ako P sadrži produkciju oblika
A → &alpha A &alpha&epsilon (NUT)+
3)Rekurzivna ako P sadrži produkciju oblika
A → &alpha A &beta &alpha, &beta &epsilon (NUT)+
ili ako je istodobno rekurzivna slijeva i zdesna, ili ako nije rekurzivna, ali postoji implicitna rekurzija:
A +==> &alpha A &beta &alpha, &beta &epsilon (NUT)+
Gramatika rekurzivna slijeva, zdesna, odnosno, općenito rekurzivna, generira beskonačan jezik.
Primjer 2.6
Regularna gramatika iz prethodnog primjera:
S → aS | bS | &epsilon
rekurzivna je zdesna, a beskontekstna gramatika iz istog primjera:
S → aSb | ab
jest rekurzivna. Gramatika s produkcijama:
E → E+E | E*E | (E) | a
rekurzivna je "sa svih strana", tj. samo se kaže daje rekurzivna.
Definicija 2.6
Označeno uređeno stablo D je stablo izvođenja (ili stablo sintaksne analize) beskontekstne gramatike G(S)= (N,T,S,P) ako vrijedi:
1) Korijen od D označen je sa A.
2) Ako su D1, ..., Dk podstabla direktnih slijednika korijena i korijen od Di je označen sa Xi, tada je
S → X1...Xk
produkcija u P. Di mora biti stablo izvođenja za
G(Xi) = (N,T,P,Xi)
ako je Xi neterminal, odnosno Dii je čvor (list) označen sa Xi ako je Xi terminal.
3) Inače, ako je Di jedino podstablo korijena Di korijen od Di označen je sa &epsilon, tada je S→&epsilon produkcija u P.
Primjer 2.7
Primjeri stabala izvođenja gramatike G, definirane sa
S → aSbS | bSaS | &epsilon
dani su na sljedećoj slici:
a)
S
b)
S
|
&epsilon
d)
Definicija 2.7
Granica stabla izvođenja jest niz koji se dobije nastavljanjem oznaka listova (u uređenju slijeva nadesno).
Primjer 2.8
Granice stabala izvođenja iz prethodnog primjera jesu:
a) S b) &epsilon c)abab d) abab
Definicija 2.8
Neka je =(N,T,P,S) beskontekstna gramatika. Pisat ćemo
&alpha =1m=> ß
ako je &alpha= &omega A &gamma, ß= &omega&delta&gamma, &omega&epsilonT*, &delta&epsilon(NUT)* i A →&delta je produkcija u P. Odnosno, rečenična forma P dobivena je zamjenom prvog neterminalnog znaka slijeva u rečeničnoj formi &alpha . Izvođenje
&alphao *=1m=> &alpha1 *=1m=>... *=1m=> &alphan
je krajnje izvođenje slijeva za &alphan iz &alphao, u gramatici G.Ako je
S *=1m=> &alpha
&alpha se naziva lijeva rečenična forma. Definira se izvođenje zdesna i krajnje izvođenje zdesna, analogno izvođenju slijeva. Na svim mjestima umjesto ""lijevo"" treba stajati "desno", a oznaka "lm" prelazi u "rm".
Primjer 2.9
Neka je G gramatika s produkcijama
E → E+T|T T → T*F | F F → (E) | a
gdje je E početni simbol. Stablo izvođenja prikazano na sljedećoj slici predstavlja deset ekvivalentnih izvođenja rečenice a+a.
E
|
E + T
| |
T F
| |
F a
|
a
Krajnje izvođenje slijeva je:
E => E+T => T+T => F+T => a+T => a+F => a+a
a krajnje izvođenje zdesna:
E => E+T => E+F => E+a => T+a => F+a => a+a
Definicija 2.9
Kaže se da je beskontekstna gramatika G dvoznačna ako postoji najmanje jedna rečenica &omega u L(G)za koju postoji više od jednog različitog stabla izvođenja s granicom ω. To je ekvivalentno tvrdnji da je G dvoznačna gramatika ako postoji rečenica &omega u L(G) s dva ili više različitih krajnjih izvođenja slijeva (ili zdesna).
Primjer 2.10
Neka je G gramatika s produkcijama
E => E+E | E*E | (E) | a
G je dvoznačna. Na primjer, rečenica a*a+a može se dobiti s dva različita niza izvođenja slijeva:
1) E => E*E => a*E => a*E+E => a*a+E => a*a+a
2) E => E*E => E*E+E => a*E+E => a*a+E => a*a+a
1) Neterminalni simboli pišu se između znakova "<" i ">".
2) Umjesto "&rarr" koristi se simbol "::=" i čita "definirano je kao". Pišući neterminale između znakova "<" i ">" moguće je izborom njihovih imena uvesti "značenje" u produkcije, jer će nas imena podsjećati na vrstu rečenica koja će se generirati u nekom podjeziku.
Primjer 2.11
Sljedeća gramatika generira "jezik kaubojskih vlakova":
<kaubojski vlak> ::= <lokomotiva><požtanska kola><dodatak>
<dodatak> ::= {<putnička kola>}<kola za konje>|&epsilon
1) Terminalni simbol x prikazan je kao
→x→
2) Neterminalni simbol A prikazan je kao
→A→
3) Produkcija oblika
A → A1A2 . . . An Ai&epsilon (NUT)
predstavlja se dijagramom
→ A1 → A2 → → An
4) Produkcija oblika
A → A1|A2|. . . |An Ai&epsilon (N UT)
prikazuje se dijagramom
gdje je svaki Ai prikazan prema pravilima od (1) do (4). Ako je Ai= &epsilon, ta se alternativa prikazuje punom crtom.
5) Produkcije oblika
A → {B} i C → [D] B,D&epsilon (N UT)
prikazuju se dijagramima:
gdje su B i D prikazani dijagramima prema pravilima (1) do (4).
Primjer 2.12
Gramatika G s produkcijama P
A → x | (B) B → AC C → {+A}
generira jezik L(G) ={x,(x),((x)),...,(x+x),...}. Primjenjujući pravila (1) do (5), dobili bismo dijagrame
Često se u praksi pojednostavljuje pisanje sintaksnih dijagrama, posebno ako je nedvojbena razlika u pisanju terminala i neterminala. Na primjer, neterminali su riječi napisane malim slovima, a terminali su riječi napisane velikim slovima ili su to brojevi i ostali znakovi.Primjer 2.13
Formalizam pisanja produkcija u BNF-u također je jezik! Evo beskontekstne gramatike jezika BNF prikazane u pojednostavljenom zapisu sintaksnih dijagrama:
<BNF>
→ produkcija →
<produkcija>
→ neterminal → ::= &rarr alternativa &rarr
<neterminal>
→ < → niz znakova → > →
<alternativa>
→ &epsilon ------------------------------------------------------>
→ niz ----------------------------------------------------↑
→ { → alternativa &rarr }-----------------------------------↑
→ [ → alternativa → ]-----------------------------------↑
<niz>
→ znak →
↓→ neterminal →↑
gdje je <znak> znak alfabeta, a <niz znakova> izabrani skup znakova (slova, brojke).
1) Dane su dvije gramatike, G1= (N1,T1,S1,P1)i G2= (N2,T2,S2,P2), N1∩N2= Ø.
Definirajte gramatiku G koja generira jezik
L(G)= {&omega1&omega2:   &omega1&epsilonL(G1), &omega2&epsilonL(G2)}
2) Definirajte regularne gramatike koje generiraju jezik označen sljedećim regularnim izrazima:
a)(0)+(l)+
b)(00+ll+(01+10)(00+11)*(01+10))*
c) 01 ( ( (ab) *+ccc) *+x) *z
3) Definirajte gramatike jezika:
a) L1 = {1,2,3,4,5,6, ...}
b) L2 = {2,4,6,8,10,12,...}
c) L3 = {1,3,5,7,9,11, ...}
d) L4 = {4,8,12,16,20, ...}
e) L5 = {3,6,9,12,15,18,...}
f) L6 = {9,18,27,36,45,... }
4)Definirajte gramatiku jezika palindroma (nizova x koji imaju svojstvo da je x=xR) nad alfabetom A={a,b, c}.
5)Definirajte gramatiku jezika rimskih brojeva i, ii, iii, iv, v, ..., mmmcmxcviii, mmmcmxcix.
6)Definirajte gramatiku jezika:
a) L1= {xxR:x&epsilon{0,1,a,b}+}, gdje je xR reverzni niz niza x. Na primjer, u jeziku su: 00,11, aa, bb, ..., OalbblaO, itd.
b) L2= {anb2n: n≥l}
c) L3= {anbmcmdn: m≥l, ≥l}
7) Definirajte gramatiku jezika prijestupnih godina, od 2000. do 9996. godine. (Pazite, godine koje su djeljive sa 100 moraju biti djeljive i s 400 da bi bile prijestupne! Godina 2000.je bila         prijestupna, ali godine 2100., 2200. i 2300. nisu itd.)
8)Definirajte gramatiku jezika datuma napisanih u obliku DD.MM.GGGG, gdje su:
DD     - dan (01, 02, ..., 31)
MM     - mjesec (01, 02, ..., 12)
GGGG   - godina (2000 do 9999)
Na primjer, u jeziku su 01.01.2000 i 29.02.9996, a nisu 29.02.2100., 01.13.2000, itd.
9) Dana je gramatika:
S → aB | bA
A → a | aS | bAA
B → b | bS | aBB
Za niz aaabbabbba treba naći:
a) krajnje izvođenje slijeva
b) krajnje izvođenje zdesna
c) stablo izvođenja
10) Je li gramatika iz primjera 2.9 dvoznačna?
11) Definirajte gramatiku logičkih izraza u kojima će "varijable" biti f, t, x i y, "logičke operacije" # (negacija), $ (disjunkcija) i & (konjunkcija). Izraz može sadržavati i zagrade.
12) Analizirajte popis literature u nekoj knjizi ili stručnom časopisu i pokušajte definirati gramatiku pravila njihova pisanja (ako postoje!). Produkcije gramatike prikazite sintaksnim dijagramima u     kojima će neterminali biti riječi hrvatskoga jezika (na primjer, <ime>, <izdavač> itd.).