4. Avaldise struktuur
Selle nädala jooksul valmistume eksami kõige tähtsamaks ülesandeks: avaldise väärtustamine. Selle teemakäsitluse ajal proovime ühes loengus ka sellist ülesannet harjutada täpselt sellisel kujul nagu see eksamil tuleb. Kodutöö jaoks on kaks nädalat, et ühes praktikumis harjutame pigem eksamiks ja teises lahendatakse kodutöö. Jällegi on väga oluline enne seda praktikumi üritada kõigepealt lahenduse idee ise mõelda.
- Eksam: Abstraktse süntaksipuu väärtustamine. Eksami esimene ja kõige tähtsam ülesanne on kirjutada avaldise väärtustaja. Selleks tutvustame visitorit puude läbimiseks ja lahendame eksami näidisülesandeid.
- Puu stuktuur. 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, kuhu kogume ka näited eelmistest aastatest. Kõik harjutused on muidugi kasulikud, aga kui aega on vähe, siis selle lehe esimene ülesanne on alusosa harjutamiseks hea mõtte.
- Võid ka uurida Pythoni süntaksit. See on hea sissejuhatus Java AST lisatöö jaoks. Kuigi see ei ole eksami teema, siis ma soovitaks kõigil korraks vaadata neid lehti, et oleksite ka näinud päriskeelte puid.
- Kodutöö: Regulaaravaldiste süntaksipuu töötlemine. Kodutöös on vaja teisendada regulaaravaldis automaadiks. Selleks on samamoodi vaja läbida puud visitori abil.
- RegexAnalyzer. Teeme mõned harjutused regulaaravaldise abstraktse süntaksipuu peal.
- Kodutöö tähtaeg on küll ülejärgmine nädal, aga selle esimene osa tasub kindlasti uurida enne proovieksamit, sest see on ka harjutus puu struktuuri peale.
- Lisateemad: Puu teisendamine ja korrektsus. Edasi on võimalik uurida mõned raskemad ülesanded, kus juba jõuame programmide korrektsuse tõestmiseni süsteemiga Isabelle.
- Raskemad harjutused. Kui põhikava ülesanded on tehtud ja tundusid liiga lahjad, siis hakkame puud ka teisendama.
- Isabelle. Kui halba teha ei täi, siis võiksid tõestada, et eelmise ülesanne 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 saame 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 ülesennete peal.
Võtame näiteks, kui on vaja töödelda järgmise avaldise süntaksipuud: keeruline + megakeeruline
. See ajab mind hulluks, kui näen lahendusi, kus hakatakse mõtlema, et mis nüüd saab, kui megakeerulises avaldises on viis jagamistehet? OMG, miks Sa üldse sinna vaatad?? Hoolitse siin liitmise eest! Meil hakkab nüüd üsna läbiv teema olema, et tahame iga tipu juures sellele vastav loogika seal implementeerida ja ainult seal. Kui on lisainfo vaja selleks, siis seda tuleb parameetrina kaasa anda!
Õige parameetritega abifunktsioonide väljamõtlemine on selle nädala kodutöö peamine väljakutse. Ideaalne oleks, kui proovid vähemalt natuke ise seda mõelda, aga kui jääd hätta, siis seda võib praktikumijuhendajate või sõprade käest küsida. Jällegi palun arvestada, et selle vajaliku abifunktsiooni väljamõtlemine on peamine programmidisaini element sellel ülesandel. Kui see on ette antud, siis ülejäänud on üsna mehhaaniline...