Decl0 (figur 9.1 s. 189), å ha
typesemantiske funksjoner
TP: Prog -> TypeOK
TM: Imp -> Tenvir -> TypeOK
TD: Decl -> Tenvir -> Tenvir
TT: Vartype -> Type
TE: Exp -> Tenvir -> Type
TV: Var -> Ident
TBO: Binop -> (Type × Type × Type)
TUO: Unop -> (Type × Type)
TA: Literal -> Type
Etter mønster fra boken kan vi definere typeomgivelsen og de
typesemantiske domenene som følger:
TypeOK = true: Unit + false: Unit
Type = typeint: Unit + typebool: Unit + typeerror: Unit
T = tvar: Type + tconst: Type + undeclared: unit
Tenvir = Ident -> T
Domenet Tenvir har de vanlige funksjonene Void: ->
Tenvir for å lage en typeomgivelse som gir
undeclared for alle identifikatorerer, og bind:
(Tenvir × Ident × Type) -> Tenvir for å legge en ny
identifikator til typeomgivelsen (slik som i figur 9.3 s. 193 for
vanlige omgivelser).
De typesemantiske funksjonene defineres for hver produksjon, som
vanlig for semantiske funksjoner:
TP[[ imp ]] = TM [[imp]] Void
TM[[ skip ]] tenv = true
TM[[ put exp ]] tenv = { true for typeint=TE[[exp]] tenv,
{ false otherwise
TM[[ get var ]] tenv = { true for tvar(typeint)=tenv(TV[[var]]),
{ false otherwise
TM[[ var := exp ]] tenv = { true for tvar(tl)=tenv(TV[[var]]),
{ tr=TE[[exp]] tenv,
{ tl=tr
{ false otherwise
TM[[ imp1 ; imp2 ]] tenv = { true for true=TM[[imp1]] tenv,
{ true=TM[[imp2]] tenv
{ false otherwise
TM[[ begin decl; imp end ]] tenv = TM[[imp]] (TD[[decl]] tenv)
TM[[ if exp
then imp1
else imp2 ]] tenv = { true for tr=TE[[exp]] tenv,
{ typebool=tr,
{ true=TM[[imp1]] tenv,
{ true=TM[[imp2]] tenv
{ false otherwise
TM[[ while exp
do imp ]] tenv = { true for tr=TE[[exp]] tenv,
{ typebool=tr,
{ true=TM[[imp]] tenv
{ false otherwise
TD[[ const id = lit ]] tenv = bind(tenv,id,tconst typeint)
TD[[ var id : vtype ]] tenv = bind(tenv,id,tvar TT[[vtype]])
TD[[ decl1 ; decl2 ]] tenv = TD[[decl2]] (TD[[decl1]] tenv)
TT[[ int ]] = typeint
TT[[ bool ]] = typebool
TE[[ lit ]] tenv = TA[[lit]]
TE[[ id ]] tenv = { tl for tvar (tl)=tenv(id)
{ tr for tconst(tr)=tenv(id)
{ typeerror otherwise
TE[[ ex1 bop ex2 ]] tenv = { tres for (targ1,tright,targ2)=TBO[[bop]],
{ tex1=TE[[ex1]] tenv,
{ tex1=targ1,
{ tex2=TE[[ex2]] tenv,
{ tex2=targ2,
{ typeerror otherwise
TE[[ uop ex ]] tenv = { tres for (targ,tres)=TUO[[uop]],
{ tex=TE[[ex]] tenv,
{ tex=targ
{ typeerror otherwise
TV[[ id ]] = id
TBO[[ + ]] = (typeint, typeint, typeint)
TBO[[ - ]] = (typeint, typeint, typeint)
TBO[[ * ]] = (typeint, typeint, typeint)
TBO[[ / ]] = (typeint, typeint, typeint)
TBO[[ = ]] = (typeint, typeint, typebool)
TBO[[ < ]] = (typeint, typeint, typebool)
TUO[[ - ]] = (typeint, typeint)
TUO[[ ¬ ]] = (typebool, typebool)
TA[[ lit ]] = typeint
Skriv dette som et ML-program for å teste typekorrekthet til program
skrevet i Decl0.
Loop, figur 2.1 s. 8.
While, figur 6.1 s. 101.
Decl1, seksjon 9.1 s. 217. Husk at vi ikke
kan sjekke om en indeks er innenfor eller utenfor en tabell
før ved kjøretid.
Proc0, figur 10.1 s. 232. Her kan du
la parametermodus inngå i typeinformasjonen til en prosedyre.
Decl1
og Proc0, dvs. et språk med både array
og prosedyrer/funksjoner. Tillat prosedyrene/funksjonene å 0, 1, 2
eller flere parametre.