Formaalne grammatika

Formaalseks grammatikaks nimetatakse informaatikas ja keeleteaduses formaalse keele täpset kirjeldust, mis tähendab keele kuuluvate stringide (sõne (informaatika)) määratlemist. Formaalses grammatikas on kaks põhilist kategooriat. Esimene neist, generatiivsed grammatikad tegeleb reeglitega kuidas keelde kuuluvaid stringe genereerida. Teine, analüütilised grammatikad tegeleb reeglitega kuidas on võimalik stringe analüüsida, et aru saada, kas see kuulub keelde. Lühidalt, analüütiline grammatika kirjeldab kuidas ära tunda stringe mis kuuluvad mingisse hulka, samal ajal kui generatiivne grammatika kirjeldab kuidas kirjutada ainult neid stringe, mis kuuluvad mingisse hulka.  Pikemalt artiklis Generatiivne grammatika Generatiivne grammatika koosneb reeglitest, mille abil konstrueerida stringe. Selleks, et genereerida keelde kuuluvat stringi tuleb alustada grammatika algussümbolist ning seejärel rakendada teisi sobivaid reegleid. Reegleid võib kasutada suvalises järjekorras ja suvaline arv kordi. Reeglite rakendamise tulemusena saadakse string, mis kuulub grammatikaga määratud keelde. Osad grammatikad võimaldavad saada sama stringi mitmel eri viisil reegleid kohaldades, neid grammatikaid nimetatakse mitmeseks. Grammatikat, mille abil saab kõiki stringe ainult ühtviisi reegleid rakendades genereerida nimetatakse üheseks. Näiteks võtame keele, milles on kaks tähte - a {\displaystyle a} ja b {\displaystyle b} ning 2 reeglit: 1. S → a S b {\displaystyle S\rightarrow aSb} 2. S → b a {\displaystyle S\rightarrow ba} Alustame S {\displaystyle S} -st mis on algussümbol. Valides esimese reegli, asendame me S {\displaystyle S} -i a S b {\displaystyle aSb} -ga ja saame stringi a S b {\displaystyle aSb} . Valides reegli 1 veel üks kord saame stringi a a S b b {\displaystyle aaSbb} ja seejärel rakendades reeglit 2 saame stringi a a b a b b {\displaystyle aababb} . Lühidalt kokkuvõttes oli tuletuskäik järgmine: S ⇒ a S b ⇒ a a S b b ⇒ a a b a b b {\displaystyle S\Rightarrow aSb\Rightarrow aaSbb\Rightarrow aababb} . Grammatikaga määratud keeleks on kõikide nende stringide hulk mida antud reeglite abil on võimalik genereerida: { b a , a b a b , a a b a b b , a a a b a b b b , . . . } {\displaystyle \left\{ba,abab,aababb,aaababbb,...\right\}} . Noam Chomsky pakkus 1950 aastatel välja formaalse grammatika definitsiooni. Grammatika G koosneb 4 komponendist: Mitteterminalide lõplikust hulgast N {\displaystyle N} Terminalide lõplikust hulgast Σ {\displaystyle \Sigma } , millel puudub ühisosa mitteterminalide hulgaga. Produktsioonireeglite lõplikust hulgast P {\displaystyle P} , igaüks kujul ( Σ ∪ N ) ∗ N ( Σ ∪ N ) ∗ → ( Σ ∪ N ) ∗ {\displaystyle (\Sigma \cup N)^{*}N(\Sigma \cup N)^{*}\rightarrow (\Sigma \cup N)^{*}} Lahtiseletatuna, iga produktsioonireegel seob ühe stringi teisega, vasakul pool peab olema vähemalt üks sümbol mitteterminalide hulgast. Juhul kui paremal pool on tühi string (string, milles ei ole ühtegi sümbolit), siis kasutatakse selle väljanäitamiseks sümbolit epsilon ( ϵ {\displaystyle \epsilon } ). Algussümbolist S {\displaystyle S} , mis sisaldub hulgas N {\displaystyle N} S ∈ N {\displaystyle S\in N} Tavaliselt viidatakse grammatikale kui nelikule: G = ( N , Σ , P , S ) {\displaystyle G=(N,\Sigma ,P,S)} . Formaalse grammatika G {\displaystyle G} poolt määratud keel ( L ( G ) {\displaystyle {\boldsymbol {L}}(G)} ) on defineeritud kui kõikide nende stringide hulk, mis koosnevad ainult sümbolitest hulgast Σ {\displaystyle \Sigma } ja mida on võimalik genereerida alustades algussümbolist S {\displaystyle S} ja seejärel rakendades produktsioone hulgast P {\displaystyle P} kuni sõnad koosnevad ainult terminalidest (ei leidu sümboleid mitteterminalide hulgast N {\displaystyle N} ). Nende näidete jaoks on formaalsete keelte spetsifitseerimiseks kasutatud set-builder notationi. Olgu meil grammatika G {\displaystyle G} , kus N = { S , B } {\displaystyle N=\left\{S,B\right\}} , Σ = { a , b , c } {\displaystyle \Sigma =\left\{a,b,c\right\}} , S {\displaystyle S} on algussümbol ja P {\displaystyle P} sisaldab järgmisi produktsioonireegleid: 1. S → a B S c {\displaystyle S\rightarrow aBSc} 2. S → a b c {\displaystyle S\rightarrow abc} 3. B a → a B {\displaystyle Ba\rightarrow aB} 4. B b → b b {\displaystyle Bb\rightarrow bb} Mõned näited keelde L ( G ) {\displaystyle {\boldsymbol {L}}(G)} kuuluvate stringide tuletamisest oleks: S ⇒ 2 a b c {\displaystyle {\boldsymbol {S}}\Rightarrow _{2}{\boldsymbol {abc}}} S ⇒ 1 a B S c ⇒ 2 a B a b c c ⇒ 3 a a B b c c ⇒ 4 a a b b c c {\displaystyle {\boldsymbol {S}}\Rightarrow _{1}{\boldsymbol {aBSc}}\Rightarrow _{2}aB{\boldsymbol {abc}}c\Rightarrow _{3}a{\boldsymbol {aB}}bcc\Rightarrow _{4}aa{\boldsymbol {bb}}cc} S ⇒ 1 a B S c ⇒ 1 a B a B S c c ⇒ 2 a B a B a b c c c ⇒ 3 a a B B a b c c c ⇒ 3 a a B a B b c c c {\displaystyle {\boldsymbol {S}}\Rightarrow _{1}{\boldsymbol {aBSc}}\Rightarrow _{1}aB{\boldsymbol {aBSc}}c\Rightarrow _{2}aBaB{\boldsymbol {abc}}cc\Rightarrow _{3}a{\boldsymbol {aB}}Babccc\Rightarrow _{3}aaB{\boldsymbol {aB}}bccc} ⇒ 3 a a a B B b c c c ⇒ 4 a a a B b b c c c ⇒ 4 a a a b b b c c c {\displaystyle \Rightarrow _{3}aa{\boldsymbol {aB}}Bbccc\Rightarrow _{4}aaaB{\boldsymbol {bb}}ccc\Rightarrow _{4}aaa{\boldsymbol {bb}}bccc} (Selgitus: loe L ⇒ i R {\displaystyle L\Rightarrow _{i}R} kui "L genereerib R-i kasutades selleks produktsiooni number i" ja genereeritud osa näidatakse iga kord rasvaselt) See grammatika defineerib keele L = { a n b n c n | n ≥ 1 } {\displaystyle L=\left\{a^{n}b^{n}c^{n}|n\geq 1\right\}} , kus a n {\displaystyle a^{n}} tähendab n arvust a {\displaystyle a} sümbolitest koosnevat stringi. Seega, see keel sisaldab stringe, milles on võrdne nullist suurem arv a {\displaystyle a} , b {\displaystyle b} ja c {\displaystyle c} stinge ning need sümbolid asuvad samas järjekorras. Jaak Henno. Formaalsed keeled, grammatikad ja translaatorid 2006. TTÜ Kirjastus. ISBN 9985-59-627-7.