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

Automaadid, keeled ja translaatorid 2020/21 kevad

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