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

Automata, Languages and Compilers 2017/18 spring

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

  • 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