Просмотр исходного кода

For-to-while loop transformations now use inline vardecs

Taddeus Kroes 12 лет назад
Родитель
Сommit
afb60883d5
1 измененных файлов с 14 добавлено и 14 удалено
  1. 14 14
      phases/desug.ml

+ 14 - 14
phases/desug.ml

@@ -177,17 +177,13 @@ let rec move_inits = function
   | node -> transform_children move_inits node
   | node -> transform_children move_inits node
 
 
 let for_to_while node =
 let for_to_while node =
-  let rec replace_var var replacement node =
-    let trav = (replace_var var replacement) in
-    match node with
+  let rec replace_var var replacement = function
     | Var (name, None, ann) when name = var ->
     | Var (name, None, ann) when name = var ->
       Var (replacement, None, ann)
       Var (replacement, None, ann)
-    | For (counter, start, stop, step, body, ann) when counter = var ->
-      For (replacement, trav start, trav stop, trav step, trav body, ann)
-    | node ->
-      transform_children trav node
+    | node -> transform_children (replace_var var replacement) node
   in
   in
-  let rec traverse new_vars = function
+  let rec traverse = function
+    (* DISABLED, inline VarDec nodes are supported
     | FunDef (export, ret_type, name, params, body, ann) ->
     | FunDef (export, ret_type, name, params, body, ann) ->
       let rec place_decs decs = function
       let rec place_decs decs = function
         | Block (VarDecs lst :: tl) -> Block (VarDecs (decs @ lst) :: tl)
         | Block (VarDecs lst :: tl) -> Block (VarDecs (decs @ lst) :: tl)
@@ -199,13 +195,14 @@ let for_to_while node =
       let new_vardecs = List.map create_vardec !new_vars in
       let new_vardecs = List.map create_vardec !new_vars in
       let body = place_decs new_vardecs body in
       let body = place_decs new_vardecs body in
       FunDef (export, ret_type, name, params, body, ann)
       FunDef (export, ret_type, name, params, body, ann)
+    *)
 
 
     (* Transform for-loops to while-loops *)
     (* Transform for-loops to while-loops *)
     | For (counter, start, stop, step, body, ann) ->
     | For (counter, start, stop, step, body, ann) ->
       let _i = fresh_var counter in
       let _i = fresh_var counter in
       let _stop = fresh_const "stop" in
       let _stop = fresh_const "stop" in
       let _step = fresh_const "step" in
       let _step = fresh_const "step" in
-      new_vars := !new_vars @ [_i; _stop; _step];
+      (*new_vars := !new_vars @ [_i; _stop; _step];*)
 
 
       let vi = Var (_i, None, []) in
       let vi = Var (_i, None, []) in
       let vstop = Var (_stop, None, annof stop) in
       let vstop = Var (_stop, None, annof stop) in
@@ -217,13 +214,16 @@ let for_to_while node =
         []
         []
       ) in
       ) in
       Block [
       Block [
+        VarDec (Int, _i, None, annof start);
+        VarDec (Int, _stop, None, annof stop);
+        VarDec (Int, _step, None, annof step);
         Assign (_i, None, start, annof start);
         Assign (_i, None, start, annof start);
         Assign (_stop, None, stop, annof stop);
         Assign (_stop, None, stop, annof stop);
         Assign (_step, None, step, annof step);
         Assign (_step, None, step, annof step);
-        traverse new_vars (While (cond, (Block (
-          block_body (replace_var counter _i body) @
+        While (cond, (Block (
+          block_body (replace_var counter _i (traverse body)) @
           [Assign (_i, None, Binop (Add, vi, vstep, []), [])]
           [Assign (_i, None, Binop (Add, vi, vstep, []), [])]
-        )), ann));
+        )), ann);
       ]
       ]
 
 
     (* Transform while-loops to do-while loops in if-statements *)
     (* Transform while-loops to do-while loops in if-statements *)
@@ -234,9 +234,9 @@ let for_to_while node =
       Block [If (cond, Block [DoWhile (cond, body, ann)], ann)]
       Block [If (cond, Block [DoWhile (cond, body, ann)], ann)]
     *)
     *)
 
 
-    | node -> transform_children (traverse new_vars) node
+    | node -> transform_children traverse node
   in
   in
-  traverse (ref []) node
+  traverse node
 
 
 let rec sublist n = function
 let rec sublist n = function
   | [] when n > 0  -> raise (Invalid_argument "n")
   | [] when n > 0  -> raise (Invalid_argument "n")