Harjoitukset 7 - 16.5.2016
Näistä demoista voi saada 0-6 pistettä ja 3 bonuspistettä, joilla voi korvata aiemmista demoista saamatta jääneitä pisteitä.
Oppimistavoitteet
- Osaat kääntää lausekkeita ja lauseita välikielelle
- Osaat kääntää yksinkertaisia tietorakenteita välikielle
- (Osaat toteuttaa yksinkertaiselle kielelle Hindley-Milner tyylisen tyypinpäättelyn)
Tehtävä 1
Käännä seuraava ohjelmointikieli valitsemallesi välikielelle. Hyviä vaihtoehtoja on luennoilla käytetty välikieli ja LLVM
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 |
Huomaa, että voit olettaa tyyppitarkastuksen tehdyksi ja AST:n olevan korrektia
2pt
Tehtävä 2
Tee kieleen seuraavat laajennokset ja käännä ne välikielellesi.
Abstrakti muoto | Syntaksi | Selite | |
---|---|---|---|
Typ τ ::= | \(\text{unit}\) | unit | 0:n alkion monikko |
\(\text{product}(\tau_1; \tau_2)\) | \((\tau_1,\tau_2)\) | Pari (2:n alkion monikko) | |
\(\text{void}\) | void | 0:n alkion variantti | |
\(\text{sum}(\tau_1; \tau_2)\) | either \(\tau_1\ \tau_2\) | Ripa (2:n alkion variantti) | |
Exp e ::= | \(\text{trivial}\) | () | 0:n alkion monikko |
\(\text{pair}[e_1;e_2]\) | \((e_1,e_2)\) | Pari | |
\(\text{fst}[e]\) | fst \(e\) | Parin ensimmäinen | |
\(\text{snd}[e]\) | snd \(e\) | Parin toinen | |
\(\text{left}[e]\) | left \(e\) | Injektio vasemmalle | |
\(\text{right}[e]\) | right \(e\) | Injektio oikealle | |
\(\text{case}[e;x_1.e_1;x_2.e_2]\) | case \(e\) of {left \(x_1\) -> \(e_1\); right \(x_2\) -> \(e_2\)} | Haarautuminen variantin mukaan |
Huomaa, että voit olettaa tyyppitarkastuksen tehdyksi ja AST:n olevan korrektia
2pt
Tehtävä 3
Tee kieleen seuraavat laajennokset ja käännä ne välikielellesi.
Abstrakti muoto | Syntaksi | Selite | |
---|---|---|---|
Typ τ ::= | \(\text{cmd}(\tau)\) | cmd \(\tau\) | Komento |
\(\text{ref}(\tau)\) | ref \(\tau\) | Muuttuvainen | |
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" |
Huomaa, että voit olettaa tyyppitarkastuksen tehdyksi ja AST:n olevan korrektia
2pt
-
Tehtävä 4-6
Lisätään yo. kieleen polymorfiset tyypit ja tyyppimuuttujat:
Abstrakti muoto | Syntaksi | Selite | |
---|---|---|---|
Typ τ ::= | \(\alpha\) | \(\alpha\dots\omega\) | Tyyppimuuttuja |
Poly σ ::= | \(\forall\alpha . \tau\) | forall \(\alpha\) . \(\tau\) | Polytyyppi |
\(\tau\) | \(\tau\) | Polytyyppi voi olla myös monotyyppi |
Toteuta tehtävän 1 kielelle Hindley-Damas-Milner tyypinpäättely (3pt). Laajenna kieltä tehtävian 2 ja 3 mukaisesti ja toteuta tyypinpäättely molemmille (2pt/laajennos)
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.