Arvutiteaduse instituut
  1. Kursused
  2. 2019/20 kevad
  3. Automaadid, keeled ja translaatorid (LTAT.03.006)
EN
Logi sisse

Automaadid, keeled ja translaatorid 2019/20 kevad

  • Üldinfo
  • Eksami näidised
    • Imperatiivne Imp
    • Beebiprolog Bolog
    • Paralleelne Parm
    • Uskumatu Hulk
    • Dialektiline Dialoog
    • Puhas Pullet
    • Eestimaine Estolog
  • Kava
    • 1. Soojendus
    • 2. Regulaaravaldised
    • 3. Olekumasinad
    • 4. Avaldise struktuur
      • Avaldispuu läbimine
      • Eksami alusosa!
      • Pythoni avaldiste struktuur*
      • Java AST analüüs*
      • Regulaaravaldiste analüüs
      • Raskemad harjutused*
      • Halba teha ei täi*
      • Kodutöö
    • 5. Grammatikad ja lekser
    • 6. Käsitsi parsimine
    • 7. ANTLRiga töötamine
    • 8. Interpretaator
    • 9. Kompilaator
  • Bitbucket
  • Moodle
  • Fleep!

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.

  • Arvutiteaduse instituut
  • Loodus- ja täppisteaduste valdkond
  • Tartu Ülikool
Tehniliste probleemide või küsimuste korral kirjuta:

Kursuse sisu ja korralduslike küsimustega pöörduge kursuse korraldajate poole.
Õppematerjalide varalised autoriõigused kuuluvad Tartu Ülikoolile. Õppematerjalide kasutamine on lubatud autoriõiguse seaduses ettenähtud teose vaba kasutamise eesmärkidel ja tingimustel. Õppematerjalide kasutamisel on kasutaja kohustatud viitama õppematerjalide autorile.
Õppematerjalide kasutamine muudel eesmärkidel on lubatud ainult Tartu Ülikooli eelneval kirjalikul nõusolekul.
Courses’i keskkonna kasutustingimused