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!)

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.