Institute of Computer Science
  1. Courses
  2. 2019/20 spring
  3. Automata, Languages and Compilers (LTAT.03.006)
ET
Log in

Automata, Languages and Compilers 2019/20 spring

  • Ü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.

  • Institute of Computer Science
  • Faculty of Science and Technology
  • University of Tartu
In case of technical problems or questions write to:

Contact the course organizers with the organizational and course content questions.
The proprietary copyrights of educational materials belong to the University of Tartu. The use of educational materials is permitted for the purposes and under the conditions provided for in the copyright law for the free use of a work. When using educational materials, the user is obligated to give credit to the author of the educational materials.
The use of educational materials for other purposes is allowed only with the prior written consent of the University of Tartu.
Terms of use for the Courses environment