Transformation of Applicative Specifications into Imperative ...

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

26.09.2013 Views

APPENDIX D. SPECIFICATION OF TRANSFORMER IN RSL1 getAccessGen(idset, ve, et, func, trans) ≡ case ve of Make_ValueLiteral(vl) → mk_AccessResult(〈〉, idset), Make_ValueOrVariableName(vn) → if isinId(id(vn), domainFUNC(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, expTypeToExpTypeList( removeBrackets(et), lengthVE(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 isinId(id(vn), domainFUNC(func)) then if isinId(id(vn), idset) then case type_expr( getMapValueFUNC(func, id(vn))) of FunctionTypeExpr(arg, fa, res) → /∗Already evaluated.∗/ getAccessGenList( 434

D.2. FORMAL SPECIFICATION OF THE TRANSFORMER IN RSL1 idset, vl, expTypeList(arg, lengthVE(vl)), func, trans) end else /∗Not evaluated yet.∗/ case type_expr( getMapValueFUNC(func, id(vn))) of FunctionTypeExpr(arg, fa, res) → mk_AccessResult( removeDuplets( (getAccess( type_expr(res), trans) accessList( getAccessGen( addId(id(vn), idset), value_expr( getMapValueFUNC( func, id(vn))), Known(type_expr(res)), func, trans))) accessList( getAccessGenList( idset, vl, expTypeList( arg, lengthVE(vl)), func, trans))), unionId( getAccessIdSet( getAccessGen( addId(id(vn), idset), value_expr( getMapValueFUNC( func, id(vn))), Known(type_expr(res)), func, trans)), getAccessIdSet( getAccessGenList( idset, vl, expTypeList( arg, lengthVE(vl)), func, trans)))) 435

D.2. FORMAL SPECIFICATION OF THE TRANSFORMER IN RSL1<br />

idset, vl,<br />

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

func, trans)<br />

end<br />

else<br />

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

case<br />

type_expr(<br />

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

<strong>of</strong><br />

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

mk_AccessResult(<br />

removeDuplets(<br />

(getAccess(<br />

type_expr(res), trans) <br />

accessList(<br />

getAccessGen(<br />

addId(id(vn), idset),<br />

value_expr(<br />

getMapValueFUNC(<br />

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

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

func, trans))) <br />

accessList(<br />

getAccessGenList(<br />

idset, vl,<br />

expTypeList(<br />

arg, lengthVE(vl)),<br />

func, trans))),<br />

unionId(<br />

getAccessIdSet(<br />

getAccessGen(<br />

addId(id(vn), idset),<br />

value_expr(<br />

getMapValueFUNC(<br />

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

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

func, trans)),<br />

getAccessIdSet(<br />

getAccessGenList(<br />

idset, vl,<br />

expTypeList(<br />

arg, lengthVE(vl)),<br />

func, trans))))<br />

435

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

Saved successfully!

Ooh no, something went wrong!