From: Siraaj Khandkar Date: Thu, 13 Sep 2018 23:54:20 +0000 (-0400) Subject: WIP type-checking -- check array expressions X-Git-Url: https://git.xandkar.net/?p=tiger.ml.git;a=commitdiff_plain;h=4c550cd5b9653add413e21d06c73efe3aa657e06 WIP type-checking -- check array expressions --- diff --git a/compiler/src/lib/tiger/tiger_error.ml b/compiler/src/lib/tiger/tiger_error.ml index e8af9eb..70c3e3c 100644 --- a/compiler/src/lib/tiger/tiger_error.ml +++ b/compiler/src/lib/tiger/tiger_error.ml @@ -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 _ diff --git a/compiler/src/lib/tiger/tiger_error.mli b/compiler/src/lib/tiger/tiger_error.mli index 92fde5d..eba33f2 100644 --- a/compiler/src/lib/tiger/tiger_error.mli +++ b/compiler/src/lib/tiger/tiger_error.mli @@ -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 diff --git a/compiler/src/lib/tiger/tiger_semant.ml b/compiler/src/lib/tiger/tiger_semant.ml index ca4b489..5d5d71b 100644 --- a/compiler/src/lib/tiger/tiger_semant.ml +++ b/compiler/src/lib/tiger/tiger_semant.ml @@ -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 )