expand_dims.ml 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. open Types
  2. open Util
  3. let rec expand_dims = function
  4. (* Flatten Block nodes returned by transformations below *)
  5. | FunDef (export, ret_type, name, params, body, ann) ->
  6. let params = flatten_blocks (List.map expand_dims params) in
  7. FunDef (export, ret_type, name, params, expand_dims body, ann)
  8. | FunDec (ret_type, name, params, ann) ->
  9. let params = flatten_blocks (List.map expand_dims params) in
  10. FunDec (ret_type, name, params, ann)
  11. | FunUse (dec, params, ann) ->
  12. FunUse (dec, flatten_blocks (List.map expand_dims params), ann)
  13. (* Add additional parameters for array dimensions *)
  14. | Param (Array (_,dims) as ctype, name, ann) ->
  15. let rec do_expand = function
  16. | [] ->
  17. [Param (ctype, name, ann)]
  18. | Dim (name, ann) :: tail ->
  19. Param (Int, name, ann) :: (do_expand tail)
  20. | _ -> raise InvalidNode
  21. in
  22. Block (do_expand dims)
  23. (* Add additional function arguments for array dimensions *)
  24. | Arg (VarUse (VarDec (Array (_, dims), _, _, _), None, _)) as node ->
  25. let rec do_expand = function
  26. | [] -> [node]
  27. | hd :: tl -> Arg (VarUse (hd, None, [])) :: (do_expand tl)
  28. in
  29. Block (do_expand dims)
  30. | node -> transform_children expand_dims node
  31. let phase = function
  32. | Ast node -> Ast (expand_dims node)
  33. | _ -> raise (InvalidInput "expand dimensions")