| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546 |
- open Ast
- open Util
- let rec expand_dims = function
- (* Flatten Block nodes returned by transformations below *)
- | FunDef (export, ret_type, name, params, body, loc) ->
- let params = flatten_blocks (List.map expand_dims params) in
- FunDef (export, ret_type, name, params, expand_dims body, loc)
- | FunDec (ret_type, name, params, loc) ->
- let params = flatten_blocks (List.map expand_dims params) in
- FunDec (ret_type, name, params, loc)
- | FunUse (funcall, fundef, depth) ->
- FunUse (expand_dims funcall, expand_dims fundef, depth)
- | FunCall (name, args, loc) ->
- FunCall (name, flatten_blocks (List.map expand_dims args), loc)
- (* Add additional parameters for array dimensions *)
- | Param (Array (_,dims) as ctype, name, loc) ->
- let rec do_expand = function
- | [] ->
- [Param (ctype, name, loc)]
- | Dim (name, loc) :: tail ->
- Param (Int, name, loc) :: (do_expand tail)
- | _ -> raise InvalidNode
- in
- Block (do_expand dims)
- (* Add additional function arguments for array dimensions *)
- | Arg (VarUse (var, (Array (_, dims) as ctype), depth)) ->
- let rec do_expand = function
- | [] -> [Arg (VarUse (var, ctype, depth))]
- | hd :: tl -> Arg (VarUse (hd, Int, depth)) :: (do_expand tl)
- | _ -> raise InvalidNode
- in
- Block (do_expand dims)
- | node -> transform_children expand_dims node
- let rec phase input =
- prerr_endline "- Expand array dimensions";
- match input with
- | Ast (node, args) -> Ast (expand_dims node, args)
- | _ -> raise (InvalidInput "expand dimensions")
|