util.ml 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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 rec transform visitor node =
  9. let trav = visitor in
  10. let trav_all nodes = List.map trav nodes in
  11. match node with
  12. | Program (decls, loc) ->
  13. Program (trav_all decls, loc)
  14. | FunDec (ret_type, name, params, loc) ->
  15. FunDec (ret_type, name, trav_all params, loc)
  16. | FunDef (export, ret_type, name, params, body, loc) ->
  17. FunDef (export, ret_type, name, trav_all params, trav_all body, loc)
  18. | GlobalDec (ctype, name, loc) ->
  19. GlobalDec (ctype, name, loc)
  20. | GlobalDef (export, ctype, name, Some init, loc) ->
  21. GlobalDef (export, ctype, name, Some (trav init), loc)
  22. | VarDec (ctype, name, Some init, loc) ->
  23. VarDec (ctype, name, Some (trav init), loc)
  24. | Assign (name, value, loc) ->
  25. Assign (name, trav value, loc)
  26. | Return (value, loc) ->
  27. Return (trav value, loc)
  28. | If (cond, body, loc) ->
  29. If (trav cond, trav_all body, loc)
  30. | IfElse (cond, true_body, false_body, loc) ->
  31. IfElse (trav cond, trav_all true_body, trav_all false_body, loc)
  32. | While (cond, body, loc) ->
  33. While (trav cond, trav_all body, loc)
  34. | DoWhile (cond, body, loc) ->
  35. DoWhile (trav cond, trav_all body, loc)
  36. | For (counter, start, stop, step, body, loc) ->
  37. For (counter, trav start, trav stop, trav step, trav_all body, loc)
  38. | Expr value ->
  39. Expr (trav value)
  40. | Monop (op, value, loc) ->
  41. Monop (op, trav value, loc)
  42. | Binop (op, left, right, loc) ->
  43. Binop (op, trav left, trav right, loc)
  44. | Cond (cond, true_expr, false_expr, loc) ->
  45. Cond (trav cond, trav true_expr, trav false_expr, loc)
  46. | TypeCast (ctype, value, loc) ->
  47. TypeCast (ctype, trav value, loc)
  48. | FunCall (name, args, loc) ->
  49. FunCall (name, trav_all args, loc)
  50. | Statements (stats, loc) ->
  51. Statements (trav_all stats, loc)
  52. | _ -> node
  53. let rec locof = function
  54. | Program (_, loc)
  55. | Param (_, _, loc)
  56. | FunDec (_, _, _, loc)
  57. | FunDef (_, _, _, _, _, loc)
  58. | GlobalDec (_, _, loc)
  59. | GlobalDef (_, _, _, _, loc)
  60. | VarDec (_, _, _, loc)
  61. | Assign (_, _, loc)
  62. | Return (_, loc)
  63. | If (_, _, loc)
  64. | IfElse (_, _, _, loc)
  65. | While (_, _, loc)
  66. | DoWhile (_, _, loc)
  67. | For (_, _, _, _, _, loc)
  68. | Statements (_, 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) -> loc
  82. | Expr value -> locof value