feat: ajout du travail du TP2

This commit is contained in:
Laurent Fainsin 2021-11-24 15:55:48 +01:00
parent 8e42fa63d1
commit d7bc456f99
3 changed files with 164 additions and 111 deletions

View file

@ -17,7 +17,41 @@ struct
(* Vérifie la bonne utilisation des identifiants et tranforme l'expression (* Vérifie la bonne utilisation des identifiants et tranforme l'expression
en une expression de type AstTds.expression *) en une expression de type AstTds.expression *)
(* Erreur si mauvaise utilisation des identifiants *) (* Erreur si mauvaise utilisation des identifiants *)
let analyse_tds_expression tds e = (AstTds.Booleen true) (* failwith "todo"*) let rec analyse_tds_expression tds e =
match e with
| AstSyntax.AppelFonction(str, l_expr) ->
begin
match chercherGlobalement tds str with
| None -> raise (IdentifiantNonDeclare str)
| Some info -> (* TODO déréférencer le info *)
let nl_expr = List.map (fun e -> analyse_tds_expression tds e) l_expr in
AstTds.AppelFonction(info, nl_expr)
end
| AstSyntax.Ident(str) ->
begin
match chercherGlobalement tds str with
| None -> raise (IdentifiantNonDeclare str)
| Some info -> AstTds.Ident(info)
end
| AstSyntax.Booleen(b) ->
begin
AstTds.Booleen(b)
end
| AstSyntax.Entier(i) ->
begin
AstTds.Entier(i)
end
| AstSyntax.Unaire(u, expr) ->
begin
let new_expr = analyse_tds_expression tds expr in
AstTds.Unaire (u, new_expr)
end
| AstSyntax.Binaire(b, expr_1, expr_2) ->
begin
let new_expr_1 = analyse_tds_expression tds expr_1 in
let new_expr_2 = analyse_tds_expression tds expr_2 in
AstTds.Binaire(b, new_expr_1, new_expr_2)
end
(* analyse_tds_instruction : AstSyntax.instruction -> tds -> AstTds.instruction *) (* analyse_tds_instruction : AstSyntax.instruction -> tds -> AstTds.instruction *)
@ -140,8 +174,30 @@ and analyse_tds_bloc tds li =
(* Vérifie la bonne utilisation des identifiants et tranforme la fonction (* Vérifie la bonne utilisation des identifiants et tranforme la fonction
en une fonction de type AstTds.fonction *) en une fonction de type AstTds.fonction *)
(* Erreur si mauvaise utilisation des identifiants *) (* Erreur si mauvaise utilisation des identifiants *)
let analyse_tds_fonction maintds (AstSyntax.Fonction(t,n,lp,li)) = (*
failwith "TO DO" tds ->
AstSyntax.fonction[typ * string * (typ * string) list * bloc] ->
AstTds.fonction[typ * Tds.info_ast * (typ * Tds.info_ast ) list * bloc]
*)
let analyse_tds_fonction maintds (AstSyntax.Fonction(t, str, l_typstr, bloc)) =
begin
match chercherLocalement maintds str with
| Some _ -> raise (DoubleDeclaration str)
| None ->
begin
let info = Tds.InfoVar(str, Undefined, 0, "") in
let tds_bloc = List.fold_right (
fun (_, nom) qres ->
ajouter qres nom (info_to_info_ast (Tds.InfoVar(nom, Undefined, 0, "")))
) l_typstr (creerTDSFille maintds) in
let new_bloc = analyse_tds_bloc tds_bloc bloc in
let nl_typinfo = List.map (
fun (t, str2) ->
( t, info_to_info_ast (Tds.InfoVar(str2, Undefined, 0, "")) )
) l_typstr in
AstTds.Fonction(t, (info_to_info_ast info), nl_typinfo, new_bloc)
end
end
(* analyser : AstSyntax.ast -> AstTds.ast *) (* analyser : AstSyntax.ast -> AstTds.ast *)
(* Paramètre : le programme à analyser *) (* Paramètre : le programme à analyser *)

View file

@ -45,6 +45,7 @@ let ajouter tds nom info =
(* Recherche les informations d'un identificateur dans la tds locale *) (* Recherche les informations d'un identificateur dans la tds locale *)
(* Ne cherche que dans la tds de plus bas niveau *) (* Ne cherche que dans la tds de plus bas niveau *)
(* tds -> string -> info_ast option = <fun> *)
let chercherLocalement tds nom = let chercherLocalement tds nom =
match tds with match tds with
| Nulle -> None | Nulle -> None

View file

@ -8,7 +8,6 @@ exception ErreurNonDetectee;;
(* Sans fonction *) (* Sans fonction *)
(* ------------------------------ *) (* ------------------------------ *)
(*
let%test_unit "testAffectation1" = let%test_unit "testAffectation1" =
let _ = compiler "../../fichiersRat/src-rat-tds-test/testAffectation1.rat" in () let _ = compiler "../../fichiersRat/src-rat-tds-test/testAffectation1.rat" in ()
@ -159,13 +158,12 @@ let _ = compiler "../../fichiersRat/src-rat-tam-test/testif2.rat" in ()
let%test_unit "code_factiter" = let%test_unit "code_factiter" =
let _ = compiler "../../fichiersRat/src-rat-tam-test/factiter.rat" in () let _ = compiler "../../fichiersRat/src-rat-tam-test/factiter.rat" in ()
*)
(* ------------------------------ *) (* ------------------------------ *)
(* Avec fonction *) (* Avec fonction *)
(* ------------------------------ *) (* ------------------------------ *)
(*
let%test_unit "testDoubleDeclarationVariable1" = let%test_unit "testDoubleDeclarationVariable1" =
try try
let _ = compiler "../../fichiersRat/src-rat-tds-test/testDoubleDeclarationVariable1.rat" let _ = compiler "../../fichiersRat/src-rat-tds-test/testDoubleDeclarationVariable1.rat"
@ -356,5 +354,3 @@ let%test_unit "code_testfuns" =
let%test_unit "code_complique" = let%test_unit "code_complique" =
let _ = compiler "../../fichiersRat/src-rat-tam-test/complique.rat" in () let _ = compiler "../../fichiersRat/src-rat-tam-test/complique.rat" in ()
*)