| Id_not_a_function of {id : Sym.t; pos : Pos.t}
| No_such_field_in_record of {field : Sym.t; record : Typ.t; pos : Pos.t}
| Exp_not_a_record of {ty : Typ.t; pos : Pos.t}
+ | Exp_not_an_array of {ty : Typ.t; pos : Pos.t}
| Wrong_type of
{ expected : Typ.t
; given : Typ.t
s "No field %S in record %S in %s"
(Sym.to_string field) (Typ.to_string record) (Pos.to_string pos)
| Exp_not_a_record {ty; pos} ->
- s ( "This expression has type %S, it is not a record, it cannot be"
+ s ( "The expression of type %S is not a record, it cannot be"
+ ^^"accessed in %s")
+ (Typ.to_string ty) (Pos.to_string pos)
+ | Exp_not_an_array {ty; pos} ->
+ s ( "The expression of type %S is not an array, it cannot be"
^^"accessed in %s")
(Typ.to_string ty) (Pos.to_string pos)
| Wrong_type {expected; given; pos} ->
| Id_not_a_function _
| No_such_field_in_record _
| Exp_not_a_record _
+ | Exp_not_an_array _
| Wrong_type _
| Wrong_type_of_expression_in_var_dec _
| Wrong_type_used_as_record _
| Id_not_a_function of {id : Sym.t; pos : Pos.t}
| No_such_field_in_record of {field : Sym.t; record : Typ.t; pos : Pos.t}
| Exp_not_a_record of {ty : Typ.t; pos : Pos.t}
+ | Exp_not_an_array of {ty : Typ.t; pos : Pos.t}
| Wrong_type of
{ expected : Typ.t
; given : Typ.t
)
)
~otherwise:(fun () -> E.raise (E.Exp_not_a_record {ty; pos}))
- | A.SubscriptVar {var=_; exp=_; pos=_} ->
- unimplemented ()
+ | A.SubscriptVar {var; exp; pos} ->
+ let {exp=_; ty} = trvar var in
+ check_int (trexp exp) ~pos;
+ Type.if_array
+ ty
+ ~f:(fun ty_elements -> return ty_elements)
+ ~otherwise:(fun () -> E.raise (E.Exp_not_an_array {ty; pos}))
)
and trop oper ~left ~right ~pos =
let expty_left = trexp left in