From fca609035c22df4ee7413e9f53311274ca0aff91 Mon Sep 17 00:00:00 2001 From: Guillotin Damien Date: Wed, 24 Nov 2021 19:38:49 +0100 Subject: [PATCH] tp2 DONE with comments --- src/passeTdsRat.ml | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/passeTdsRat.ml b/src/passeTdsRat.ml index ef48283..10bfc74 100644 --- a/src/passeTdsRat.ml +++ b/src/passeTdsRat.ml @@ -22,17 +22,22 @@ let rec analyse_tds_expression tds e = | AstSyntax.AppelFonction(str, l_expr) -> begin match chercherGlobalement tds str with + (* L'identifiant est déja déclaré *) | None -> raise (IdentifiantNonDeclare str) + | Some info -> match (info_ast_to_info info) with | InfoFun(_, _, _) -> let nl_expr = List.map (fun e -> analyse_tds_expression tds e) l_expr in AstTds.AppelFonction(info, nl_expr) + + (* L'identifiant ne fait pas référence à une fonction, on lève ue exception *) | _ -> raise (MauvaiseUtilisationIdentifiant str) end | AstSyntax.Ident(str) -> begin match chercherGlobalement tds str with + (* L'identifiant n'est pas déclaré *) | None -> raise (IdentifiantNonDeclare str) | Some info -> match (info_ast_to_info info) with @@ -40,6 +45,8 @@ let rec analyse_tds_expression tds e = AstTds.Ident(info) | InfoConst(_, v) -> AstTds.Entier(v) + + (** L'identifiant fait référence a une fonction lors de l'association a une varibale, on lève une exception *) | _ -> raise (MauvaiseUtilisationIdentifiant str) end | AstSyntax.Booleen(b) -> @@ -194,22 +201,40 @@ let analyse_tds_fonction maintds (AstSyntax.Fonction(t, str, l_typstr, bloc)) = | Some _ -> raise (DoubleDeclaration str) | None -> begin + (* Info de l'identifiant de la fonction *) let info = Tds.InfoVar(str, Undefined, 0, "") in + + (* Copie de la tds globale dans la tds locale au bloc *) let tds_bloc = creerTDSFille maintds in + + (* Ajouter les arguments de la fonction dans la tds locale *) let _ = (List.map ( fun (_, nom) -> match chercherLocalement tds_bloc nom with | None -> ajouter tds_bloc nom (info_to_info_ast (Tds.InfoVar(nom, Undefined, 0, ""))) - | Some _ -> raise (DoubleDeclaration nom) + (* Si un argument est en double, on lève une exception *) + | Some _ -> raise (DoubleDeclaration nom) ) l_typstr) in + + (* On ajoute a la tds locale la fonction pour qu'il puisse y avoir des appels récursifs *) let _ = ajouter tds_bloc str (info_to_info_ast (Tds.InfoFun(str, t, (List.map (fun (t, _) -> t) l_typstr)))) in + + (* On génère le nouveau bloc avec la tds locale *) let new_bloc = analyse_tds_bloc tds_bloc bloc in + + (* On transforme les (type * str) en (typ * info) *) let nl_typinfo = List.map ( fun (t, str2) -> ( t, info_to_info_ast (Tds.InfoVar(str2, Undefined, 0, "")) ) ) l_typstr in + + (* On crée l'info de la fonction *) let info_fun = InfoFun(str, t, (List.map (fun (t, _) -> t) l_typstr)) in + + (* On ajoute la fonction a la tds globale *) ajouter maintds str (info_to_info_ast info_fun); + + (* On retourne la AstTds fonction *) AstTds.Fonction(t, (info_to_info_ast info), nl_typinfo, new_bloc) end end