Eesti loogikute keel Estolog
x := 0; y := 1; a := (x JA y); b := (x VOI y); (KUI (x = y) SIIS a MUIDU b)
Estolog on tõeväärtustega arvutamise keel, kus saab lisaks kontrollida võrdust, moodustada tingimusavaldisi ning defineerida muutujaid. Seda kõike saab teha imeilusas eesti keeles! Keele abstraktne süntaks on rahvusvaheline (ehk suhteliselt igav), aga küll saame eesti keele omapäraga tegeleda põhiosa ülesandes...
Paremal on üks programm estologi (konkreetses) süntaksis. Selle näidisprogrammi käivitamise tulemus on true. Estolog oleks muidugi vastanud eesti keeles, aga kuna implementeerime Javas, siis saame tulemuseks Java tõeväärtustüüpi väärtuse.
AST
Estologi AST klassid paiknevad proovieksam.ast paketis. Keele konstruktsioone esitavad järgmised EstologNode alamklassid:
- EstologLiteraal, EstologMuutuja — tõeväärtusliteraal ja muutuja;
- EstologJa, EstologVoi — konjunktsiooni ja disjunktsiooni operaator;
- EstologVordus — kahe avaldise võrdsuse kontrollimise operaator;
- EstologKui — tingimusavaldis (ternaarne operaator);
- EstologDef — muutuja definitsioon;
- EstologProg — terviklik programm, mis koosneb definitsioonidest ja kehast ehk täpselt ühest avaldisest (mis pole definitsioon).
Klassis EstologNode on staatilised abimeetodid, millega saab mugavamalt abstraktse süntaksipuu luua. Nende abil saab ülaloleva näidisprogrammile vastava süntaksipuu ise ehitada:
prog( kui(vordus(var("x"), var("y")), var("a"), var("b")), def("x", lit(false)), def("y", lit(true)), def("a", ja(var("x"), var("y"))), def("b", voi(var("x"), var("y"))) )
Alusosa: EstologEvaluator
Väärtustamisele kehtivad järgmised nõuded:
- Binaarsed operaatorid jälgivad standardseid loogikareegleid.
- Tingimusavaldis on samuti standardne: sõltuvalt tingimuse väärtusest tuleb kasutada ühe või teise haru avaldise väärtust.
- Tingimusavaldise muidu-haru võib puududa (st on
null
). Kui sellise tingimusavaldise tingimus on väär, siis on tingimusavaldis tervikuna tõene. - Programmi väärtuseks on selle keha (mitte-definitsioonist avaldise) väärtus.
- Programmi definitsioonid tuleb väärtustada enne programmi avaldise väärtustamist, mis võib sisaldada viiteid defineeritud muutujatele.
- Programmi definitsioonid tuleb teostada selles järjekorras nagu nad listis on, kusjuures iga definitsiooni avaldis võib sisaldada viiteid eelnevalt defineeritud muutujatele.
- Esialgu pole defineeritud ühtegi muutujat. Defineerimata muutujate kasutamine peab viskama NoSuchElementException-i.
- Programmis on lubatud üht muutujat defineerida mitu korda, kusjuures muutuja väärtuseks on tema viimati defineeritud avaldise väärtus.
- Võib eeldada, et väärtustatav programm sisaldab ainult ühte EstologProg tippu, mis on kõige välimine, st ükski sisemine avaldis pole omakorda programm, millel on oma sisemised definitsioonid.
Põhiosa: EstologAst
a := kala JA lind; b := 0 = (kass VOI a NING kala); c := KUI a = b SIIS 1 MUIDU b JA c; KUI a SIIS KUI c SIIS kala MUIDU hiir
Estolog keele grammatika tuleb implementeerida failis Estolog.g4 ja parsepuust AST-i koostamine klassis EstologAst. Paremal on natuke pikem näide süntaktiliselt korrektsest programmist. Mõned muutujad on defineerimata, aga see ei ole süntaksanalüsaatori mure.
Süntaksile kehtivad järgmised nõuded:
- Literaaliks võib olla
1
või0
,1
esindab tõest väärtust ja0
väära väärtust. - Muutuja koosneb ühest või rohkemast ladina suur- või väiketähest.
- Binaarne operaator koosneb kahest avaldisest, millede vahel on operaator (
NING
,VOI
,JA
,=
), operaatorid on vasakassotsiatiivsed v.a.=
, mis ei ole üldse assotsiatiivne (s.t.a = b = c
ei ole lubatud). Kõige madalama prioriteediga onNING
, seejärel kasvavas järjekorrasVOI
,JA
,=
. Pane tähele, etNING
on madalama prioriteediga kuiVOI
, aga loogiline tähendus on tal sama kuiJA
-l. - Tingimusavaldis algab võtmesõnaga
KUI
, millele järgneb avaldis, seejärel võtmesõnaSIIS
, millele omakorda järgneb avaldis. Seejärel võib tulla võtmesõnaMUIDU
ning avaldis. Tingimusavaldis on madalama prioriteediga kui binaarsed operaatorid. Mitmesuse korral on muidu-haru seotud kõige viimase KUI-lausega (täpselt nagu Java if-laused). - Avaldistes võib kasutada sulge, mis on kõige kõrgema prioriteediga.
- Definitsioon koosneb muutujanimest, võtmesõnast
:=
ja avaldisest. - Programm koosneb definitsioonidest (mida võib olla ka null tükki) ja lõppavaldisest. Definitsioonid on omavahel ja lõppavaldisest eraldatud semikoolonitega (
;
). - Tühisümboleid (tühikud, tabulaatorid, reavahetused) tuleb ignoreerida.
Lõviosa: EstologCompiler
Estolog keele CMa-sse kompilaator tuleb implementeerida klassis EstologCompiler. Kompileeritud programmi käivitamise tulemus peab olema sama nagu siis, kui seda EstologEvaluatoriga väärtustada, st kehtivad kõik ülaltoodud väärtustamisreeglid. Tõeväärtused teisendame täisarvudeks CMaUtils.bool2int abil.
Kompileeritud programmidele kehtivad järgmised nõuded:
- Programmi (st selle mitte-definitsioonist avaldise väärtus) peab täitmise lõpuks olema stacki pealmine element.
- Stacki kasutus peab olema mõistlik:
- Defineeritud muutujate väärtused peavad paiknema stacki alguses defineerimise järjekorras; st esimesena defineeritud muutuja stacki aadressil 0, teisena defineeritud muutuja stacki aadressil 1 jne.
- Samanimelisele muutujale uuesti defineerimine peab väärtuse salvestama selle muutuja olemasolevale stacki aadressile, mitte kasutusele võtma uut.
- Programmi täitmise lõpuks ei tohi olla stackis muid üleliigseid väärtusi.
- Programmi täitmise algul on stack tühi. Defineerimata muutujate kasutamine peab viskama NoSuchElementException-i kompileerimise ajal.
x := 0; y := 1; a := (x JA y); b := (x VOI y); (KUI (x = y) SIIS a MUIDU b)
Paremal oleva programmi kompileerimisel saadud CMa koodi täitmise lõpuks peaks olema stack [0, 1, 0, 1, 1]
, kus esimesena on muutuja x
väärtus, teisena muutuja y
väärtus, kolmandana muutuja a
väärtus, neljandana muutuja b
väärtus ja viimasena kogu programmi väärtus.