Parcourir la source

Global arrays may now also be initialised

Taddeus Kroes il y a 12 ans
Parent
commit
013ecd4880
2 fichiers modifiés avec 15 ajouts et 4 suppressions
  1. 5 0
      parser.mly
  2. 10 4
      phases/desug.ml

+ 5 - 0
parser.mly

@@ -103,6 +103,11 @@ decl:
   { let loc = loc $startpos(name) $endpos(name) in
   { let loc = loc $startpos(name) $endpos(name) in
     GlobalDef (export, ArrayDims (ctype, dims), name, None, loc) }
     GlobalDef (export, ArrayDims (ctype, dims), name, None, loc) }
 
 
+  | export=boption(EXPORT) ctype=basic_type LBRACK dims=clist(expr) RBRACK
+    name=ID ASSIGN init=expr SEMICOL
+  { let loc = loc $startpos(name) $endpos(name) in
+    GlobalDef (export, ArrayDims (ctype, dims), name, Some init, loc) }
+
 %inline ret_type:
 %inline ret_type:
     | t=basic_type  { t }
     | t=basic_type  { t }
     | VOID          { Void }
     | VOID          { Void }

+ 10 - 4
phases/desug.ml

@@ -63,14 +63,14 @@ let rec array_dims node =
     let (decs, dims) = make_dims make_dimname values make_dec in
     let (decs, dims) = make_dims make_dimname values make_dec in
     Block (decs @ [VarDec (ArrayDims (ctype, dims), name, init, ann)])
     Block (decs @ [VarDec (ArrayDims (ctype, dims), name, init, ann)])
 
 
-  | GlobalDef (export, ArrayDims (ctype, values), name, None, ann) ->
+  | GlobalDef (export, ArrayDims (ctype, values), name, init, ann) ->
     (* For global decs, the name must also be unique, but not constant (no $$in
     (* For global decs, the name must also be unique, but not constant (no $$in
      * the name) since the variable must exist for exporting *)
      * the name) since the variable must exist for exporting *)
     let make_dimname i _ = fresh_var (name ^ "$" ^ string_of_int (i + 1)) in
     let make_dimname i _ = fresh_var (name ^ "$" ^ string_of_int (i + 1)) in
 
 
     let make_dec value name = GlobalDef (export, Int, name, Some value, []) in
     let make_dec value name = GlobalDef (export, Int, name, Some value, []) in
     let (decs, dims) = make_dims make_dimname values make_dec in
     let (decs, dims) = make_dims make_dimname values make_dec in
-    Block (decs @ [GlobalDef (export, ArrayDims (ctype, dims), name, None, ann)])
+    Block (decs @ [GlobalDef (export, ArrayDims (ctype, dims), name, init, ann)])
 
 
   (* DISABLED, this is also done in extern.ml
   (* DISABLED, this is also done in extern.ml
   | GlobalDec (ArrayDims (ctype, values), name, ann) ->
   | GlobalDec (ArrayDims (ctype, values), name, ann) ->
@@ -100,6 +100,12 @@ let rec split_inits = function
       Assign (name, None, ArrayInit (value, dims), ann);
       Assign (name, None, ArrayInit (value, dims), ann);
     ]
     ]
 
 
+  | GlobalDef (export, (ArrayDims (_, dims) as ctype), name, Some value, ann) ->
+    Block [
+      GlobalDef (export, ctype, name, None, ann);
+      Assign (name, None, ArrayInit (value, dims), ann);
+    ]
+
   | VarDec (ctype, name, Some init, ann) ->
   | VarDec (ctype, name, Some init, ann) ->
     Block [
     Block [
       VarDec (ctype, name, None, ann);
       VarDec (ctype, name, None, ann);
@@ -234,9 +240,9 @@ let for_to_while node =
 
 
 let rec sublist n = function
 let rec sublist n = function
   | [] when n > 0  -> raise (Invalid_argument "n")
   | [] when n > 0  -> raise (Invalid_argument "n")
-  | []       -> []
+  | []             -> []
   | lst when n = 0 -> lst
   | lst when n = 0 -> lst
-  | _ :: tl    -> sublist (n - 1) tl
+  | _ :: tl        -> sublist (n - 1) tl
 
 
 let rec array_init = function
 let rec array_init = function
   (* Transform array constant initialisation into separate assign statements
   (* Transform array constant initialisation into separate assign statements