tp2 DONE with comments

This commit is contained in:
Guillotin Damien 2021-11-24 19:38:49 +01:00
parent 0170403fc6
commit fca609035c

View file

@ -22,17 +22,22 @@ let rec analyse_tds_expression tds e =
| AstSyntax.AppelFonction(str, l_expr) -> | AstSyntax.AppelFonction(str, l_expr) ->
begin begin
match chercherGlobalement tds str with match chercherGlobalement tds str with
(* L'identifiant est déja déclaré *)
| None -> raise (IdentifiantNonDeclare str) | None -> raise (IdentifiantNonDeclare str)
| Some info -> | Some info ->
match (info_ast_to_info info) with match (info_ast_to_info info) with
| InfoFun(_, _, _) -> | InfoFun(_, _, _) ->
let nl_expr = List.map (fun e -> analyse_tds_expression tds e) l_expr in let nl_expr = List.map (fun e -> analyse_tds_expression tds e) l_expr in
AstTds.AppelFonction(info, nl_expr) AstTds.AppelFonction(info, nl_expr)
(* L'identifiant ne fait pas référence à une fonction, on lève ue exception *)
| _ -> raise (MauvaiseUtilisationIdentifiant str) | _ -> raise (MauvaiseUtilisationIdentifiant str)
end end
| AstSyntax.Ident(str) -> | AstSyntax.Ident(str) ->
begin begin
match chercherGlobalement tds str with match chercherGlobalement tds str with
(* L'identifiant n'est pas déclaré *)
| None -> raise (IdentifiantNonDeclare str) | None -> raise (IdentifiantNonDeclare str)
| Some info -> | Some info ->
match (info_ast_to_info info) with match (info_ast_to_info info) with
@ -40,6 +45,8 @@ let rec analyse_tds_expression tds e =
AstTds.Ident(info) AstTds.Ident(info)
| InfoConst(_, v) -> | InfoConst(_, v) ->
AstTds.Entier(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) | _ -> raise (MauvaiseUtilisationIdentifiant str)
end end
| AstSyntax.Booleen(b) -> | AstSyntax.Booleen(b) ->
@ -194,22 +201,40 @@ let analyse_tds_fonction maintds (AstSyntax.Fonction(t, str, l_typstr, bloc)) =
| Some _ -> raise (DoubleDeclaration str) | Some _ -> raise (DoubleDeclaration str)
| None -> | None ->
begin begin
(* Info de l'identifiant de la fonction *)
let info = Tds.InfoVar(str, Undefined, 0, "") in 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 let tds_bloc = creerTDSFille maintds in
(* Ajouter les arguments de la fonction dans la tds locale *)
let _ = (List.map ( let _ = (List.map (
fun (_, nom) -> fun (_, nom) ->
match chercherLocalement tds_bloc nom with match chercherLocalement tds_bloc nom with
| None -> ajouter tds_bloc nom (info_to_info_ast (Tds.InfoVar(nom, Undefined, 0, ""))) | None -> ajouter tds_bloc nom (info_to_info_ast (Tds.InfoVar(nom, Undefined, 0, "")))
(* Si un argument est en double, on lève une exception *)
| Some _ -> raise (DoubleDeclaration nom) | Some _ -> raise (DoubleDeclaration nom)
) l_typstr) in ) 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 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 let new_bloc = analyse_tds_bloc tds_bloc bloc in
(* On transforme les (type * str) en (typ * info) *)
let nl_typinfo = List.map ( let nl_typinfo = List.map (
fun (t, str2) -> fun (t, str2) ->
( t, info_to_info_ast (Tds.InfoVar(str2, Undefined, 0, "")) ) ( t, info_to_info_ast (Tds.InfoVar(str2, Undefined, 0, "")) )
) l_typstr in ) 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 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); 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) AstTds.Fonction(t, (info_to_info_ast info), nl_typinfo, new_bloc)
end end
end end