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

Automaadid, keeled ja translaatorid 2017/18 kevad

  • Üldinfo
  1. Õppekorraldus
  2. Eksam
  3. Reeglid
  4. Töövahendid
  5. Projekt
  • Kava
  1. Soojendus
  2. Regulaaravaldised
  3. Olekumasinad
  4. Lõplikud automaadid
  5. Avaldise struktuur
  6. Grammatikad ja lekser
  7. Käsitsi parsimine
  8. ANTLR intro
  9. AST loomine
  10. Interpretaator
  11. Semantiline analüüs
  12. Kompilaator
  • Moodle
  • Bitbucket
  • Fleep!

12. kodutöö: AKTK kompilaator

Viimases kodutöös tuleb kirjutada kompilaator (klassis AktkCompiler), mis loob etteantud AKTK programmi põhjal Java .class faili, mille main meetodi käivitamine teostab programmis näidatud operatsioonid.

AKTK programmide parsimise ja abstraktse süntaksipuu koostamise osa on ette tehtud. Sinu teha jääb abstraktse süntaksipuu põhjal Java klassi koostamine (meetod createClass).

ASM

Baitkoodi loomiseks soovitame kasutada ASMi.

Java baitkoodi ja ASMiga tutvumiseks on väga hea materjal ASMi juhend:

  • Soovitav on selle esimesed 64lk vähemalt läbi lapata.
  • Lehekülgedel 135-138 on lakooniline ülevaade JVM baitkoodidest — selle soovitame välja printida ja kodutöö lahendamise ajaks ligi võtta.
  • (Huvi korral saab kõige detailsemat infot Java virtuaalmasina spetsifikatsioonist.)

ASMi API on siin: http://asm.ow2.io/javadoc/overview-summary.html. Tähtsamad klassid selle kodutöö seisukohast:

  • ClassWriter: http://asm.ow2.io/javadoc/org/objectweb/asm/ClassWriter.html
  • MethodVisitor: http://asm.ow2.io/javadoc/org/objectweb/asm/MethodVisitor.html
  • Opcodes: http://asm.ow2.io/javadoc/org/objectweb/asm/Opcodes.html

Lisamärkused

  • Selles kodutöös tuleb AKTK väärtustest toetada vaid täisarve. Võib eeldada, et kompilaatori testimisel ei sisalda etteantud programmid sõneliteraale.
  • If ja while lause tingimusteks loeme vääraks täisarvu 0 ja tõeseks kõiki muid täisarve.
  • Kõik AKTK programmides kasutatavad funktsioonid on antud klassi AktkCompilerBuiltins staatiliste meetoditena. Võib eeldada, et AKTK programmis funktsioone ei defineerita.
  • Pane tähele, et AKTK abstraktne süntaksipuu ühtlustab tavapärased infiksoperaatsioonid ja harilikud funktsiooni väljakutsed ühe nimetaja alla (FunctionCall) — baitkoodi kompileerimisel tuleks neil vahet teha. Selle tarvis on klassi FunctionCall lisatud abimeetodid isComparisonOperator ja isArithmeticOperation — kui need meetodid tagastavad false, on tegemist hariliku funktsiooniväljakutsega.

Esitamine

Esitada tuleb fail AktkCompiler.java.

Lahenduse testimine

Lahenduse testimiseks kompileerib testimissüsteem klassi AktkCompiler abil mingi AKTK programmi, käivitab saadud .class faili ja kontrollib kas programmi väljund vastab oodatud väljundile. Kompileeritud klassi käivitamise protsess käsurealt näeks välja umbes selline:

 > java yks_pluss_yks
 2

Selleks, et Java leiaks üles AktkCompilerBuiltins klassi, on kõige lihtsam jooksvasse kausta tekitada kaust week12 ning kopeerida sinna vastav klassifail. Loomulikult võib nende asukoha näidata ka java -cp parameetriga (nt -cp .;build/classes/java/main).

Näiteprogrammid

Mõned AKTK näiteprogrammid, mille korrektse kompileerimisega peaks AktkCompiler hakkama saama:

Peaaegu kõige lihtsam programm, mis midagi teeb:

print(1+1)

Interaktiivne programm:

/* Küsib standardsisendist täisarvu ja väljastab selle märgi.
   Kordab seda niikaua kuni sisestatakse 0 */

var x = readInt();

while x != 0 do {
    if x > 0 then print(1) else print(-1);
    x = readInt()
};
print(x)

Suurima ühisteguri arvutamine kahel moel:

a = 234;
b = 12;

/* Arvutan suurima ühisteguri "standardteegi" abil */
print(gcd(a,b));


/* Nüüd arvutan sama asja aktk vahenditega */
var c;
while b > 0 do {
	c = a % b;
	a = b;
	b = c
};

print(a)

Vihjed

Ettevaatust! Järgnevatele linkidele klikkimine võib oluliselt vähendada selle kodutöö lahendamisest saadavat naudingut!

  • Vihje 1. Siin on ette tehtud klassi peaosa ning meetodi koodi genereerimise algus.
  • Vihje 2. Siin on lisaks ära toodud üks võimalik AST läbimise struktuur.
  • 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