From d40b634c237de25574ebd1bbf64b9a7a81253f2b Mon Sep 17 00:00:00 2001 From: Son Ho Date: Wed, 1 Dec 2021 13:30:36 +0100 Subject: Merge statements and expressions into statements --- src/Substitute.ml | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) (limited to 'src/Substitute.ml') diff --git a/src/Substitute.ml b/src/Substitute.ml index b8c3edd9..9099155f 100644 --- a/src/Substitute.ml +++ b/src/Substitute.ml @@ -146,8 +146,8 @@ let call_substitute (tsubst : T.TypeVarId.id -> T.ety) (call : A.call) : A.call } (** Apply a type substitution to a statement *) -let statement_substitute (tsubst : T.TypeVarId.id -> T.ety) (st : A.statement) : - A.statement = +let rec statement_substitute (tsubst : T.TypeVarId.id -> T.ety) + (st : A.statement) : A.statement = match st with | A.Assign (p, rvalue) -> let p = place_substitute tsubst p in @@ -169,42 +169,36 @@ let statement_substitute (tsubst : T.TypeVarId.id -> T.ety) (st : A.statement) : let call = call_substitute tsubst call in A.Call call | A.Panic | A.Return | A.Break _ | A.Continue _ | A.Nop -> st - -(** Apply a type substitution to an expression *) -let rec expression_substitute (tsubst : T.TypeVarId.id -> T.ety) - (e : A.expression) : A.expression = - match e with - | A.Statement st -> A.Statement (statement_substitute tsubst st) - | A.Sequence (e1, e2) -> + | A.Sequence (st1, st2) -> A.Sequence - (expression_substitute tsubst e1, expression_substitute tsubst e2) + (statement_substitute tsubst st1, statement_substitute tsubst st2) | A.Switch (op, tgts) -> A.Switch (operand_substitute tsubst op, switch_targets_substitute tsubst tgts) - | A.Loop le -> A.Loop (expression_substitute tsubst le) + | A.Loop le -> A.Loop (statement_substitute tsubst le) (** Apply a type substitution to switch targets *) and switch_targets_substitute (tsubst : T.TypeVarId.id -> T.ety) (tgts : A.switch_targets) : A.switch_targets = match tgts with - | A.If (e1, e2) -> - A.If (expression_substitute tsubst e1, expression_substitute tsubst e2) + | A.If (st1, st2) -> + A.If (statement_substitute tsubst st1, statement_substitute tsubst st2) | A.SwitchInt (int_ty, tgts, otherwise) -> let tgts = - List.map (fun (sv, e) -> (sv, expression_substitute tsubst e)) tgts + List.map (fun (sv, st) -> (sv, statement_substitute tsubst st)) tgts in - let otherwise = expression_substitute tsubst otherwise in + let otherwise = statement_substitute tsubst otherwise in A.SwitchInt (int_ty, tgts, otherwise) (** Apply a type substitution to a function body. Return the local variables and the body. *) let fun_def_substitute_in_body (tsubst : T.TypeVarId.id -> T.ety) - (def : A.fun_def) : V.var list * A.expression = + (def : A.fun_def) : V.var list * A.statement = let rsubst r = r in let locals = List.map (fun v -> { v with V.var_ty = ty_substitute rsubst tsubst v.V.var_ty }) def.A.locals in - let body = expression_substitute tsubst def.body in + let body = statement_substitute tsubst def.body in (locals, body) -- cgit v1.2.3