Eksami alusosa
Eksami alusosa koosneb ainult ühest ülesandest: eval meetodi kirjutamine etteantud abstraktse süntaksipuuga keele jaoks. Eksami lehel on meil eelmistest aastatest hulganisti näidiskeeli, mille peal saab harjutada.
Repositooriumis paiknevad need näidiskeeled (ehk mängukeeled) toylangs paketis, kus on keelte kaupa alampaketid. Iga keele paketis on omakorda ast alampakett, mis sisaldab selle keele abstraktse süntaksipuu klasse ja visitori. Neid kasutame läbivalt ka ülejäänud eksami osade jaoks ja neis midagi muuta pole vaja. Alusosa ülesanne on vastavas Evaluator klassis: seesama eval meetod, mille peab implementeerima. Erinevate puu tippude tähendused on toodud vastava keele courses lehel. Lahenduse kontrollimiseks on vastav EvaluatorTest klass.
Aluskeeled
Enne eksami näidete lahendamist vaatame mõningaid eriti lihtsaid keeli, mis on aluseks eksami keeltele. Üks selline oli juba aritmeetiliste avaldiste keel expr, aga paketis week4.baselangs on mõned fundamentaalsed avaldiskeeled veel.
BoolEvaluator
Siin tuleb väärtustada etteantud tõeväärtustüüpi avaldise puu. Puu on moodustatud BoolNode klassi alamklasside isenditest ja nendega 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 jaoks 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
Selles ülesandes tuleb väärtustada etteantud RndNode tüüpi avaldise puu, mis on moodustatud tema alamklasside isenditest. Selles on meile tuttavatele aritmeetilistele operatsioonidele (RndAdd, RndNeg ja RndNum) veel lisaks RndFlip tüüpi vahetipp. Selle tipu juures tuleb juhuslikult valida (õiglase mündiviske põhjal) vasakpoolne või parempoolne alampuu.
Meetod eval peab väärtustama avaldist etteantud mündi coin abil. See peab toimuma nii, et kui coin.getAsBoolean() tagastab true, siis valitakse vasakpoolne alampuu, vastasel korral valitakse parempoolne alampuu. Oluline on puu läbida ülalt-alla ja vasakult paremale, et mündivisked toimuksid fikseeritud järjekorras. (See on see loomulik viis, kuidas meie eval meetodid on siiamaani ka toiminud.)
RndMaster
Vaatame nüüd natuke teistsuguseid "väärtustamise" võimalusi. Need on lisaharjutused, milletaolisi me eksamil me ei küsi. Vähemalt esimest vaatame praktikumides, et väärtustamise mõistet natuke laiemalt vaadata:
- Meetod evalNondeterministic peaks tagastama avaldise kõik võimalikud tulemusväärtused. Soovitame nii lahendada, et meetodi tagastustüüp on hulk ja siis tuleb lihtsalt hulkasid kombineerida, näiteks {2,3} + {7,11} = {9, 13, 10, 14}.
- Meetod evalDistribution peab tagastama avaldise tulemuste tõenäosusjaotus (kõik võimalikud tulemusväärtused koos nende esinemise tõenäosusega). Siin eeldame, et mündivisked on ausad (0.5 tõenäosus vasakule ja 0.5 paremale) ja teineteisest sõltumatud.
Eksami näited
Nüüd saab eksami näidetest väärtustamise osad juba lahendada! Need on loetletud eksami lehel ja ka kursuse külgribas. Plaan oleks praktikumis neist Imp läbi lahendada, aga edasi võiks iseseisvalt harjutada (nii palju kui ise tundub vaja, kõiki ilmtingimata ei pea). Kirjeldustest aru saamine on ka väga oluline, muidu on see ainult 5-10 rida lünkade täitmist Visitori meetodites.