Harjoitukset 5

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

HUOM: Voit käyttää vastaavia osia omasta harjoitustyöstäsi esimerkkikielen sijaan.

Oppimistavoitteet

  • Opit manipuloimaan AST:tä
  • Opit toteuttamaan sokerinpilkkojan

Tehtävä 1

Tarkastellaan jälleen tuttua kieltä:

Abstrakti muoto Syntaksi Selite
Typ τ ::= \(\text{num}\) Number Numerotyyppi
\(\text{str}\) String Merkkijonotyyppi
\(\text{bool}\) Bool Merkkijonotyyppi
Exp e ::= \(x\) alphanum 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

Laajennetaan kieltä vielä seuraavalla taulukolla:

Abstrakti muoto Syntaksi Selite
Typ τ ::= \(\text{cmd}(\tau)\) cmd \(\tau\) Komento
Cmd m ::= \(\text{pure}(e)\) pure(\(e\)) Komento joka laskee lausekkeen
\(\text{bnd}(e;x.m)\) \(x\) <- \(e\) ; \(m\) Ketjutus
\(\text{dcl}(e;a.m)\) new \(a\) = \(e\) ; \(m\) Muuttuvaisen luominen
\(\text{get}[a]\) \(@a\) Muuttuvaisen lukeminen
\(\text{set}[a](e)\) a := e Muuttuvaiseen kirjoittaminen
\(\text{read}\) read Käyttäjän syötteen lukeminen
\(\text{print}(e)\) print \(e\) Tulostaminen konsoliin
Exp e ::= \(\text{cmd}(m)\) do \(m\) Komento Expiksi
Top T ::= \(\text{toplevel}[x](m)\) program \(x\) is \(m\) Toplevel tjsp. "pääohjelma"

Kuten aiemmin huomattiin, tämä kieli on jo melko ilmaisuvoimainen, mutta melko kömpelö käyttää. Esimerkiksi ainoa tapa suorittaa komentoja on \(\text{bnd}[e;x.m]\), joka sitoo aina uuden muuttujan, eli pelkkä hello-world ohjelmakin näyttää kankealle:

() <- print "Hello";
() <- print "World";
pure(0);

Ongelma voitaisiin ratkaista luomalla uusi "\(\text{nonbnd}[e;m]\)" komento, joka automaattisesti jättäisi muuttujan sitomatta. Tämä kuitenkin lisää tyypintarkastukseen ja koodingenerointiin yhden ylimääräisen tilanteen kuhunkin.

Tässä on mahdollista käyttää sokerinpilkontaa. Tee AST:hesi ylimääräinen muoto \(\text{nonbnd}[e;m]\) (tai tee kokonaan eri versio AST:stäsi jossa tälläinen on). Tee seuraavaksi konversio, joka etsii AST:stäsi kaikki nonbnd:t ja korvaa ne vastaavalla tavallisella bnd-muodolla.

Huomaa, että tyypintarkastuksen voit olettaa jo tehdyksi ja näin ollen annetun AST:n "virheettömäksi".

2pt

Tehtävä 2

Seuraava ohjelmakin näyttää kömpelölle:

program Testi is

new laskuri = 0; 

i <- read;
s <- @laskuri;
laskuri := s+i;

i2 <- read;
s2 <- @laskuri;
laskuri := s2+i2;

i3 <- read;
s3 <- @laskuri;
laskuri := s2+i3;

tulos <- @laskuri;

print tulos;

pure 0;

.. Käyttäjä syöttää "42" "41" "1"
.. Ohjelma tulostaa "84"
.. Ohjelma päättyy paluuarvolla 0

Olisi paljon kätevämpää, jos kielessä olisi Javan ja C:n kaltainen += operaattori. Lisää kieleen tälläiset operaattorit yhteen- ja kertolaskulle sekä merkkijonojen yhdistämiselle. Luo sitten sokerinpilkkoja, joka korvaa nämä rakenteet vastaavilla olemassa olevilla rakenteilla.

2pt

Tehtävä 3

Laajenna edellisen tehtävän välikieltä käsittelemään myös seuraava laajennos

Abstrakti muoto Syntaksi Selite
Exp e ::= \(\text{while}[x;m]\) while x in m Rekursio

Toteuta tälle tyypitys.

1pt

Tehtävä 4

Lisää pythonmaiset for-silmukat ASThesi. Tee tehtävän 3 pohjalta sokerinpilkkoja, joka muuttaa ne while silmukoiksi.

2pt

Tehtävä 6 -- Vaihe 3 harjoitustyöpalautus

Palauta harjoitustyösi vaihe 3 siinä kunnossa, että se täyttää harjoitustyöltä vaaditut minimivaatimukset.

Harjoitustyön 3. inkrementissä tavoitteena on lisätä harjoitustyöhön staattiset tarkistukset (mm. tyyppitarkastukset) ja tarvittaessa myös sokerinpilkkoja. Näiden kuuluu toimia ja olla testattuja vähintään harjoitustyön minimivaatimustason täyttävältä osalta.

Staattiset tarkistukset ovat toimivia, jos ne päästävät läpi vain sellaisia ohjelmia, jotka kääntäjä tulee valmistuttuaan kykenemään kääntämään loppuun asti virheettä.

6pt

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