Arvutiteaduse instituut
  1. Kursused
  2. 2016/17 kevad
  3. Automaadid, keeled ja translaatorid (MTAT.05.085)
EN
Logi sisse

Automaadid, keeled ja translaatorid 2016/17 kevad

  • Pealeht
  • 6. Grammatikad ja lekser
    • Grammatika mõiste
    • Grammatika automaadid*
    • Lekseri soojendus
    • Kodutöö
    • Lisatöö
  • Moodle
  • Bitbucket
  • Slack
  • Projekt
  • Töövahendid
  • Õppekorraldus
  • Reeglid
  • Viited

6. kodutöö: AKTK lekser

Varsti alustame me kodutööde sarja, mille käigus on vaja luua erinevaid komponente ühe väljamõeldud keele translaatorile. Seda keelt nimetame me nimega AKTK (st. AKT keel). Tegemist on lihtsa imperatiivse, üldotstarbelise programmeerimisekeelega. Seda keelt tahame arendada töövahendiga ANTLR, aga selle pime kasutamine on väga ohtlik. ANTLR lubab ühes failis spetsifitseerida nii lekserit kui ka parserit, aga nad käituvad erinevatel põhimõtetel.

ANTLRi tööpõhimõtte arusaamiseks implementeerime käsitsi lekserit ja parserit. Sellejuures on lekseri implementeerimine palju piinarikkam, aga edasi lähevad meil asjad lihtsamaks. Antud kodutöös tuleb siis implementeerida lekser AKTK jaoks. Ülesanne põhi on kursuse repos uues projektis 02-handmade, kus tuleks lõpuni implementeerida Lexer.java.

AKTK programmides võivad esineda:

  • võtmesõnad if, while ja var;
  • märgita täisarvuliteraalid (nt. 3 või 34);
  • märgita murdarvuliteraalid (nt. 3.14, teaduslikku notatsiooni ei pea toetama);
  • sõneliteraalid (nt. "kala" või "Ta ütles \"Jah!\"");
    • selgituseks -- langkriipsuga tähistatakse teatud erisümboleid:
      • \n tähistab reavahetust
      • \t tähistab tabulaatorit
      • \" tähistab jutumärki
      • \\ tähistab langkriipsu
    • Pane tähele, et kui tekstfailis on kirjas sõneliteraal "a\nb", siis on tegemist nelja tähega ehk järgmine tähtede massiiv ['a', '\\', 'n', 'b']. Me tahame sellest saada sõne kolmest tähest koosnev sõne: ['a', '\n', 'b'].
  • muutuja nimed (nt. kala);
    • muutuja nime esimene sümbol peab olema täht (kasuta Character.isLetter) või allkriips, edasi võib tulla ka numbreid;
  • operaatorid +, -, *, /;
  • sulud ((, ));
  • kommentaarid (ühe- ja mitmerealised, nagu Javas);
  • lekseemide vahel võivad olla tühisümbolid (reavahetus, tühik ja tabulaator).

Lexer-i poolt genereeritava lekseemide jada lõpus peaks olema lekseem tüübiga EOF. Kommentaare ja tühisümboleid peab lekser ignoreerima, nendele vastavaid lekseeme ei ole ette nähtud.

Lekseemide kujutamiseks on mõeldud klassid Token ja TokenType. Token.data kohta käivad eeldused on kirjas TokenType-i juures.

Kokkuvõte

  • Esitada tuleb Lexer.java
  • Kõik testid avalikud, aga lõplik hinne paneb juhendaja. Kui lahendus töötab ainult nendel testidel, siis me palju punkte ei anna.
  • Põhipunktide jaoks tuleb implementeerida String-iga konstruktor ja readAllTokens. NB! Jäta ülejäänud meetodid alles ka siis, kui sa neid ei implementeeri!
    • Soovitus: kui sa kõiki lekseemide tüüpe ei oska tuvastada, siis tee need, mida oskad.
  • Boonuspunkti(de) jaoks tuleb lisaks implementeerida
    • readAllPositionedTokens (+1p)
    • Reader-iga konstruktor ja readNextToken (+1p)
  • 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.
Tartu Ülikooli arvutiteaduse instituudi kursuste läbiviimist toetavad järgmised programmid:
euroopa sotsiaalfondi logo