util.ml 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. include Ast
  2. let var_counter = ref 0
  3. let fresh_var prefix =
  4. var_counter := !var_counter + 1;
  5. prefix ^ "$" ^ string_of_int !var_counter
  6. (* Default tree transformation
  7. * (node -> node) -> node -> node *)
  8. let transform_children trav node =
  9. let trav_all nodes = List.map trav nodes in
  10. match node with
  11. | Program (decls, loc) ->
  12. Program (trav_all decls, loc)
  13. | FunDec (ret_type, name, params, loc) ->
  14. FunDec (ret_type, name, trav_all params, loc)
  15. | FunDef (export, ret_type, name, params, body, loc) ->
  16. FunDef (export, ret_type, name, trav_all params, trav body, loc)
  17. | GlobalDec (ctype, name, loc) ->
  18. GlobalDec (ctype, name, loc)
  19. | GlobalDef (export, ctype, name, Some init, loc) ->
  20. GlobalDef (export, ctype, name, Some (trav init), loc)
  21. | VarDec (ctype, name, Some init, loc) ->
  22. VarDec (ctype, name, Some (trav init), loc)
  23. | Assign (name, value, loc) ->
  24. Assign (name, trav value, loc)
  25. | Return (value, loc) ->
  26. Return (trav value, loc)
  27. | If (cond, body, loc) ->
  28. If (trav cond, trav body, loc)
  29. | IfElse (cond, true_body, false_body, loc) ->
  30. IfElse (trav cond, trav true_body, trav false_body, loc)
  31. | While (cond, body, loc) ->
  32. While (trav cond, trav body, loc)
  33. | DoWhile (cond, body, loc) ->
  34. DoWhile (trav cond, trav body, loc)
  35. | For (counter, start, stop, step, body, loc) ->
  36. For (counter, trav start, trav stop, trav step, trav body, loc)
  37. | Expr value ->
  38. Expr (trav value)
  39. | Monop (op, value, loc) ->
  40. Monop (op, trav value, loc)
  41. | Binop (op, left, right, loc) ->
  42. Binop (op, trav left, trav right, loc)
  43. | Cond (cond, true_expr, false_expr, loc) ->
  44. Cond (trav cond, trav true_expr, trav false_expr, loc)
  45. | TypeCast (ctype, value, loc) ->
  46. TypeCast (ctype, trav value, loc)
  47. | FunCall (name, args, loc) ->
  48. FunCall (name, trav_all args, loc)
  49. | Block (body) ->
  50. Block (trav_all body)
  51. | VarUse (var, def, depth) ->
  52. VarUse (trav var, def, depth)
  53. | _ -> node
  54. let rec locof = function
  55. | Program (_, loc)
  56. | Param (_, _, loc)
  57. | FunDec (_, _, _, loc)
  58. | FunDef (_, _, _, _, _, loc)
  59. | GlobalDec (_, _, loc)
  60. | GlobalDef (_, _, _, _, loc)
  61. | VarDec (_, _, _, loc)
  62. | Assign (_, _, loc)
  63. | Return (_, loc)
  64. | If (_, _, loc)
  65. | IfElse (_, _, _, loc)
  66. | While (_, _, loc)
  67. | DoWhile (_, _, loc)
  68. | For (_, _, _, _, _, loc)
  69. | Allocate (_, _, loc)
  70. | BoolConst (_, loc)
  71. | IntConst (_, loc)
  72. | FloatConst (_, loc)
  73. | ArrayConst (_, loc)
  74. | ArrayScalar (_, loc)
  75. | Var (_, loc)
  76. | Deref (_, _, loc)
  77. | Monop (_, _, loc)
  78. | Binop (_, _, _, loc)
  79. | Cond (_, _, _, loc)
  80. | TypeCast (_, _, loc)
  81. | FunCall (_, _, loc)
  82. -> loc
  83. | Expr value
  84. | VarUse (value, _, _)
  85. -> locof value
  86. | Block _ -> noloc