WIP type-checking -- check array expressions
authorSiraaj Khandkar <siraaj@khandkar.net>
Thu, 13 Sep 2018 23:54:20 +0000 (19:54 -0400)
committerSiraaj Khandkar <siraaj@khandkar.net>
Thu, 13 Sep 2018 23:54:20 +0000 (19:54 -0400)
compiler/src/lib/tiger/tiger_error.ml
compiler/src/lib/tiger/tiger_error.mli
compiler/src/lib/tiger/tiger_semant.ml

index e8af9eb..70c3e3c 100644 (file)
@@ -28,6 +28,11 @@ type t =
       ; ty       : Typ.t
       ; pos      : Pos.t
       }
+  | Wrong_type_used_as_array of
+      { ty_id    : Sym.t
+      ; ty       : Typ.t
+      ; pos      : Pos.t
+      }
   | Wrong_type_of_field_value of
       { field_id : Sym.t
       ; expected : Typ.t
@@ -102,6 +107,10 @@ let to_string =
         (Typ.to_string expected)
         (Typ.to_string given)
         (Pos.to_string pos)
+  | Wrong_type_used_as_array {ty_id; ty; pos} ->
+      s ( "Identifier %S is bound to type %S, not an array. "
+        ^^"It cannot be used in %s")
+        (Sym.to_string ty_id) (Typ.to_string ty) (Pos.to_string pos)
   | Wrong_type_used_as_record {ty_id; ty; pos} ->
       s ( "Identifier %S is bound to type %S, not a record. "
         ^^"It cannot be used in %s")
@@ -152,6 +161,7 @@ let is_unknown_id t =
   | Exp_not_an_array _
   | Wrong_type _
   | Wrong_type_of_expression_in_var_dec _
+  | Wrong_type_used_as_array _
   | Wrong_type_used_as_record _
   | Wrong_type_of_field_value _
   | Wrong_type_of_arg _
index 92fde5d..eba33f2 100644 (file)
@@ -28,6 +28,11 @@ type t =
       ; ty       : Typ.t
       ; pos      : Pos.t
       }
+  | Wrong_type_used_as_array of
+      { ty_id    : Sym.t
+      ; ty       : Typ.t
+      ; pos      : Pos.t
+      }
   | Wrong_type_of_field_value of
       { field_id : Sym.t
       ; expected : Typ.t
index ca4b489..5d5d71b 100644 (file)
@@ -135,8 +135,18 @@ end = struct
           return_unit
       | A.LetExp {decs=_; body=_; _} ->
           unimplemented ()
-      | A.ArrayExp {typ=_; size=_; init=_; _} ->
-          unimplemented ()
+      | A.ArrayExp {typ; size; init; pos} ->
+          check_int (trexp size) ~pos;
+          let ty = env_get_typ ~sym:typ ~env ~pos in
+          Type.if_array
+            ty
+            ~f:(fun ty_elements ->
+              check_same {exp=(); ty=ty_elements} (trexp init) ~pos
+            )
+            ~otherwise:(fun () ->
+              E.raise (E.Wrong_type_used_as_array {ty_id=typ; ty; pos})
+            );
+          return ty
       | A.VarExp var ->
           trvar var
       )
This page took 0.024222 seconds and 4 git commands to generate.