module IBAF-Statements imports libstratego-gpp signatures/- pp/IBAF-parenthesize pp/IBAF-pp imports cbs-gen/IBAF-Expressions // Language "IBAFlang" rules // # Statements to-funcons: |[ execute[: {(:Stmt*:)} :] ]| -> |[ scope (collateral (collect-declared-vars[: (:Stmt*:) :]), execute[: (:Stmt*:) :]) ]| to-funcons: |[ execute[: print((:Exp:)); :] ]| -> |[ print eval-exp[: (:Exp:) :] ]| to-funcons: |[ execute[: int(:Id:); :] ]| -> |[ assign (bound id[: (:Id:) :], 0) ]| to-funcons: |[ execute[: (:Id:)=(:Exp:); :] ]| -> |[ assign (bound id[: (:Id:) :], eval-exp[: (:Exp:) :]) ]| to-funcons: |[ execute[: int(:Id:)=(:Exp:); :] ]| -> |[ assign (bound id[: (:Id:) :], eval-exp[: (:Exp:) :]) ]| to-funcons: |[ execute[: return(:Exp:); :] ]| -> |[ return eval-exp[: (:Exp:) :] ]| to-funcons: |[ execute[: return; :] ]| -> |[ return null ]| to-funcons: |[ execute[: fun(:Id:)((:Params:)){(:Stmt*:)} :] ]| -> |[ null ]| to-funcons: |[ execute[: :] ]| -> |[ null ]| to-funcons: |[ execute[: (:Stmt:)(:Stmt+:) :] ]| -> |[ sequential (execute[: (:Stmt:) :], execute[: (:Stmt+:) :]) ]| // # Handling parameter declarations to-funcons: |[ collect-params[: (:Id:) :] ]| -> |[ bind (id[: (:Id:) :], allocate-initialised-variable (integers, checked head given)) ]| to-funcons: |[ collect-params[: (:Id:),(:Params:) :] ]| -> |[ collect-params[: (:Id:) :], give (checked tail given, collect-params[: (:Params:) :]) ]| // # Handling variable declarations to-funcons: |[ collect-declared-vars[: int(:Id:)=(:Exp:); :] ]| -> |[ bind (id[: (:Id:) :], allocate-variable (integers)) ]| to-funcons: |[ collect-declared-vars[: int(:Id:); :] ]| -> |[ bind (id[: (:Id:) :], allocate-variable (integers)) ]| to-funcons: |[ collect-declared-vars[: fun(:Id:)((:Params:)){(:Stmt*:)} :] ]| -> |[ bind (id[: (:Id:) :], function abstraction (scope (collateral (collect-declared-vars[: (:Stmt*:) :], collect-params[: (:Params:) :]), execute[: (:Stmt*:) :]))) ]| to-funcons: |[ collect-declared-vars[: :] ]| -> |[ map () ]| to-funcons: |[ collect-declared-vars[: (:Stmt:) :] ]| -> |[ map () ]| to-funcons: |[ collect-declared-vars[: (:Stmt1:)(:Stmt2:)(:Stmt*:) :] ]| -> |[ collect-declared-vars[: (:Stmt1:) :], collect-declared-vars[: (:Stmt2:) :], collect-declared-vars[: (:Stmt*:) :] ]|