Transformation of Applicative Specifications into Imperative ...

Transformation of Applicative Specifications into Imperative ... Transformation of Applicative Specifications into Imperative ...

26.09.2013 Views

APPENDIX C. FORMAL SPECIFICATIONS OF TRANSFORMATIONS in ar ′ = getAccessObsCaseBranch( idSet(ar), tl cbl, et, func, trans) mk_AccessResult( removeDuplets( accessList(ar) accessList(ar ′ )), idSet(ar ′ )) end end, /∗Returns an access list of the values of types of interest written to during evaluation of a function.∗/ /∗ Arguments: ======= idset: the functions already evaluated ve: the value expression Result: ======= AccessResult: the corresponding access result ∗/ getAccessGen : Id-set × ValueExpr × ExpType × FUNC × TRANS → AccessResult getAccessGen(idset, ve, et, func, trans) ≡ case ve of Make_ValueLiteral(vl) → mk_AccessResult(〈〉, idset), Make_ValueOrVariableName(vn) → if id(vn) ∈ dom func then getAccessGen( idset, ApplicationExpr(ve, 〈〉), et, func, trans) else mk_AccessResult( getAssignExpr(ve, et, trans), idset) end, Make_BasicExpr(be) → mk_AccessResult(〈〉, idset), ProductExpr(vel) → getAccessGenList( idset, vel, 262

C.1. FORMAL SPECIFICATION OF THE TRANSFORMER expTypeToExpTypeList( removeBrackets(et), len vel), func, trans), Make_SetExpr(se) → getAccessGenSetExpr( idset, se, getSetType(et), func, trans), Make_ListExpr(le) → getAccessGenListExpr( idset, le, getListType(et), func, trans), Make_MapExpr(me) → getAccessGenMapExpr( idset, me, getMapType(et), func, trans), ApplicationExpr(ave, vl) → case ave of Make_ValueOrVariableName(vn) → if id(vn) ∈ dom func then if id(vn) ∈ idset then case type_expr(func(id(vn))) of FunctionTypeExpr(arg, fa, res) → /∗Already evaluated.∗/ getAccessGenList( idset, vl, expTypeList(arg, len vl), func, trans) end else /∗Not evaluated yet.∗/ case type_expr(func(id(vn))) of FunctionTypeExpr(arg, fa, res) → let ar = getAccessGen( idset ∪ {id(vn)}, value_expr(func(id(vn))), Known(type_expr(res)), func, trans), ar ′ = getAccessGenList( idset, vl, expTypeList(arg, len vl), func, trans) in mk_AccessResult( 263

C.1. FORMAL SPECIFICATION OF THE TRANSFORMER<br />

expTypeToExpTypeList(<br />

removeBrackets(et), len vel), func, trans),<br />

Make_SetExpr(se) →<br />

getAccessGenSetExpr(<br />

idset, se, getSetType(et), func, trans),<br />

Make_ListExpr(le) →<br />

getAccessGenListExpr(<br />

idset, le, getListType(et), func, trans),<br />

Make_MapExpr(me) →<br />

getAccessGenMapExpr(<br />

idset, me, getMapType(et), func, trans),<br />

ApplicationExpr(ave, vl) →<br />

case ave <strong>of</strong><br />

Make_ValueOrVariableName(vn) →<br />

if id(vn) ∈ dom func<br />

then<br />

if id(vn) ∈ idset<br />

then<br />

case type_expr(func(id(vn))) <strong>of</strong><br />

FunctionTypeExpr(arg, fa, res) →<br />

/∗Already evaluated.∗/<br />

getAccessGenList(<br />

idset, vl,<br />

expTypeList(arg, len vl), func,<br />

trans)<br />

end<br />

else<br />

/∗Not evaluated yet.∗/<br />

case type_expr(func(id(vn))) <strong>of</strong><br />

FunctionTypeExpr(arg, fa, res) →<br />

let<br />

ar =<br />

getAccessGen(<br />

idset ∪ {id(vn)},<br />

value_expr(func(id(vn))),<br />

Known(type_expr(res)), func,<br />

trans),<br />

ar ′ =<br />

getAccessGenList(<br />

idset, vl,<br />

expTypeList(arg, len vl),<br />

func, trans)<br />

in<br />

mk_AccessResult(<br />

263

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!