Eksami esimene ülesanne (alusosa)
Mõned näited eksami alusosa ülesandest asuvad paketis eval. Need on võetud eelmistest aastatest, aga pisut mugandatud, et oleks kooskõlas sellega, mis me nüüd tahame näha. Seega, nende harjutamine on parim viis ette valmistada eksami esimeseks ülesandeks. Eksami alusosa koosnebki ainult ühest ülesandest, eval, aga siin on ka mõned kasulikud lisaülesanded. Kui tahad väga täpset pilti, milline on eksami ülesanne, siis keskendu just eval meetoditele.
Meie näidiskeelte süntaksipuu klassid asuvad paketis toylangs, sest me tahame neid edaspidi ka kasutada. Eksami teine ülesanne on parsei kirjutamine, et me saaks needsamad tekstsisendi põhjal loodud. Siin on mõned avaldiskeeled, mille süntaksipuu ise peaks olema arusaadav. Näiteks aritmeetiliste avaldiste ja loogiliste avaldiste korral juba teame, mis keelega on tegemist. Ülejäänud keeled on aga parem tutvuda tervikuna ja need on meil siis eraldi eksami ettevalmistuslehe all.
BoolEvaluator.java
Siin tuleb töödelda etteantud tõeväärtustüüpi avaldise puu. Puu on moodustatud paketis bool oleva BoolNode klassi alamklasside isenditest. Puuga saab esitada loogilisi avaldisi, kus on muutujad (BoolVar), disjunktsioon (BoolOr), implikatsioon (BoolImp) ja eitus (BoolNot).
Tõeväärtusavaldiste puhul peab eval tagastama tõeväärtuse. Loogikatehete tähendus peaks olema teada (vähemasti koos Internetiga), aga muutujate kohta saab eval meetod parameetrina ette tõeste muutujate hulga. Seega on muutuja väärtus tõene siis ja ainult siis, kui ta kuulub sinna hulka.
RndEvaluator.java
Selles ülesandes tuleb väärtustada etteantud RndExp tüüpi avaldise puu. Puu on moodustatud tema alamklasside isenditest, mille definitsioonid on paketis randAst. Selles on meile tuttavatale aritmeetilistele operatsioonidele (RndAdd, RndNeg ja RndNum) veel lisaks ka RndFlip tüüpi vahetipp. Selle tipu juures tuleb juhuslikult valida (õiglase mündiviske põhjal) vasakpoolset või parempoolset alampuud.
- Meetod eval peab väärtustama avaldist etteantud mündi coin abil. See peab toimuma nii, et kui coin.getAsBoolean() tagastab true, siis valitakse vasakpoolset alampuud, vastasel korral valitakse parempoolset alampuud. Oluline on puu läbida ülalt-alla ja vasakult paremale, et mündi visked toimuks õigel ajal. (See on see loomulik viis, kuidas meie eval meetodid on siiamaani ka toiminud.
- Lisaharjutus! Meetod evalDistribution peab tagastama avaldise tulemuste tõenäosusjaotus. Siin eeldame, et valikud on kõik võrdse tõenäosusega (0.5 vasakule ja 0.5 paremale) ning kõik mündivisked on teineteisest sõltumatud.
NondetEvaluator.java
Nüüd meil avaldised, kus on teatud valikute tegemise võimalused. Puu on moodustatud paketis nondet oleva NdExpr klassi alamklasside isenditest. Puuga saab esitada mittedeterministlikke aritmeetilisi avaldisi, kus on arvud (NdNum), arvu üks liitmine (NdInc), korrutamine (NdMul) ja küsimusega valik (NdChoice).
- Meetod eval peab väärtustama avaldist etteantud oraakli oracle abil. See peab toimuma nii, et kui mingi valiku küsimuse question korral oracle.test(question) tagastab true, siis valitakse tõele vastav alampuu, vastasel korral valitakse väärale vastav alampuu.
- Lisaharjutus! Meetod evalAll peaks tagastama avaldise kõik võimalikud väärtused. Üks variant on kõik küsimusi kokku koguda ja siis väärtustada avaldist kõikide võimalike oraaklitega, aga parem on siin lihtsalt tagastada hulkasid ja neid kombineerida, näiteks {2,3} * {7,11} = {14, 21, 22, 33}.
Eksami terviknäited
Eksami näidetest saab nüüd juba väärtustamise osad lahendada! Neid on loetletud eksami lehel ja näha ka kursuse külgribas. Meie plaan oleks praktikumis Imp läbi lahendada, aga edasi võiks pigem üritada ise aru saada. Kirjeldustest aru saamine on ju ka oluline, muidu on see ainult 5-10 rida lünkade täitmist Visitori meetodites.