This repository has been archived on 2022-12-27. You can view files and clone it, but cannot push or open issues or pull requests.
compilateurMIPS/simplifier.ml
2022-12-10 17:51:31 +01:00

44 lines
1.2 KiB
OCaml

open Ast
let collect_constant_strings code =
let ccs_value = function
| V1.Void -> V2.Void, []
| V1.Bool b -> V2.Bool b, []
| V1.Int n -> V2.Int n, []
in
let rec ccs_expr = function
| IR1.Val v ->
let v2, cs = ccs_value v in
IR2.Val v2, cs
| IR1.Var v -> IR2.Var v, []
| IR1.Call (fn, args) ->
let a2 = List.map ccs_expr args in
IR2.Call (fn, List.map fst a2), List.flatten (List.map snd a2)
in
let ccs_instr = function
| IR1.Decl v -> IR2.Decl v, []
| IR1.Assign (lv, e) ->
let e2, cs = ccs_expr e in
IR2.Assign (lv, e2), cs
| IR1.Do e ->
let e2, cs = ccs_expr e in
IR2.Do e2, cs
| IR1.Return e ->
let e2, cs = ccs_expr e in
IR2.Do e2, cs
in
let rec ccs_block acc_b acc_cs = function
| i :: b ->
let i2, cs = ccs_instr i in
ccs_block (i2 :: acc_b) (cs @ acc_cs) b
| [] -> List.rev acc_b, acc_cs
in
let ccs_def (IR1.Func (name, args, body)) =
let body2, cs = ccs_block [] [] body in
IR2.Func (name, args, body2), cs
in
let code2 = List.map ccs_def code in
List.map fst code2, List.flatten (List.map snd code2)
;;
let simplify ir = collect_constant_strings ir