U računarstvu i lingvistici, **formalna gramatika**, ili ponekad jednostavno **gramatika**, jest precizan opis formalnog jezika - to jest, skupa nizova znakova (stringova). Dvije glavne kategorije formalnih gramatika su *generativne gramatike*, koje predstavljaju skup pravila za generiranje nizova znakova jezika, te *analitičke gramatike*, koje predstavljaju skup pravila za analizu pripadnosti niza znakova jeziku. Ukratko, analitička gramatika opisuje kako *prepoznati* kad je niz znakova u skupu, dok generativna gramatika opisuje kako *pisati* samo one nizove znakova u skupu.

Generativne gramatike
---------------------

Generativna gramatika se sastoji od skupa pravila za transformiranje nizova znakova koje zovemo *produkcije*. Prilikom generiranja niza znakova u jeziku započinjemo sa nizom znakova koji se sastoji od samo jednog *početnog znaka*, i potom uzastopno primjenjujemo pravila (bilo koji broj puta, u bilo kojem redoslijedu) u svrhu prepisivanja (engl. *rewrite*) niza znakova. Jezik se sastoji od svih nizova znakova koji mogu biti generirani na ovaj način.
Bilo koji pojedinačni slijed valjanih izbora pravila odabranih za vrijeme procesa prepisivanja daje neki pojedinačni niz znakova jezika, i ukoliko postoji više načina za generiranje jednog niza znakova, tada za gramatiku kažemo da je nejednoznačna.

Na primjer, pretpostavimo da se abeceda sastoji od znakova {\displaystyle a} i {\displaystyle b}, da je početni znak {\displaystyle S}, te da imamo sljedeće produkcije:

1. {\displaystyle S\rightarrow aSb}
2. {\displaystyle S\rightarrow ba}
tada započinjemo sa početnim nezavršnim znakom {\displaystyle S} te odabiremo produkciju koju nad njim primjenjujemo. Ako odaberemo prvu produkciju, zamjenjujemo {\displaystyle S} sa {\displaystyle aSb} te dobivamo međuniz {\displaystyle aSb}. Ako opet odaberemo prvu produkciju, zamjenjujemo {\displaystyle S} sa {\displaystyle aSb} te na taj način generiramo međuniz {\displaystyle aaSbb}. Ovaj proces ponavljamo sve dok međuniz ne bude sadržavao samo znakove iz abecede (tj. {\displaystyle a} i {\displaystyle b}). Ako sad odaberemo drugu produkciju, zamjenjujemo {\displaystyle S} sa {\displaystyle ba} pri čemu se generira niz znakova {\displaystyle aababb} i generiranje je završeno. Ovaj slijed odabira produkcija možemo konciznije zapisati koristeći simbole: {\displaystyle S\Rightarrow aSb\Rightarrow aaSbb\Rightarrow aababb}. Jezik ove gramatike je skup svih nizova znakova koji mogu biti generirani koristeći sljedeći proces: {\displaystyle \left\{ba,abab,aababb,aaababbb,...\right\}}.

### Formalna definicija

Klasičnu formalizaciju generativnih gramatika je prvi predložio Noam Chomsky 1950ih,, gramatiku *G* čine sljedeće komponente:

* Konačan skup {\displaystyle N} *nezavršnih znakova*
* Konačan skup {\displaystyle \Sigma } *završnih znakova* disjunktan sa skupom {\displaystyle N}
* Konačan skup {\displaystyle P} *pravila produkcija*, svako oblika

{\displaystyle (\Sigma \cup N)^{\*}N(\Sigma \cup N)^{\*}\rightarrow (\Sigma \cup N)^{\*}}
gdje je {\displaystyle {}^{\*}} Kleeneov operator i {\displaystyle \cup } označava uniju skupova. To jest, svaka produkcija preslikava jedan niz znakova u drugi, gdje prvi niz znakova sadrži barem jedan nezavršni znak. U slučaju da je drugi niz znakova prazni niz - tj. ne sadrži nijedan znak - simbol iz grčke abecede epsilon ({\displaystyle \epsilon }) se obično piše mjesto njega kako bi se izbjegla nejednoznačnost.
* Istaknuti znak {\displaystyle S\in N} je *početni nezavršni znak*.

Obično se takva formalna gramatika {\displaystyle G} konciznije zapiše kao uređena četvorka {\displaystyle (N,\Sigma ,P,S)}.

