From d005ec0e22d440981e5826714d3ae371d1842d07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luc=C3=A0s?= Date: Thu, 6 Apr 2023 23:49:05 +0200 Subject: [PATCH] feat(typing): function definition --- src/typing.ml | 75 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 74 insertions(+), 1 deletion(-) diff --git a/src/typing.ml b/src/typing.ml index d5abb87..7bad263 100644 --- a/src/typing.ml +++ b/src/typing.ml @@ -38,6 +38,28 @@ let findEnv_fun (name: fname) (env: environment) = -> (Lang.tp * Lang.fname * Lang.vardecl list) option = *) +(* Ajout dans l'environnement *) +let addEnv_var (var_decl: vardecl) (env: environment) = + let Vardecl(var_decl_tp, var_decl_name) = var_decl + in { + localvars=(var_decl_name, var_decl_tp)::(env.localvars); + funbind=env.funbind +};; +(* val addEnv_var : + Lang.vardecl -> environment + -> environment = +*) + +let addEnv_fun (fun_decl: fundecl) (env: environment) = { + localvars=(env.localvars); + funbind=(fun_decl::(env.funbind)) +};; +(* val addEnv_fun : + Lang.fundecl -> environment + -> environment = +*) + +(* Typage d'une declaration de variable *) let tp_vardecl (vdecl: vardecl) = let Vardecl(vdecl_tp, _) = vdecl in vdecl_tp @@ -250,7 +272,58 @@ let test_tp_cmd = (List.map function_to_test input_values) = expected_result ;; -(* let tp_fundefn fundefns = ;; *) +(* ----- Typage d'une définition de fonction ----- *) +let rec count_same_var_name (name: string) (var_decl_list: vardecl list) = + match var_decl_list with + | [] -> 0 + | Vardecl(var_tp, var_name)::reste -> + (count_same_var_name name reste) + + if name = var_name then 1 else 0 +;; +(* val count_same_var_decl : string -> Lang.vardecl list -> int = *) + +let rec valid_vardecl_list (var_decl_list: vardecl list) = + match var_decl_list with + | [] -> true + | Vardecl(var_tp, var_name)::reste -> + if (count_same_var_name var_name reste) = 0 + then valid_vardecl_list reste + else false +;; +(* val valid_vardecl_list : Lang.vardecl list -> bool = *) + +let tp_fundefn (env: environment) (fun_def: fundefn) = + let Fundefn(fun_decl, cmd) = fun_def in + let Fundecl(fun_decl_tp,_,var_decl_list) = fun_decl in + let env1 = (addEnv_fun fun_decl env) in (* Besoin d'effacer dans l'env si recurence ? *) + let _ = tp_cmd env1 cmd + in if valid_vardecl_list var_decl_list && (tp_cmd env1 cmd) = fun_decl_tp + then fun_decl_tp + else raise (Failure "Invalid function definition") +;; +(* val tp_fundefn : + environment -> Lang.fundefn + -> Lang.tp = +*) + +(* - tp_fundefn: TESTS - *) +let test_tp_fundefn = + let function_to_test = tp_fundefn { + localvars=[]; + funbind=[] + } + and input_values = [ + Fundefn( + Fundecl(BoolT, "fun1", [Vardecl(IntT, "a"); Vardecl(FloatT, "b")]), + Return(BinOp(BCompar(BCeq), Const(IntV(4)), Const(IntV(5)))) + ) + ] + and expected_result = [ + BoolT + ] in + (List.map function_to_test input_values) = expected_result +;; + (* let tp_stmt fundecls = ;; *) let tp_prog (Prog (fundecls, fundefns)) = true;; (* try (tp_fundefn fundefns) && (tp_stmt fundecls) with _ -> false *) \ No newline at end of file