X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=compiler%2Fsrc%2Flib%2Ftiger%2Ftiger_error.ml;h=f2b3ae1774514e80b68373370cba37192755086f;hb=cc540a7e2dfcee4411953075210a64de874b91e5;hp=ce506d9e606744c5b40dc24bf0a1a743d27e427c;hpb=5da420a8c9d88111ef4ccabd6b0a0c65cddb73af;p=tiger.ml.git diff --git a/compiler/src/lib/tiger/tiger_error.ml b/compiler/src/lib/tiger/tiger_error.ml index ce506d9..f2b3ae1 100644 --- a/compiler/src/lib/tiger/tiger_error.ml +++ b/compiler/src/lib/tiger/tiger_error.ml @@ -4,10 +4,26 @@ module Sym = Tiger_symbol 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} + | Id_is_a_function of {id : Sym.t; pos : Pos.t} | 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 + ; pos : Pos.t + } | Wrong_type_of_expression_in_var_dec of { var_id : Sym.t ; expected : Typ.t @@ -19,6 +35,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 @@ -60,13 +81,43 @@ let to_string = 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} -> s "Unknown type %S in %s" (Sym.to_string ty_id) (Pos.to_string pos) + | Id_is_a_function {id; pos} -> + s "Identifier %S is a function, it cannot be used as a variable in %s" + (Sym.to_string id) (Pos.to_string pos) | Id_not_a_function {id; pos} -> s "Identifier %S is not a function, it cannot be called in %s" (Sym.to_string id) (Pos.to_string pos) + | No_such_field_in_record {field; record; pos} -> + 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 ( "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} -> + s "Type error: expected: %S, but given: %S, in %s" + (Typ.to_string expected) + (Typ.to_string given) + (Pos.to_string pos) | Wrong_type_of_expression_in_var_dec {var_id; expected; given; pos} -> s ( "Wrong type of expression in declaration of %S. " ^^"Expected: %S, given: %S. In %s") @@ -74,6 +125,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") @@ -115,10 +170,234 @@ let is_unknown_id t = match t with | Unknown_id _ -> true + | Break_outside_loop _ + | Cycle_in_type_decs _ + | Invalid_syntax _ + | Unknown_type _ + | Id_is_a_function _ + | 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_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_unknown_type t = + match t with + | Unknown_type _ -> + true + | Break_outside_loop _ + | Cycle_in_type_decs _ + | Unknown_id _ + | Invalid_syntax _ + | Id_is_a_function _ + | 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_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_wrong_type t = + match t with + | Wrong_type _ -> + true + | Break_outside_loop _ + | Cycle_in_type_decs _ + | Unknown_type _ + | Unknown_id _ + | Invalid_syntax _ + | Id_is_a_function _ + | Id_not_a_function _ + | No_such_field_in_record _ + | Exp_not_a_record _ + | Exp_not_an_array _ + | 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_wrong_number_of_args t = + match t with + | Wrong_number_of_args _ -> + true + | Break_outside_loop _ + | Cycle_in_type_decs _ + | Wrong_type _ + | Unknown_type _ + | Unknown_id _ + | Invalid_syntax _ + | Id_is_a_function _ + | Id_not_a_function _ + | No_such_field_in_record _ + | Exp_not_a_record _ + | Exp_not_an_array _ + | 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 _ + | Invalid_operand_type _ + | Different_operand_types _ -> + false + +let is_invalid_syntax t = + match t with + | Invalid_syntax _ -> + true + | Break_outside_loop _ + | Cycle_in_type_decs _ + | Wrong_type _ + | Unknown_type _ + | Unknown_id _ + | Id_is_a_function _ + | Id_not_a_function _ + | No_such_field_in_record _ + | Exp_not_a_record _ + | Exp_not_an_array _ + | 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_not_a_record t = + match t with + | Exp_not_a_record _ -> + true + | Break_outside_loop _ + | Cycle_in_type_decs _ + | Invalid_syntax _ + | Wrong_type _ + | Unknown_type _ + | Unknown_id _ + | Id_is_a_function _ + | Id_not_a_function _ + | No_such_field_in_record _ + | Exp_not_an_array _ + | 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_not_an_array t = + match t with + | Exp_not_an_array _ -> + true + | Break_outside_loop _ + | Cycle_in_type_decs _ + | Exp_not_a_record _ + | Invalid_syntax _ + | Wrong_type _ + | Unknown_type _ + | Unknown_id _ + | Id_is_a_function _ + | Id_not_a_function _ + | No_such_field_in_record _ + | 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_no_such_field_in_record t = + 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 _ + | 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 _