module Typ = Tiger_env_type
type t =
+ | Cycle_in_type_decs of
+ { from_id : Sym.t
+ ; from_pos : Pos.t
+ ; to_id : Sym.t
+ ; to_pos : Pos.t
+ }
+ | Break_outside_loop of Pos.t
| Invalid_syntax of Pos.t
| Unknown_id of {id : Sym.t; pos : Pos.t}
| Unknown_type of {ty_id : Sym.t; pos : Pos.t}
function
| Invalid_syntax pos ->
s "Invalid syntax in %s" (Pos.to_string pos)
+ | Break_outside_loop pos ->
+ s "Break statement is not within a loop. In %s" (Pos.to_string pos)
+ | Cycle_in_type_decs {from_id; from_pos; to_id; to_pos} ->
+ s ( "Circular type declaration between %S and %S."
+ ^^"Locations: %S (in %s), %S (in %s).")
+ (Sym.to_string from_id)
+ (Sym.to_string to_id)
+ (Sym.to_string from_id)
+ (Pos.to_string from_pos)
+ (Sym.to_string to_id)
+ (Pos.to_string to_pos)
| Unknown_id {id; pos} ->
s "Unknown identifier %S in %s" (Sym.to_string id) (Pos.to_string pos)
| Unknown_type {ty_id; pos} ->
match t with
| Unknown_id _ ->
true
+ | Break_outside_loop _
+ | Cycle_in_type_decs _
| Invalid_syntax _
| Unknown_type _
| Id_is_a_function _
match t with
| Unknown_type _ ->
true
+ | Break_outside_loop _
+ | Cycle_in_type_decs _
| Unknown_id _
| Invalid_syntax _
| Id_is_a_function _
match t with
| Wrong_type _ ->
true
+ | Break_outside_loop _
+ | Cycle_in_type_decs _
| Unknown_type _
| Unknown_id _
| Invalid_syntax _
match t with
| Wrong_number_of_args _ ->
true
+ | Break_outside_loop _
+ | Cycle_in_type_decs _
| Wrong_type _
| Unknown_type _
| Unknown_id _
match t with
| Invalid_syntax _ ->
true
+ | Break_outside_loop _
+ | Cycle_in_type_decs _
| Wrong_type _
| Unknown_type _
| Unknown_id _
match t with
| Exp_not_a_record _ ->
true
+ | Break_outside_loop _
+ | Cycle_in_type_decs _
| Invalid_syntax _
| Wrong_type _
| Unknown_type _
match t with
| Exp_not_an_array _ ->
true
+ | Break_outside_loop _
+ | Cycle_in_type_decs _
| Exp_not_a_record _
| Invalid_syntax _
| Wrong_type _
match t with
| No_such_field_in_record _ ->
true
+ | Break_outside_loop _
+ | Cycle_in_type_decs _
+ | Exp_not_an_array _
+ | Exp_not_a_record _
+ | Invalid_syntax _
+ | Wrong_type _
+ | Unknown_type _
+ | Unknown_id _
+ | Id_is_a_function _
+ | Id_not_a_function _
+ | 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_number_of_args _
+ | Invalid_operand_type _
+ | Different_operand_types _ ->
+ false
+
+let is_cycle_in_type_dec t =
+ match t with
+ | Cycle_in_type_decs _ ->
+ true
+ | Break_outside_loop _
+ | No_such_field_in_record _
+ | Exp_not_an_array _
+ | Exp_not_a_record _
+ | Invalid_syntax _
+ | Wrong_type _
+ | Unknown_type _
+ | Unknown_id _
+ | Id_is_a_function _
+ | Id_not_a_function _
+ | 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_number_of_args _
+ | Invalid_operand_type _
+ | Different_operand_types _ ->
+ false
+
+let is_break_outside_loop t =
+ match t with
+ | Break_outside_loop _ ->
+ true
+ | Cycle_in_type_decs _
+ | No_such_field_in_record _
| Exp_not_an_array _
| Exp_not_a_record _
| Invalid_syntax _