4. Avaldise struktuur
Selle "nädala" jooksul valmistume eksami kõige tähtsamaks ülesandeks: avaldise väärtustamine. Kodutöö jaoks on kaks nädalat, mistõttu esimeses praktikumis harjutame pigem eksamiks ja teises keskendume kodutööle. Aga kodutöö lahendusidee peale võiks iseseisvalt mõelda juba enne teist praktikumi
- Eksami alusosa: abstraktse süntaksipuu väärtustamine. Eksami esimene ja kõige tähtsam ülesanne on kirjutada avaldise väärtustaja. Selleks tutvustame visitor mustrit puude läbimiseks ja lahendame eksami näidisülesandeid.
- Puu struktuur. Kõigepealt võiks natuke mõelda, miks me esitame avaldist puu kujul ja mis on erinevad puu läbimise võimalused.
- Eksami alusosa formaadi kohta on meil veel eraldi leht ja hulganisti näiteid eelmistest aastatest. Neist mõned lahendame praktikumis ning ülejäänud on iseseisvaks harjutamiseks. Kui asi on selge, siis ei pea kõiki näiteid läbi lahendama.
- Võid ka uurida Pythoni süntaksipuid. See on hea sissejuhatus Java AST lisatöö jaoks. Kuigi see ei ole eksami teema, siis soovitaks kõigil korraks neid lehti vaadata, et oleksite näinud ka päriskeelte puid.
- Kodutöö: regulaaravaldiste süntaksipuu töötlemine. Kodutöös on vaja teisendada regulaaravaldis automaadiks. Selleks on samamoodi vaja läbida puu visitori abil.
- RegexAnalyzer. Teeme mõned harjutused regulaaravaldise süntaksipuu peal.
- Kodutöö lahendamiseks on aega kaks nädalat, aga selle esimest osa tasub kindlasti uurida enne proovieksamit, sest see on ka puu struktuuri harjutus.
- Lisateemad: puu teisendamine ja korrektsus. Lõpuks on võimalik uurida mõningaid raskemaid ülesanded.
- Raskemad harjutused. Kui põhilised ülesanded on tehtud ja tundusid liiga lahjad, siis hakkame puid ka teisendama.
- Isabelle. Kui halba teha ei täi, siis võiksid formaalselt tõestada, et eelmise ülesande lahendus on ka korrektne!
Selle nädala eesmärk on juba väga fundamentaalne. Puu töötlemine rekursiooniga ei ole ainult niisama harjutus, vaid selles peitub kogu Tõde programmeerimise kohta! Me ei taha programmidesse suhtuda holistilise new-age lähenemisega, vaid süstemaatiliselt saada aru üksikosadest ja nende komponeerimisest. Süsteemi disaini jaoks on selline modulaarne mõtlemine väga kriitiline ja seda saab kõige paremini harjutada just puu ülesannete peal.
Näiteks, kui on vaja töödelda järgmise avaldise süntaksipuud: keeruline + megakeeruline
. Loenguvideotes sai mainitud, et jõuluvana pahandab, kui hakkad megakeerulises avaldises kontrollima, kas on viis jagamistehet: Ho-ho-ho, miks Sa üldse sinna vaatad?? Ho-ho-hoolitse siin liitmise eest! Meil hakkab nüüd läbiv teema olema, et tahame iga tipu juures sellele vastava loogika implementeerida seal ja ainult seal. Kui selleks on lisainfot vaja, siis see tuleb parameetrina kaasa anda!
Õigete parameetritega ja tagastusväärtustega abifunktsioonide väljamõtlemine on selle kodutöö peamine väljakutse. Ideaalne oleks, kui proovid vähemalt natuke ise mõelda, aga kui jääd hätta, siis võib praktikumijuhendajate või sõprade käest küsida. Jällegi palun arvestada, et vajaliku abifunktsiooni väljamõtlemine on peamine programmidisaini element selles ülesandes. Kui see on ette antud, siis ülejäänud on üsna mehaaniline...