Fixes wrong order for conversion

This commit is contained in:
elvis
2024-12-02 00:45:24 +01:00
parent 52cd7e7e13
commit 15356aa5a9
5 changed files with 163 additions and 116 deletions

View File

@ -68,12 +68,17 @@ module SSCfg = Cfg.Make(SimpleStatements)
let rec convert_c (prevcfg: SSCfg.t) (prg: Types.c_exp) : SSCfg.t =
let open SimpleStatements in
match prg with
| Skip -> prevcfg |> SSCfg.addToLastNode SimpleSkip
| Assignment (x, a) -> prevcfg |> SSCfg.addToLastNode (SimpleAssignment (x, convert_a a))
| Skip ->
prevcfg |> SSCfg.addToLastNode SimpleSkip
| Assignment (x, a) ->
prevcfg |> SSCfg.addToLastNode (SimpleAssignment (x, convert_a a))
| Sequence (c1, c2) ->
let cfg1 = convert_c prevcfg c1 in
let cfg2 = convert_c cfg1 c2 in
cfg2
| If (b, c1, c2) ->
let convertedb = convert_b b in
let cfg1 = convert_c SSCfg.empty c1 in
@ -86,6 +91,7 @@ let rec convert_c (prevcfg: SSCfg.t) (prg: Types.c_exp) : SSCfg.t =
content = mergedcfg.content |>
NodeMap.add_to_list entrynode (SimpleGuard convertedb) |>
NodeMap.add_to_list exitnode (SimpleSkip) }
| While (b, c) ->
let convertedb = convert_b b in
let cfg = convert_c SSCfg.empty c in
@ -112,9 +118,11 @@ let rec convert_c (prevcfg: SSCfg.t) (prg: Types.c_exp) : SSCfg.t =
inputOutputVar = prevcfg.inputOutputVar;
initial = Some entrynode;
terminal = Some exitnode;
content = NodeMap.add_to_list guardnode (SimpleGuard (convertedb)) cfg.content |>
content = cfg.content |>
NodeMap.add_to_list guardnode (SimpleGuard (convertedb)) |>
NodeMap.add_to_list exitnode (SimpleSkip)
} |> SSCfg.concat prevcfg
| For (assignment, guard, increment, body) ->
let cfgassignment = convert_c SSCfg.empty assignment in
let convertedguard = convert_b guard in
@ -144,7 +152,8 @@ let rec convert_c (prevcfg: SSCfg.t) (prg: Types.c_exp) : SSCfg.t =
inputOutputVar = prevcfg.inputOutputVar;
initial = Some guardnode;
terminal = Some exitnode;
content = NodeMap.add_to_list guardnode (SimpleGuard (convertedguard)) bodyincrement.content |>
content = bodyincrement.content |>
NodeMap.add_to_list guardnode (SimpleGuard (convertedguard)) |>
NodeMap.add_to_list exitnode (SimpleSkip)
} |> SSCfg.concat prevassignment