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!

6. lisatöö: Väike ANTLRi lisaharjutus

Siin on väike harjutus, millega võib eksamiks ette valmistada. Ülesanne on koodiarvude järgi väike, aga siin on täiesti vabad käed, kuidas andmed peab esitama. Ülesanne lahendamiseks vajalikud failid asuvad xtra6 paketis. Selleks tuleb implementeerida klassi FunListAst meetod processInput, aga selleks on vaja redigeerida ka vastav grammatika kaustas src/main/antlr.

Ülesanne sisendiks on eraldi ridadel kirjutatud funktsioonide definitsioonid. Definitsioonid on kõik sellisel kujul:

 sum(x, y) = x + y
 inc(x) = x +1
 f() = 100

Ta koosneb seega järgmistest osadest:

  • Funktsiooni nimi, mis koosneb ühest või enamast väiketähest. (Me testime siin ainult ladina tähtedega 'a'-'z'.)
  • Sulgudes parameetrite nimed, aga need tohivad olla ainult ühetähelised. Parameetrid on komaga eraldatud.
  • Võrdusmärk.
  • Liitmisavaldis. Avaldises võib siis lihtsalt esineda muutujad (ühetähelised), täisarvud ja kahe avaldise liitmist.

Grammatika ise ei ole väga keeruline ja esimesed testid lähevad läbi, kui grammatika on õige. Edasi peab aga tagastama mingisugune oma loodud AST klassid, mille ainus nõue on see, et nad kuidagi esindavad neid funktsioone. Nad peavad implementeerima järgmist liidest:

public interface IntFunction {
    public int apply(int... args);
}

Meie meetod peab seega tagastama selline Map funktsiooni nimedest sellistele objektidele, et me saaks vastavad funktsioonid rakendada:

  Map<String, IntFunction> funs = processInput("sum(x,y) = x + y");
  IntFunction sumFun = funs.get("sum");
  assertEquals(14, sumFun.apply(4, 10));

Mõned näited on veel testides. Ülesanne annab kokku kuni 4 kodutööpunkti, aga see on eelkõige mõeldud eksamiks ette valmistamiseks. Esitada tuleb moodle'is.

  • 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