*Jezik*  formalne gramatike {\displaystyle G=(N,\Sigma ,P,S)}, označen sa {\displaystyle {\boldsymbol {L}}(G)}, je definiran kao skup svih onih nizova znakova nad {\displaystyle \Sigma } koji mogu biti generirani počevši od početnog nezavršnog znaka {\displaystyle S} i potom primjenjujući produkcije u {\displaystyle P} sve dok nijedan nezavršni znak nije prisutan u međunizu.

### Primjer

Promatrajmo gramatiku {\displaystyle G} where {\displaystyle N=\left\{S,B\right\}}, {\displaystyle \Sigma =\left\{a,b,c\right\}}, {\displaystyle S} je početni nezavršni znak, i {\displaystyle P} se sastoji od sljedećih produkcija:

1. {\displaystyle S\rightarrow aBSc}
2. {\displaystyle S\rightarrow abc}
3. {\displaystyle Ba\rightarrow aB}
4. {\displaystyle Bb\rightarrow bb}
Neki primjeri generiranih nizova znakova u {\displaystyle {\boldsymbol {L}}(G)} su:

* {\displaystyle {\boldsymbol {S}}\Rightarrow \_{2}{\boldsymbol {abc}}}
* {\displaystyle {\boldsymbol {S}}\Rightarrow \_{1}aB{\boldsymbol {S}}c\Rightarrow \_{2}a{\boldsymbol {Ba}}bcc\Rightarrow \_{3}aa{\boldsymbol {Bb}}cc\Rightarrow \_{4}aa{\boldsymbol {b}}bcc}
* {\displaystyle {\boldsymbol {S}}\Rightarrow \_{1}aB{\boldsymbol {S}}c\Rightarrow \_{1}aBaB{\boldsymbol {S}}cc\Rightarrow \_{2}a{\boldsymbol {Ba}}Babccc\Rightarrow \_{3}aaB{\boldsymbol {Ba}}bccc\Rightarrow \_{3}aa{\boldsymbol {Ba}}Bbccc}{\displaystyle \Rightarrow \_{3}aaaB{\boldsymbol {Bb}}ccc\Rightarrow \_{4}aaa{\boldsymbol {Bb}}bccc\Rightarrow \_{4}aaa{\boldsymbol {b}}bbccc}

(Bilješka o korištenoj notaciji: {\displaystyle L\Rightarrow \_{i}R} čitaj kao "*L* generira *R* korištenjem produkcije *i*" i generirani dio međuniza je svaki put masno otisnut (podebljan).)
Ova gramatika definira jezik {\displaystyle L=\left\{a^{n}b^{n}c^{n}|n\geq 1\right\}} gdje {\displaystyle a^{n}} označava niz znakova koji se sastoji od *n* uzastopnih znakova {\displaystyle a}. Dakle, jezik ove gramatike je skup svih nizova znakova koji se sastoje od jednog ili više znakova {\displaystyle a}, nakon kojih slijedi jednak broj znakova {\displaystyle b}, nakon kojih slijedi jednak broj znakova {\displaystyle c}.

### Chomskyjeva hijerarhija

*Glavni članak: Chomskyjeva hijerarhija*
Kada je Noam Chomsky prvi iznio formalizam generativnih gramatika 1956. klasificirao ih je u tipove danas poznate kao dio Chomskyjeve hijerarhije. Razlika između ovih tipova jest što imaju povećavajuće stroga produkcijska pravila i stoga mogu izraziti sve manje formalnih jezika. Dva važna tipa su kontekstno neovisne gramatike (tip 2) i regularne gramatike (tip 3). Jezici koji se mogu opisati ovakvim gramatikama se respektivno zovu kontekstno neovisni jezici i regularni jezici. Premda nešto manje moćne od gramatike neograničenih produkcija (tip 0), koje mogu izraziti bilo koji jezik koji prihvaća Turingov stroj, ova dva ograničena tipa gramatika su najčešće korištena jer se parser za njih može učinkovito implementirati. Na primjer, sve regularne jezike može prepoznati konačni automat, a za korisne podskupove kontekstno neovisnih gramatika postoje dobro poznati algoritmi za generiranje učinkovitih LL parsera i LR parsera koji prepoznaju odgovarajuće jezike koje gramatike generiraju.

#### Kontekstno neovisne gramatike

*Kontekstno neovisna gramatika* je gramatika u kojoj se lijeva strana produkcije sastoji samo od jednog nezavršnog znaka. Ovo ograničenje je netrivijalno; kontekstno neovisna gramatika ne može generirati sve jezike. One koje može zovemo *kontekstno neovisni jezici*.

