I222 - Semantikk til programmeringsspråk

Oppgavesett 1, vår 2000

  1. Fra læreboken: oppgave 2.6.1.

  2. Fra læreboken: oppgave 2.6.2.

  3. Fra læreboken: oppgave 2.6.3.

  4. På filen loop-2.sml ligger kode for (skriv ut filen med kommandoen enscript -r2G -L60 loop-2.sml for å få rett sideinndeling)
    1. syntaks for Loop og noen hjelpefunksjoner,
    2. semantikk til Loop,
    3. en analysator for Loop (rekursivt nedstigende), og
    4. en dekoder for analysert kode og diverse eksempler.
    Bruk funksjonen i denne filen til å sjekke svarene dine på oppgavene 1, 2 og 3.

  5. Fra læreboken: oppgave 2.6.4.
    Utfør også de tilsvarende endringer i programkoden fra filen loop-2.sml.

  6. I definisjonen av Loop, figur 2.1 i læreboken, så er det ikke definert hvordan 3 setninger i sekvens skal fortolkes, dvs. " imp1 ; imp2 ; imp3 " kan fortolkes både som " Seq(Seq(imp1,imp2),imp3) " og som " Seq(imp1,Seq(imp2.imp3)) ". Vis at dette er uten betydning gitt den semantikk som er definert for sekvenser.
    Med andre ord: vis at ";" er assosiativ med den gitt meningsfunksjon.

  7. Fra læreboken: oppgave 2.6.8.
    Utfør også de tilsvarende endringer i programkoden fra filen loop-2.sml.

  8. Fra læreboken: oppgave 2.6.6.
    Utfør også de tilsvarende endringer i programkoden fra filen loop-2.sml. Her får vi en rekursjon mellom definisjonen for <IExp> og <BExp>. Dette krever at vi gir definisjonene av syntaks gjensidig rekurivt ved
    datatype IExp   = Constant of Literal
      	        | Variable of Ident
                    | Sum      of IExp * IExp
                    | Prod     of IExp * IExp
    and
             BExp   = Eql      of IExp * IExp
      	        | Less     of IExp * IExp
                    | Not      of BExp
                    | And      of BExp * BExp;
    	
    før den nye <IExp>-produksjonen kan legges til. Tilsvarende får vi en gjensidig rekursjon mellom semantikk-funksjonene for <IExp> og <BExp>. Gjensidig rekursjon mellom ml-funksjoner kan uttrykkes ved
    val rec f = fn x => g(x-2) 
    and
            g = fn x => if x <= 1 then 0 else f(x+1)+2;
    	


Sist oppdatert 2000-01-24 av Magne Haveraaen