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

Automata, Languages and Compilers 2020/21 spring

  • Üldinfo
  • Eksami näidised
    • Imperatiivne Imp
    • Beebiprolog Bolog
    • Paralleelne Parm
    • Uskumatu Hulk
    • Dialektiline Dialoog
    • Puhas Pullet
    • Eestimaine Estolog
    • Šokeeriv Sholog
    • Salliv Safdi
  • Videote loetelu
  • Kava
    • 1. Soojendus
    • 2. Regulaaravaldised
    • 3. Olekumasinad
    • 4. Avaldise struktuur
    • 5. Grammatikad ja lekser
    • 6. Käsitsi parsimine
    • 7. ANTLRiga töötamine
    • 8. Interpretaator
    • 9. Kompilaator
    • 10. Edasi!
  • Bitbucket
  • Moodle
  • Fleep!
  • Zoom!

Šokeerivate loogikaoperaatoritega Sholog

~b && (T \/ E1) + (foo || E2 /\ F)

Sholog on tõeväärtustega arvutamise keel, kus saab lisaks visata erindeid ja kasutada laiskasid (short-circuit) loogikaoperaatoreid.

AST

Keele AST klassid paiknevad toylangs.sholog.ast paketis ja nende ülemklassiks on ShologNode:

  • ShologLit – tõeväärtusliteraal;
  • ShologVar – muutuja;
  • ShologError – vea-avaldis koos täisarvulise veakoodiga (erind);
  • ShologEager – agaralt väärtustatavad binaarsed operaatorid (And, Or, Xor);
  • ShologLazy – laisalt väärtustatavad binaarsed operaatorid (And, Or).

Klassis ShologNode on staatilised abimeetodid, millega saab mugavamalt abstraktseid süntaksipuid luua. Ülalolev avaldis moodustatakse järgmiselt:

xor(land(xor(var("b"), lit(true)), eor(lit(true), error(1))), lor(var("foo"), eand(error(2), lit(false))))

Alusosa: ShologEvaluator

Klassis ShologEvaluator tuleb implementeerida meetod eval, mis väärtustab tõeväärtusavaldise etteantud väärtuskeskkonnas. Väärtustamisele kehtivad järgmised nõuded:

  1. Literaalid ja muutujad käituvad standardselt.
  2. Vea-avaldise väärtustamisel visatakse sama veakoodiga ShologException.
  3. Defineerimata muutuja väärtustamisel visatakse ShologException koodiga 127.
  4. Agarad operaatorid käituvad standardselt, kusjuures alati väärtustatakse mõlemad argumendid vasakult paremale.
    Näiteks eand(lit(false), error(1)) viskab väärtustamisel erindi koodiga 1.
  5. Laisad operaatorid käituvad standardselt, kuid teine argument väärtustatakse ainult siis, kui esimese argumendi väärtus ei määra juba tulemust ära (short-circuit väärtustamine).
    Näiteks land(lit(false), error(1)) ei viska väärtustamisel erindit, vaid tagastab false.

Põhiosa: ShologAst

Failis Sholog.g4 tuleb implementeerida grammatika ja klassis ShologAst tuleb implementeerida meetod parseTreeToAst, mis teisendab parsepuu AST-iks. Süntaksile kehtivad järgmised nõuded:

  1. Tõene literaal on T ja väär literaal F.
  2. Muutuja koosneb vähemalt ühest ladina väiketähest.
  3. Vea-avaldis koosneb sümbolist E ja sellele järgnevast täisarvust, mis on selle veakood. Sümboli E ja täisarvu vahel ei ole lubatud tühisümbolid.
  4. Binaarsed operaatorid koosnevad kahest avaldisest, mille vahel on operaator: agar ja laisk And on vastavalt /\ ja &&, Xor on +, agar ja laisk Or on vastavalt \/ ja ||. Kõik on vasakassotsiatiivsed ja kahanevas järjekorras on nende prioriteedid: And, Xor, Or.
  5. Lisaks on lubatud unaarne eitusoperaator ~, millele järgneb avaldis. Eitusoperaatori prioriteet on kõigist binaarsetest operaatoritest kõrgem ning see tuleb AST-is esitada olemasolevate konstruktsioonide kaudu, kasutades samaväärsust: ~x = x + T.
  6. Avaldistes võib kasutada sulge, mis on kõige kõrgema prioriteediga.
  7. Tühisümboleid (tühikud, tabulaatorid, reavahetused) tuleb ignoreerida.

Lõviosa: ShologCompiler

Klassis ShologCompiler tuleb implementeerida meetod compile, mis kompileerib tõeväärtusavaldise CMa programmiks. Kompileerimisele kehtivad järgmised nõuded:

  1. Tõeväärtused teisendatakse täisarvudeks CMaUtils.bool2int abil.
  2. Muutujate väärtused antakse stack’il etteantud järjekorras.
  3. Programmi täitmise lõpuks peab stack’i pealmine element olema avaldise väärtus, mis on sama nagu ShologEvaluator-iga väärtustades.
  4. Programmi veatu täitmise lõpuks tohivad stack’il olla ainult etteantud muutujate algsed väärtused ja arvutatud avaldise väärtus.
  5. Erindi viskamiseks lisatakse stack’i peale veakoodi vastandarv ja lõpetatakse programmi töö koheselt (HALT instruktsioon). Sel juhul peavad stack’ile alles jääma ka vahetulemused.
    Näiteks eand(lit(false), error(1)) lõpetab töö stack’iga [0, -1].
  6. Defineerimata muutuja korral programm kompileerub (st. ei viska kompileerimise ajal erindit), kuid lõpetab töö eelmises punktis kirjeldatud viisil, kasutades veakoodi 127.
    Näiteks eand(lit(false), var("jama")) lõpetab töö stack’iga [0, -127].
  • 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