Jezik definiran u gornjem primjeru nije kontekstno neovisan i ovo se može strogo dokazati koristeći svojstvo napuhavanja za kontekstno neovisne jezike, no npr. jezik {\displaystyle \left\{a^{n}b^{n}|n\geq 1\right\}} (barem jedan znak {\displaystyle a} nakon kojeg slijedi jednak broj znakova {\displaystyle b}) jest kontekstno neovisan, pošto ga generira gramatika {\displaystyle G\_{2}} sa {\displaystyle N=\left\{S\right\}}, {\displaystyle \Sigma =\left\{a,b\right\}}, pri čemu je {\displaystyle S} početni nezavršni znak, a produkcije su sljedeće:

1. {\displaystyle S\rightarrow aSb}
2. {\displaystyle S\rightarrow ab}
Kontekstno neovisni jezik može biti prepoznat u vremenu {\displaystyle O(n^{3})} koristeći algoritme kao što je Earleyev algoritam. Drugim riječima, za svaki kontekstno neovisni jezik se može izgraditi stroj koji na ulazu prima neki niz znakova i određuje u {\displaystyle O(n^{3})} vremenu pripada li niz jeziku, pri čemu je {\displaystyle n} duljina niza znakova. Nadalje, neki važni podskupovi kontekstno neovisnih jezika mogu biti prepoznati u linearnom vremenu koristeći neke druge algoritme.

#### Regularne gramatike

U regularnim gramatikama, lijeva strana produkcije je također isključivo jedan nezavršni znak, ali sad se postavlja ograničenje i na desnu stranu produkcije, na kojoj ne mora biti nijedan znak (u slučaju {\displaystyle \epsilon }-produkcije), može biti jedan završni znak, ili jedan završni znak nakon kojeg slijedi jedan nezavršni znak, i nijedan drugi niz znakova. (Ponekad se koristi nešto šira definicija po kojoj su dozvoljeni dulji nizovi završnih znakova ili samo jedan nezavršni znak i ništa drugo, i na taj se način pojednostavi označavanje iste klase jezika.)

Jezik prethodno definiran nije regularan, ali jezik {\displaystyle \left\{a^{n}b^{m}|m,n\geq 1\right\}} (barem jedan znak {\displaystyle a} nakon kojeg slijed barem jedan znak {\displaystyle b}, iako ne nužno isti broj puta) jest, pošto ga generira gramatika {\displaystyle G\_{3}} sa {\displaystyle N=\left\{S,A,B\right\}}, {\displaystyle \Sigma =\left\{a,b\right\}}, pri čemu je {\displaystyle S} početni nezavršni znak, a skup produkcija je sljedeći:

1. {\displaystyle S\rightarrow aA}
2. {\displaystyle A\rightarrow aA}
3. {\displaystyle A\rightarrow bB}
4. {\displaystyle B\rightarrow bB}
5. {\displaystyle B\rightarrow \epsilon }
Sve jezike koje generira regularna gramatika može u linearnom vremenu prepoznati konačni automat. Iako su u praksi regularne gramatike obično opisane regularnim izrazima, neki oblici regularnih izraza korištenih u praksi ne generiraju strogo regularne jezike i zbog tih otklona ne mogu biti prepoznati u linearnom vremenu.

### Drugi oblici generativnih gramatika

U posljednje su vrijeme razvijena mnoga proširenja i varijacije na izvornu Chomskyjevu hijerarhiju formalnih gramatika, kako od strane lingvista tako i od strane računalnih znanstvenika, obično u svrhu povećanja ekspresivne moći ili u svrhu lakše analize ili parsiranja. Neki oblici tako razvijenih gramatika uključuju:

* *Tree-adjoining* gramatike povećavaju ekspresivnost konvencionalnih generativnih gramatika dozvoljavanjem pravilima prepisivanja da operiraju na stablima parsiranja mjesto na običnim nizovima znakova.
* Afiksne gramatike i atributne gramatike dozvoljavaju pravilima prepisivanja da budu obogaćena semantičkim atributima i operacijama, što se pak pokazalo korisno za povećanje ekspresivnosti gramatike, kao i za izgradnju praktičnih alata za prevođenje (translaciju) jezika.

Analitičke gramatike
--------------------

Iako su algoritmi parsiranja jako dugo proučavani i njihova svojstva dobro shvaćena i dokumentirana u ogromnom literalnom korpusu, većina njih podrazumijeva da je jezik koji se parsira inicijalno *opisan* preko *generativne* formalne gramatike, te da je cilj generatora parsera transformirati tu generativnu gramatiku u parser. Strogo govoreći, generativna gramatika ni na koji način ne korespondira algoritmu korištenom za parsiranje jezika, i različiti algoritmi postavljaju različita ograničenja na oblik produkcija koje shvaćaju kao *dobro oblikovane*.

