Praktikum IPT, 1997, Opgave 1

Korte beschrijving van het doel

Uitgangspunt bij deze opgave is het minuscule programmeertaaltje dat we bij het vak Grammatica's en Ontleden hebben gezien.

Omdat dit kennelijk voor veel mensen al een te grote stap is heb ik een voorbeeld van dit taaltje in /praktikum/ipt neergezet. Deze is echter niet compleet. Je moet deze zelf completeren. Om aan het volgende werkcollege mee te kunnen doen is vereist dat je:

Als je niet aan een van deze twee eisen voldoet kom je er niet in.; Dit mag hard klinken, maar ik heb gisteren in wanhoop in de pause aan iemand gevraagd wat ik moest doen om er voor te zorgen dat men aan het werk zou gaan en het antwoord was "Je moet gewoon harde deadlines stellen, hoe treurig dat ook is" Bij deze dus.

Als je dit lukt heb je dus het eerste gedeelte dat hieronder beschreven staat af. Heb je vragen meld dat dan!

 

Deel 1: Zorg ervoor dat je, met behulp van de gegeven libraries een werkende versie van een vertaler voor dit taaltje hebt. Werp zonodig ook eens een blik in het bijgeleverde attributen grammatica systeempje: veel van de dingen die je moet doen zijn daarin al een keer gedaan. We gaan er van uit dat de taal maar een operator kent (+).

Deel 2: We willen nu deze taal een beetje interessanter maken. We breiden de taal daarom uit met assignments (van de vorm a := 37 +b), sequentie, en met mogelijkheden voor in- en uitvoer.

Een voorbeeld programma zou dan kunnen zijn:

(a := b+7; c := a * b; !c)
where a = 1; b = ?; c = 1

Een ! voor een expressie geeft aan dat hier een waarde wordt afgedrukt, en een ? geeft aan dat hier een waarde wordt ingelezen.

De instructieset van onze "machine" moet nu dus ook uitgebreid worden met een:

Deel 3: Nu we assignments hebben is het zinvol om ook een While-instructie te hebben, zodat we ook "interessante" programma's kunnen schrijven. Voeg deze toe.

Je kunt je afvragen wat het resultaat van een assigment of een while-statement zou moeten zijn. Vooreerst is het het gemakkelijkste hiervoor een speciaal type void in te voeren, dat staan voor het type met slechts een enkele waarde: skip. Andere mogelijkheden zouden zijn om voorr een assignment de toegekende waarde op te leveren, en voor een while-statement een rijtje waarden: namelijk de waarden die opgeleverd worden door de laatste expressie in de body van de while. Maar omdat we nog niets aan rijtjes (of arrays) hebben gedaan, gaat dat hier wat ver.

Deel 4: Tenslotte merken we op dat we eigenlijk nog niets aan echte functies hebben gedaan. In deze fase voegen we de mogelijkheid toe een aantal primitieve operatoren te declareren, met hun type, hun prioriteit en hun associativiteit. Ook bij de declaratie van variabelen moet nu een type gegeven worden, en het hele programma dient te worden getypechecked.

Een voorbeeld programma is nu:

infixl 6 +, - :: Int  ->  Int  -> Int
infixl 7 *    :: Int  ->  Int  -> Int
infixr 2 ||   :: Bool ->  Bool -> Bool
infix  4 <    :: Int  ->  Int  -> Bool
 
WHILE 0 < a DO a!; a := (a-1) OD
WHERE a :: Int = ?

Even voor de duidelijkheid:

Alle vars in declaraties moeten dus voorzien zijn van een type (geen polymorfie). Verder mag je aannemen dat de vraagtekens altijd een Int opleveren (anders is type-controle niet mogelijk). De operatoren die je kunt herkennen is een superset van de operatoren die je hierboven ziet. Als je een willekeurig aantal operatoren kunt herkennen is dat echter positief voor de beoordeling. Hetzelfde geldt voor het inbouwen van overloading en coercie (niet verplicht maar wel zeer positief). Je hoeft bij de types geen polymorfie in te bouwen.