util.ml 3.3 KB

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