Harjoitukset 4 - 25.4.2016

Pisteytys

Näistä demoista voi saada 0-6 pistettä.

Oppimistavoitteet

  • Tunnistat Harpermaisen syntaksitaulun ja osaat jotenkin lukea sellaista
  • Opit lisää AST:n esittämisestä
  • Osaat toteuttaa tyypintarkastuksen yksinkertaiselle lausekekielelle
  • Osaat toteuttaa ja käyttää symbolitaulua (let)

Syntaksikaaviot

Näissä demoissa tarkastellaan seuraavan syntaksikaavion mukaista kieltä:

Abstrakti muoto Syntaksi Selite
Typ τ ::= \(\text{num}\) Number Numerotyyppi
\(\text{str}\) String Merkkijonotyyppi
\(\text{bool}\) Bool Merkkijonotyyppi
Exp e ::= \(x\) x y tai z Muuttuja
\(\text{num}[n]\) n Numero
\(\text{str}[s]\) "s" Merkkijono
\(\text{bool}[b]\) b Totuusarvo
\(\text{plus}(e_1;e_2)\) \(e_1\) + \(e_2\) Yhteenlasku
\(\text{mul}(e_1;e_2)\) \(e_1\) * \(e_2\) Kertolasku
\(\text{cat}(e_1;e_2)\) \(e_1\) ++ \(e_2\) Yhteenlasku
\(\text{len}(e)\) \(e\).length() Merkkijonon mitta
\(\text{null}(e)\) null \(e\) Onko tyhjä?
\(\text{let}(e_1;x.e_2)\) let \(x\) be \(e_1\) in \(e_2\) Lokaali sidonta
\(\text{if}(e_1;e_2;e_3)\) if \(e_1\) then \(e_2\) else \(e_3\) Ehtolause

Taulukossa korostetut symbolit kuten \(n\) ja \(e\) ovat metamuuttujia, jotka tulkitaan joko tietynlaisiksi merkkijonoiksi (\(n\) voi olla luku) tai erillisiksi alilausekkeiksi (kuten \(e\)). Alilausekkeet erotetaan toisistaan alaindekseillä.

let -lausekkeen abstrakti muoto \(x.e_2\) tarkoittaa, että muuttuja \(x\) sidotaan alilausekkeessa \(e_2\) (symbolitaulu tulee tässä vaiheessa kyseeseen).

Taulukon syntaksista voit kysyä lisää jyu-compilers.slack.com:issa.

Jos et ole käyttänyt funktiokieliä, sidonta ja if lausekkeina voivat tuntua oudoilta, mutta tämä valinta yksinkertaistaa tehtävää. Esimerkiksi seuraavat ohjelmat toimisivat yo. kielellä:

cat("kissa"; let("aidalla"; x.cat("istuu";x)))

.. Tai ohjelmakoodiksi kirjoitettuna

"kissa" ++ let x be "aidalla" in ("istuu" ++ x)

plus(10; if(null(x); 0; len(x)))

.. Tai ohjelmakoodiksi kirjoitettuna

10 + if null x then 0 else x.length()

Voit halutessasi käyttää omaa lähdekieltäsi. Jos teet niin, tee siitä vastaava syntaksikaavio (1 bonuspiste)

Tehtävä 1

Määrittele haluamallasi isäntäkielellä esitys (AST) yo. syntaksikaavion abstraktille muodolle. Määrittele myös AST:llesi tulostusfunktio, joka tuottaa joko abstraktin (1pt) tai konkreetin, oikein sulutetun merkkijonoesityksen (2pt)

Esitä määritelmällääsi käyttäen muutama esimerkkilaskutoimitus.

1-2pt

Tehtävä 2

Tee tarkastin, joka varmistaa, että lausekkeessa ei käytetä määrittelemättömiä muuttujia.

2pt

Tehtävä 3

Päätä millaiset tyypityssäännöt tehtävän 1 kielelle haluat ja toteuta niille tyypintarkastin. Tee testitapauksia.

2pt jos teet kaiken, paitsi let säännön. 3pt jos teet kaiken.

Tehtävä 4 (bonustehtävä)

Lisää esimerkkitehtävään taulukot (ts. tyyppi \(\text{array}[\tau]\)) ja laajenna tyypintarkastintasi kattamaan myös niiden käsittely. Taulukoita pitää pystyä alustamaan ja indeksoimaan.

2pt

Tehtävä 5 Harjoitustyön vaiheen 2 palautus

Viimeistele harjoitustyösi jäsennin siihen kuntoon, että se riittää harjoitustyösi loppuunsaattamiseksi. Lisää myös vähintään 20 testitapausta ja niiden tulokset palautukseesi.

Muista priorisoida! Kaikkia ominaisuuksia ei tarvitse vielä jäsentää, mutta vähintään hyväksyttävään harjoitustyöhön riittävät ominaisuudet täytyy toteuttaa.

3pt

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