Harjoitukset 3 - 18.4.2016
Arviointi
Tästä demosta voi saada 0-6 pistettä ja 3 bonuspistettä, jotka täydentävät mahdollisesti puuttuvia pisteitä demoista 1 ja 2 niiden maksimipisterajaan asti.
Oppimistavoitteet
Tällä demokerralla oletamme sinun hankkivan käytännön kokemusta ohjelmointikielen jäsentämisestä. Tarkoituksenasi on oppia mm. seuraavat asiat
- Lausekkeen esittäminen AST:nä
- Lausekkeen jäsentäminen
- AST:n rekursiivinen läpikäynti ja syntaksiohjattu tulkinta
Tehtävä 1
Määrittele valitsemallasi kohdekielellä tietotyyppi, jolla on mahdollista esittää seuraavaa ebnf-syntaksia noudattava lauseke (tai vastaavanlaajuinen lauseke omasta lähdekielestäsi):
function = variable, "->", expression
expression = term | expression, "+" , term | expression , "-" , term ;
term = factor | term, "*" , factor | term , "/" , factor;
factor = constant | variable | "(" , expression , ")";
variable = "x" | "y" | "z";
constant = ( digit , {digit})
digit = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
Tehtävästä saa pisteen per olennaisesti erilainen AST:n esitystapa
1-2 pt
Tehtävä 2
Kirjoita tulkkifunktio Tehtävässä 1 määrittelemällesi AST:lle. Tulkin tulee muuntaa AST:n funktioproduktion isäntäkielen funktioksi(tai lähimmäksi vastaavaksi isäntäkielen konstruktioksi), joka kutsuttuna palauttaa AST:n määrittelemän funktion arvon.
Tehtävästä saa yhden pisteen mikäli ohjelmasi toimii oikein järkeville AST:lle ja kaksi pistettä, jos se toimii "hyvin" myös "rikkinäiselle" AST:lle.
1-2 pt
Tehtävä 3
Mitkä ovat tehtävissä 1 ja 2 määritellyn kielen lekseemit?
Luo tehtävien kielelle lekseri.
2 pt
Tehtävä 4
Luo tehtävien 1-3 kielelle jäsennin valitsemallasi tekniikalla.
2pt
Tehtävä 5 (★)
Luo yksinkertainen syntax-directed kääntäjä tehtävässä 1 määrittelemällesi AST:lle, käyttäen kohdekielenä harjoitustyösi kohdekieltä.
Kääntäjä saa tuottaa hyvin naiivia koodia. Jos teet esimerkiksi AMD64:llä, voit olettaa, että rekistereitä on riittävästi (virheilmoitus, jos ei ole) tai push/popata jokaisen muuttujan jokaista operaatiota varten erikseen pinosta. LLVM:n kanssa voit käyttää Villen LLVM-Eezyä (jos uskallat) tai tuottaa LLVM-IR:ää tekstitiedostoon.
3pt
Esimerkkivastauksia
Tämän demokerran esimerkkivastaus on tehty (Villen) luennolla 5.
Tässä myös opiskelijoiden vastauksia (suurkiitokset julkaisuluvasta!)
- Ilari Paananen: http://yousource.it.jyu.fi/ikpcompilers
- Henrik Paananen: https://yousource.it.jyu.fi/kate-demot-hp/kate-demot-hp
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.