Alternativni pristup jest formalizacija jezika u obliku *analitičke gramatike*, koja pak puno izravnije korespondira strukturi i semantici parsera za jezik. Primjeri formalizama analitičkih gramatika uključuju:

* *The Language Machine*  izravno implementira neograničene analitičke gramatike (analitičke gramatike neograničenih produkcija). Supstitucijska pravila se koriste za transformiranje ulaza i generiranje izlaza i ponašanja. Sustav također može generirati lm-dijagram koji pokazuje što se događa prilikom primjene pravila analitičke gramatike neograničenih produkcija.
* *Top-down parsing language* (TDPL): minimalistički formalizam analitičkih gramatika razvijen u ranim 1970im u svrhu proučavanja parsera od vrha prema dnu.
* *Link grammar*: oblik analitičke gramatike dizajniran za lingvistiku koji izvodi sintaksnu strukturu proučavanjem pozicijskih odnosa parova riječi.
* *Parsing expression grammar* (PEG): poopćenje TDPL-a dizajnirano da zadovolji praktične potrebe ekspresivnosti programskih jezika i pisaca jezičnih procesora.

Izvori
------

1. 1 2  Chomsky, Noam, "Three Models for the Description of Language," *IRE Transactions on Information Theory*, Vol. 2 No. 2, pp. 113-123, 1956.
2. ↑  Chomsky, Noam, *Syntactic Structures*, Mouton, The Hague, 1957.
3. ↑  Grune, Dick & Jacobs, Ceriel H. *Parsing Techniques—A Practical Guide*, Ellis Horwood, England, 1990.
4. ↑  Earley, Jay, "An Efficient Context-Free Parsing Algorithm," *Communications of the ACM*, Vol. 13 No. 2, pp. 94-102, February 1970.
5. ↑  Joshi, Aravind K. *et al.*, "Tree Adjunct Grammars," *Journal of Computer Systems Science*, Vol. 10 No. 1, pp. 136-163, 1975.
6. ↑  Koster , Cornelis H. A. "Affix Grammars," in *ALGOL 68 Implementation*, North Holland Publishing Company, Amsterdam, p. 95-109, 1971.
7. ↑  Knuth, Donald E. "Semantics of Context-Free Languages," *Mathematical Systems Theory*, Vol. 2 No. 2, pp. 127-145, 1968.
8. ↑  Knuth, Donald E. "Semantics of Context-Free Languages (correction)," *Mathematical Systems Theory*, Vol. 5 No. 1, pp 95-96, 1971.
9. ↑  the language machine
10. ↑  Birman, Alexander, *The TMG Recognition Schema*, Doctoral thesis, Princeton University, Dept. of Electrical Engineering, February 1970.
11. ↑  Sleator, Daniel D. & Temperly, Davy, "Parsing English with a Link Grammar," Technical Report CMU-CS-91-196, Carnegie Mellon University Computer Science, 1991.
12. ↑  Sleator, Daniel D. & Temperly, Davy, "Parsing English with a Link Grammar," *Third International Workshop on Parsing Technologies*, 1993. (Revizija prethodnog papira.)
13. ↑  Ford, Bryan, *Packrat Parsing: a Practical Linear-Time Algorithm with Backtracking*, Master’s thesis, Massachusetts Institute of Technology, Sept. 2002.

Eksterni linkovi
----------------

* Godišnja konferencija o formalnim gramatikama Arhivirano 2007-10-08 na Wayback Machine-u

| Teorija automata: formalni jezici i formalne gramatike |
| --- |
| **Chomskyjevahijerarhija** | **Gramatike** | **Jezici** | **Minimalniautomat** |
| Tip 0 | Neograničenih produkcija | Rekurzivno prebrojiv | Turingov stroj |
| n/a | (nema uobičajenog imena) | Rekurzivni | Odlučitelj |
| Tip 1 | Kontekstno ovisna | Kontekstno ovisni | Linearno ograničen |
| n/a | Indeksirana | Indeksirani | Ugniježđenog stoga |
| Tip 2 | Kontekstno neovisna | Kontekstno neovisni | Nedeterministički potisni |
| n/a | Deterministička kontekstno neovisna | Deterministički kontekstno neovisni | Deterministički potisni |
| Tip 3 | Regularna | Regularni | Konačni |
| Svaka kategorija jezika ili gramatika je pravi podskup nadređene kategorije. |