home
/
code
/
tiger.ml.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
0ed7a07
)
WIP type-checking -- check array expressions
author
Siraaj Khandkar
<siraaj@khandkar.net>
Thu, 13 Sep 2018 23:54:20 +0000
(19:54 -0400)
committer
Siraaj Khandkar
<siraaj@khandkar.net>
Thu, 13 Sep 2018 23:54:20 +0000
(19:54 -0400)
compiler/src/lib/tiger/tiger_error.ml
patch
|
blob
|
blame
|
history
compiler/src/lib/tiger/tiger_error.mli
patch
|
blob
|
blame
|
history
compiler/src/lib/tiger/tiger_semant.ml
patch
|
blob
|
blame
|
history
diff --git
a/compiler/src/lib/tiger/tiger_error.ml
b/compiler/src/lib/tiger/tiger_error.ml
index
e8af9eb
..
70c3e3c
100644
(file)
--- 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
}
; 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
| 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)
(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")
| 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 _
| 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 _
| 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
(file)
--- 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
}
; 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
| 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
(file)
--- 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 ()
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
)
| A.VarExp var ->
trvar var
)
This page took
0.024988 seconds
and
4
git commands to generate.