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.