la fin approche

This commit is contained in:
Guillotin Damien 2022-01-11 11:47:31 +01:00
parent 94c2ce32e5
commit ae1324106a
5 changed files with 251 additions and 168 deletions

View file

@ -5,7 +5,6 @@ struct
open Tds
open Ast
open AstType
open AstPlacement
open Type
open Code
@ -27,19 +26,16 @@ let rec getTailleAvant aff n =
(res + (getTaille t), false)
) (0, false) l_typstr
in tai
| _ -> failwith "TODO or not TODO"
| _ -> failwith "Internal Error"
end
| Attribut(aff2, info) -> (** (A.c).x
avec A = (1 2 (3 4) 5) = (a b c d)
avec c = (x y)
ici A ~ aff2 | c ~ info | x ~ n *)
| Attribut(aff2, info) ->
begin
match info_ast_to_info info with
| InfoVar(n2, _, _, _) ->
| InfoVar(_, _, _, _) ->
let t2 = getType aff2 in
let aff_gen = Ident (info_to_info_ast (InfoVar("", t2, 0, ""))) in
getTailleAvant aff_gen n
| _ -> failwith "adaidadj"
| _ -> failwith "Internal Error"
end
and getType aff =
@ -49,7 +45,7 @@ and getType aff =
begin
match info_ast_to_info info with
| InfoVar(_, t, _, _) -> t
| _ -> failwith "prooblemo"
| _ -> failwith "Internal Error"
end
| Attribut(aff2, info) ->
begin
@ -66,9 +62,9 @@ and getType aff =
res
) Undefined l_typstr
in t2
| _ -> failwith "pas ok"
| _ -> failwith "Internal Error"
end
| _ -> failwith "sproblematik"
| _ -> failwith "Internal Error"
end
and getTailleAttribut aff n =
@ -85,7 +81,7 @@ and getTailleAttribut aff n =
else
res
) l_typstr 0
| _ -> failwith "TODO' or not TODO'"
| _ -> failwith "Internal Error"
end
| Attribut(_, _) -> getTaille (getType aff)
@ -96,7 +92,7 @@ and getBase aff =
begin
match info_ast_to_info i with
| InfoVar(_, _, base, _) -> base
| _ -> failwith "spa bon"
| _ -> failwith "Internal Error"
end
| Attribut(a,i) ->
begin
@ -106,7 +102,7 @@ and getBase aff =
let ita = getTailleAvant aff n in
let res = ib + ita in
res
| _ -> failwith "v vhjbhki"
| _ -> failwith "Internal Error"
end
and getReg aff =
@ -116,7 +112,7 @@ and getReg aff =
begin
match info_ast_to_info i with
| InfoVar(_, _, _, reg) -> reg
| _ -> failwith "spa bon"
| _ -> failwith "Internal Error"
end
| Attribut(a,_) -> getReg a
@ -138,7 +134,7 @@ and analyse_code_affectable a =
match info_ast_to_info i with
| InfoVar(_, t, base, reg) -> "LOAD (" ^ (string_of_int (getTaille t)) ^ ") " ^ (string_of_int base) ^ "[" ^ reg ^ "]\n"
| InfoConst(_,v) -> "LOADL " ^ (string_of_int v) ^ "\n"
| _ -> failwith "w-wtf bwo y-you okay -.-"
| _ -> failwith "Internal Error"
end
| Attribut(_, _) ->
@ -154,7 +150,7 @@ and analyse_code_expression e =
| InfoFun(nom,_,_) ->
(List.fold_right (fun e res -> analyse_code_expression e ^ res) le "") ^
"CALL (ST) " ^ nom ^ "\n"
| _ -> failwith "eeeeencore un pb"
| _ -> failwith "Internal Error"
end
| Booleen(b) ->
@ -201,7 +197,7 @@ and analyse_code_expression e =
begin
match info_ast_to_info i with
| InfoVar(_, _, base, _) -> "LOADL " ^ (string_of_int base) ^ "\n"
| _ -> failwith "on a un pb"
| _ -> failwith "Internal Error"
end
| Tuple(l_expr) ->
List.fold_right (fun e res -> analyse_code_expression e ^ res) l_expr ""
@ -217,7 +213,7 @@ and analyse_code_instruction i taille_return taille_args taille_var =
"PUSH " ^ (string_of_int (getTaille t)) ^ "\n" ^
analyse_code_expression e ^
"STORE (" ^ (string_of_int (getTaille t)) ^ ") " ^ (string_of_int base) ^ "[" ^ reg ^ "]\n"
| _ -> failwith "match non exautique"
| _ -> failwith "Internal Error"
end
| Affectation(a, e) ->
@ -229,7 +225,7 @@ and analyse_code_instruction i taille_return taille_args taille_var =
| InfoVar (_, t, base, reg) ->
(analyse_code_expression e) ^
"STORE (" ^ string_of_int (getTaille t) ^ ") " ^ (string_of_int base) ^ "[" ^ reg ^ "]\n"
| _ -> failwith "Erreur interne : symbole non reconnnu"
| _ -> failwith "Internal Error"
end
| Dref(a, t) ->
@ -246,9 +242,9 @@ and analyse_code_instruction i taille_return taille_args taille_var =
| InfoVar(n, _, _, _) ->
(analyse_code_expression e) ^
"STORE (" ^ (string_of_int (getTailleAttribut a n)) ^ ") " ^ (string_of_int (getBase a)) ^ "[" ^ reg ^ "]\n"
| _ -> failwith "toujours pas bonn"
| _ -> failwith "Internal Error"
end
| _ -> failwith "toujours pas bon"
| _ -> failwith "Internal Error"
end
end
@ -321,20 +317,20 @@ and analyse_code_instruction i taille_return taille_args taille_var =
"LOADL ' '\n" ^
"SUBR COut\n"
,taille + (getTaille t))
| _ -> failwith "peut pas print des non printable, ofc"
| _ -> failwith "Internal Error"
) ("LOADL ' '\nSUBR COut\n", base) l_t in
res
end
| _ -> failwith "toujours pas bon ca"
| _ -> failwith "Internal Error"
in
let rec affichage_expression e t =
let affichage_expression e t =
let l_typstr =
match t with
| Struct(l_typstr) -> l_typstr
| _ -> failwith "wowowowow"
| _ -> failwith "Internal Error"
in
let l_t, l_s = List.split l_typstr in
let l_t, _ = List.split l_typstr in
match e with
| Tuple(l_e) ->
List.fold_right (
@ -346,7 +342,7 @@ and analyse_code_instruction i taille_return taille_args taille_var =
| Rat -> AffichageRat(e)
| Pointeur(_) -> AffichagePointeur(e)
| Struct(_) -> AffichageStruct(e, t)
| _ -> failwith "peut pas print des non printable, duh"
| _ -> failwith "Internal Error"
in
"LOADL ' '\n" ^
"SUBR COut\n" ^
@ -357,21 +353,21 @@ and analyse_code_instruction i taille_return taille_args taille_var =
| Affectable(a) ->
begin
match a with
| Dref(a,t) -> failwith "ok1"
| Dref(_, _) -> failwith "Internal Error"
| Ident(i) ->
begin
match info_ast_to_info i with
| InfoVar(_, t, base, reg) ->
affichage base reg t
| _ -> failwith "spa bon"
| _ -> failwith "Internal Error"
end
| Attribut(a2,i) ->
| Attribut(_, i) ->
match info_ast_to_info i with
| InfoVar(n, t, _, _) ->
| InfoVar(_, t, _, _) ->
let base = getBase a in
let reg = getReg a in
affichage base reg t
| _ -> failwith "zifj"
| _ -> failwith "Internal Error"
end
| AppelFonction(i, le) ->
begin
@ -393,16 +389,16 @@ and analyse_code_instruction i taille_return taille_args taille_var =
| Rat -> AffichageRat(Nothing)
| Pointeur(_) -> AffichagePointeur(Nothing)
| Struct(l_ts) -> AffichageStruct(Tuple(List.map (fun _ -> Nothing) l_ts), t)
| _ -> failwith "peut pas print des non printable, duuuh"
| _ -> failwith "Internal Error"
in
"LOADL ' '\n" ^
"SUBR COut\n" ^
(analyse_code_instruction i "0" "0" "0") ^
res
) l_typstr "LOADL ' '\nSUBR COut\n" *)
| _ -> failwith "bizreement pas ok"
| _ -> failwith "Internal Error"
end
| _ -> failwith "spa cool ca"
| _ -> failwith "Internal Error"
in
"LOADL '{'\n" ^
@ -416,20 +412,19 @@ and analyse_code_instruction i taille_return taille_args taille_var =
let etiq2 = getEtiquette () in
(analyse_code_expression e) ^
"JUMPIF (0) " ^ etiq1 ^ "\n" ^
(analyse_code_bloc b1 taille_return taille_args taille_var) ^
(analyse_code_bloc b1 taille_return taille_args) ^
"JUMP " ^ etiq2 ^ "\n" ^
etiq1 ^ "\n" ^
(analyse_code_bloc b2 taille_return taille_args taille_var) ^
(analyse_code_bloc b2 taille_return taille_args) ^
etiq2 ^ "\n"
| TantQue(e, b) ->
let taille_var = string_of_int (List.fold_right (fun e res -> taille_variables_declarees e + res) b 0) in
let etiq_while = getEtiquette () in
let etiq_fin = getEtiquette () in
etiq_while ^ "\n" ^
(analyse_code_expression e) ^
"JUMPIF (0) " ^ etiq_fin ^ "\n" ^
(analyse_code_bloc b taille_return taille_args taille_var) ^
(analyse_code_bloc b taille_return taille_args) ^
"JUMP " ^ etiq_while ^ "\n" ^
etiq_fin ^ "\n"
@ -440,7 +435,7 @@ and analyse_code_instruction i taille_return taille_args taille_var =
| Empty -> ""
and analyse_code_bloc bloc taille_return taille_args taille_var =
and analyse_code_bloc bloc taille_return taille_args =
let taille_var = string_of_int (List.fold_right (fun e res -> taille_variables_declarees e + res) bloc 0) in
List.fold_right (
fun i res -> (analyse_code_instruction i taille_return taille_args taille_var) ^ res
@ -450,19 +445,18 @@ and analyse_code_bloc bloc taille_return taille_args taille_var =
and analyse_code_fonction (AstPlacement.Fonction(info, _, bloc)) =
match info_ast_to_info info with
| InfoFun(name, t, l_t) ->
let taille_var = string_of_int (List.fold_right (fun e res -> taille_variables_declarees e + res) bloc 0) in
let taille_return = string_of_int (getTaille t) in
let taille_args = string_of_int (List.fold_right (fun e res -> getTaille e + res) l_t 0) in
name ^ "\n" ^
(analyse_code_bloc bloc taille_return taille_args taille_var) ^
(analyse_code_bloc bloc taille_return taille_args) ^
"HALT\n"
| _ -> failwith "spa normal"
| _ -> failwith "Internal Error"
let analyser (AstPlacement.Programme(fonctions, prog)) =
let code = getEntete () in
let code = code ^ List.fold_right (fun e res -> (analyse_code_fonction e) ^ res) fonctions "" in
let code = code ^ "main\n" in
let code = code ^ (analyse_code_bloc prog "0" "0" "0") in
let code = code ^ (analyse_code_bloc prog "0" "0") in
code ^ "\nHALT"
end

View file

@ -4,7 +4,6 @@ struct
open Tds
open Ast
open AstType
open AstPlacement
open Type
@ -21,7 +20,7 @@ let rec analyse_placement_instruction i base reg =
let taille = getTaille t in
modifier_adresse_info base reg info;
taille
| _ -> failwith "wtf frère"
| _ -> failwith "Internal Error"
end
| AstType.Conditionnelle(_, b1, b2) ->
@ -49,7 +48,7 @@ and analyse_placement_fonction (AstType.Fonction(info, l_typinfo, bloc)) =
| InfoVar(_,t,_,_) ->
modifier_adresse_info (res_q - (getTaille t)) "LB" x;
res_q - (getTaille t)
| _ -> failwith "pas normal"
| _ -> failwith "Internal Error"
end
) l_typinfo 0 in
let _ = analyse_placement_bloc 3 "LB" bloc in

View file

@ -11,7 +11,23 @@ struct
type t1 = Ast.AstSyntax.programme
type t2 = Ast.AstTds.programme
(*
recherche_type:
tds -> typ -> typ
Description:
Permet d'obtenir le type d'un typedef
Parameters:
- tds : la table des symboles que l'on souhaite cherche
- t : le type que l'on cherche
Returns:
Le type d'un typedef
Pre-conditions:
- True
Post-conditions:
- True
Exceptions:
- IdentifiantNonDeclare
*)
let rec recherche_type tds t =
match t with
| TIdent(t_nom) ->
@ -22,19 +38,33 @@ let rec recherche_type tds t =
begin
match info_ast_to_info i with
| InfoType(_, t2) -> recherche_type tds t2
| _ -> failwith "un truc louche ca"
| _ -> failwith "Internal Error"
end
end
| _ ->
begin
match t with
| Struct (l_typstr) ->
| Struct (l_typstr) ->
let n_l_typstr = (List.map (fun (t, n) -> (recherche_type tds t, n)) l_typstr) in
Struct n_l_typstr
| _ -> t
end
| _ -> t
(*
analyse_tds_affectable:
tds -> AstSyntax.affectable -> bool -> AstTds.affectable
Description:
Transforme les affectable de l'AstSyntax en AstTds
Parameters:
- tds : la table des symboles courante
- a : l'affectable à analyser
- modif : permet de savoir s'il sagit d'un affectable dans une expression ou dans une affectation
Returns:
Un nouvel AstTds.affectable
Pre-conditions:
- True
Post-conditions:
- True
Exceptions:
- IdentifiantNonDeclare
- MauvaiseUtilisationIdentifiant
*)
let rec analyse_tds_affectable tds a modif =
match a with
| AstSyntax.Dref new_aff ->
@ -52,21 +82,38 @@ let rec analyse_tds_affectable tds a modif =
| InfoConst _ ->
begin
if modif then
failwith "bah non en fait"
failwith "Internal Error"
else
AstTds.Ident(info)
end
| InfoFun _ -> raise (MauvaiseUtilisationIdentifiant(n))
| InfoFun _ -> (* On ne peut pas utiliser une fonction comme affectable *)
raise (MauvaiseUtilisationIdentifiant(n))
| _ -> failwith "Internal Error"
end
end
| AstSyntax.Attribut(aff, str) ->
(*
extraction_info:
affectable -> info_ast
Description:
Extrait l'info d'un affectable
Parameters:
- aff : Affectable dont on veut extraire l'info
Returns:
L'info de l'affectable
Pre-conditions:
- True
Post-conditions:
- True
*)
let rec extraction_info aff =
match aff with
| Dref(aff2) -> extraction_info aff2
| Ident(info) -> info
| Attribut(aff2, info) -> info
| Attribut(_, info) -> info
in
let n_aff = analyse_tds_affectable tds aff modif in
let info = extraction_info n_aff in
match info_ast_to_info info with
@ -77,60 +124,69 @@ let rec analyse_tds_affectable tds a modif =
let t = List.fold_right (fun (t, n) res -> if str = n then t else res) l_att Undefined in
if t != Undefined then
AstTds.Attribut(n_aff, info_to_info_ast (InfoVar(str, t, 0, "")))
else
else (** L'attribut ne correspond à aucun attribut du struct *)
raise (MauvaiseUtilisationIdentifiant str)
| _ ->
let _ = print_endline (string_of_type t) in
raise (MauvaiseUtilisationIdentifiant str)
end
| _ -> (** Il faut que l'objet sur le quel on appelle l'attribut soit un struct *)
raise (MauvaiseUtilisationIdentifiant str)
end (** Ce ne peut etre qu'un InfoVar *)
| _ -> raise (MauvaiseUtilisationIdentifiant str)
(* analyse_tds_expression : AstSyntax.expression -> AstTds.expression *)
(* Paramètre tds : la table des symboles courante *)
(* Paramètre e : l'expression à analyser *)
(* Vérifie la bonne utilisation des identifiants et tranforme l'expression
en une expression de type AstTds.expression *)
(* Erreur si mauvaise utilisation des identifiants *)
(*
analyse_tds_affectable:
tds -> AstSyntax.expression -> AstTds.expression
Description:
Vérifie la bonne utilisation des identifiants et transforme les expressions de l'AstSyntax en AstTds
Parameters:
- tds : la table des symboles courante
- e : l'expression à analyser
Returns:
Une nouvelle AstTds.expression
Pre-conditions:
- True
Post-conditions:
- True
Exceptions:
- IdentifiantNonDeclare
- MauvaiseUtilisationIdentifiant
*)
let rec analyse_tds_expression tds e =
match e with
| AstSyntax.AppelFonction(str, l_expr) ->
begin
match chercherGlobalement tds str with
(* L'identifiant est déja déclaré *)
| None -> raise (IdentifiantNonDeclare str)
| None -> (* L'identifiant est déja déclaré *)
raise (IdentifiantNonDeclare str)
| Some info ->
match (info_ast_to_info info) with
| InfoFun(_, _, _) ->
| 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)
| _ -> (* L'identifiant ne fait pas référence à une fonction, on lève une exception *)
raise (MauvaiseUtilisationIdentifiant str)
end
| AstSyntax.Booleen(b) ->
begin
AstTds.Booleen(b)
end
| AstSyntax.Entier(i) ->
begin
AstTds.Entier(i)
end
| AstSyntax.Booleen(b) -> AstTds.Booleen(b)
| AstSyntax.Entier(i) -> AstTds.Entier(i)
| AstSyntax.Unaire(u, expr) ->
begin
let new_expr = analyse_tds_expression tds expr in
AstTds.Unaire (u, new_expr)
end
let new_expr = analyse_tds_expression tds expr in
AstTds.Unaire (u, new_expr)
| 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
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)
| AstSyntax.Affectable(a) -> AstTds.Affectable(analyse_tds_affectable tds a false)
| AstSyntax.Null -> AstTds.Null
| AstSyntax.NewType(t) -> AstTds.NewType(t)
| AstSyntax.Adresse(n) ->
let info = chercherGlobalement tds n in
begin
@ -144,22 +200,37 @@ let rec analyse_tds_expression tds e =
| _ -> raise (MauvaiseUtilisationIdentifiant(n))
end
end
| AstSyntax.Tuple(le) ->
let n_le = List.map (fun e -> analyse_tds_expression tds e) le in
AstTds.Tuple(n_le)
let rec analyse_tds_typedef tds (AstSyntax.TypeDef(n, t)) =
(*
analyse_tds_typedef:
tds -> AstSyntax.typedef -> AstTds.instruction
Description:
Transforme les typedef de l'AstSyntax en AstTds.instructions
Parameters:
- tds : la table des symboles courante
- td : le typedef à analyser
Returns:
Une nouvelle AstTds.affectable
Pre-conditions:
- True
Post-conditions:
- True
Exceptions:
- DoubleDeclaration
*)
let analyse_tds_typedef tds (AstSyntax.TypeDef(n, t)) =
begin
match chercherLocalement tds n with
| None ->
(* L'identifiant n'est pas trouvé dans la tds locale,
il n'a donc pas été déclaré dans le bloc courant *)
(* Ajout dans la tds de la constante *)
| None -> (* L'identifiant n'est pas trouvé dans la tds locale du bloc, on ajoute donc dans la tds la constante *)
ajouter tds n (info_to_info_ast (InfoType (n, t)));
Empty
| Some _ ->
(* L'identifiant est trouvé dans la tds locale,
il a donc déjà été déclaré dans le bloc courant *)
| Some _ -> (* L'identifiant est trouvé dans la tds locale, il a donc double déclaration *)
raise (DoubleDeclaration n)
end
@ -169,109 +240,130 @@ let rec analyse_tds_typedef tds (AstSyntax.TypeDef(n, t)) =
(* Vérifie la bonne utilisation des identifiants et tranforme l'instruction
en une instruction de type AstTds.instruction *)
(* Erreur si mauvaise utilisation des identifiants *)
(*
analyse_tds_typedef:
tds -> AstSyntax.typedef -> AstTds.instruction
Description:
Transforme les typedef de l'AstSyntax en AstTds.instructions
Parameters:
- tds : la table des symboles courante
- td : le typedef à analyser
Returns:
Une nouvelle AstTds.affectable
Pre-conditions:
- True
Post-conditions:
- True
Exceptions:
- DoubleDeclaration
*)
let rec analyse_tds_instruction tds i =
match i with
| AstSyntax.Declaration (t, n, e) ->
begin
match chercherLocalement tds n with
| None ->
| None -> (* L'identifiant n'est pas trouvé dans la tds locale, il n'a donc pas été déclaré dans le bloc courant *)
let nt = recherche_type tds t in
(* L'identifiant n'est pas trouvé dans la tds locale,
il n'a donc pas été déclaré dans le bloc courant *)
(* Vérification de la bonne utilisation des identifiants dans l'expression *)
(* et obtention de l'expression transformée *)
(* Vérification de la bonne utilisation des identifiants dans l'expression et obtention de l'expression transformée *)
let ne = analyse_tds_expression tds e in
(* Création de l'information associée à l'identfiant *)
let info = InfoVar (n, nt, 0, "") in
(* Création du pointeur sur l'information *)
let ia = info_to_info_ast info in
(* Ajout de l'information (pointeur) dans la tds *)
ajouter tds n ia;
(* Renvoie de la nouvelle déclaration où le nom a été remplacé par l'information
et l'expression remplacée par l'expression issue de l'analyse *)
(* Renvoie de la nouvelle déclaration où le nom a été remplacé par l'information et l'expression remplacée par l'expression issue de l'analyse *)
AstTds.Declaration (nt, ia, ne)
| Some _ ->
(* L'identifiant est trouvé dans la tds locale,
il a donc déjà été déclaré dans le bloc courant *)
| Some _ -> (* L'identifiant est trouvé dans la tds locale, il a donc déjà été déclaré dans le bloc courant *)
raise (DoubleDeclaration n)
end
| AstSyntax.Affectation (aff, e) ->
begin
let ne = analyse_tds_expression tds e in
let n_a = analyse_tds_affectable tds aff false in
match aff with
| Dref a ->
Affectation (n_a, ne)
| Ident(n) ->
begin
match chercherGlobalement tds n with
| None ->
(* L'identifiant n'est pas trouvé dans la tds globale. *)
raise (IdentifiantNonDeclare n)
| Some info ->
(* L'identifiant est trouvé dans la tds globale,
il a donc déjà été déclaré. L'information associée est récupérée. *)
begin
match info_ast_to_info info with
| InfoVar _ ->
(* Renvoie de la nouvelle affectation où le nom a été remplacé par l'information
et l'expression remplacée par l'expression issue de l'analyse *)
Affectation (n_a, ne)
| _ ->
(* Modification d'une constante ou d'une fonction *)
raise (MauvaiseUtilisationIdentifiant n)
end
end
| Attribut(aff2, n) ->
begin
(** RAF *)
Affectation(n_a, ne)
end
| Dref _ ->
Affectation (n_a, ne)
| Ident(n) ->
begin
match chercherGlobalement tds n with
| None -> (* L'identifiant n'est pas trouvé dans la tds globale. *)
raise (IdentifiantNonDeclare n)
| Some info -> (* L'identifiant est trouvé dans la tds globale, il a donc déjà été déclaré. L'information associée est récupérée. *)
begin
match info_ast_to_info info with
| InfoVar _ -> (* Renvoie de la nouvelle affectation où le nom a été remplacé par l'information et l'expression remplacée par l'expression issue de l'analyse *)
Affectation (n_a, ne)
| _ -> (* Modification d'une constante ou d'une fonction *)
raise (MauvaiseUtilisationIdentifiant n)
end
end
| Attribut(_, _) -> (* RAF *)
Affectation(n_a, ne)
end
| AstSyntax.Constante (n,v) ->
begin
match chercherLocalement tds n with
| None ->
(* L'identifiant n'est pas trouvé dans la tds locale,
il n'a donc pas été déclaré dans le bloc courant *)
(* Ajout dans la tds de la constante *)
ajouter tds n (info_to_info_ast (InfoConst (n,v)));
(* Suppression du noeud de déclaration des constantes devenu inutile *)
Empty
| Some _ ->
(* L'identifiant est trouvé dans la tds locale,
il a donc déjà été déclaré dans le bloc courant *)
| None -> (* L'identifiant n'est pas trouvé dans la tds locale, il n'a donc pas été déclaré dans le bloc courant *)
(* Ajout dans la tds de la constante *)
ajouter tds n (info_to_info_ast (InfoConst (n,v)));
(* Suppression du noeud de déclaration des constantes devenu inutile *)
Empty
| Some _ -> (* L'identifiant est trouvé dans la tds locale, il a donc déjà été déclaré dans le bloc courant *)
raise (DoubleDeclaration n)
end
| AstSyntax.Affichage e ->
(* Vérification de la bonne utilisation des identifiants dans l'expression *)
(* et obtention de l'expression transformée *)
(* Vérification de la bonne utilisation des identifiants dans l'expression et obtention de l'expression transformée *)
let ne = analyse_tds_expression tds e in
(* Renvoie du nouvel affichage où l'expression remplacée par l'expression issue de l'analyse *)
Affichage (ne)
| AstSyntax.Conditionnelle (c,t,e) ->
(* Analyse de la condition *)
let nc = analyse_tds_expression tds c in
(* Analyse du bloc then *)
let tast = analyse_tds_bloc tds t in
(* Analyse du bloc else *)
let east = analyse_tds_bloc tds e in
(* Renvoie la nouvelle structure de la conditionnelle *)
Conditionnelle (nc, tast, east)
| AstSyntax.TantQue (c,b) ->
(* Analyse de la condition *)
let nc = analyse_tds_expression tds c in
(* Analyse du bloc *)
let bast = analyse_tds_bloc tds b in
(* Renvoie la nouvelle structure de la boucle *)
TantQue (nc, bast)
| AstSyntax.Retour (e) ->
(* Analyse de l'expression *)
let ne = analyse_tds_expression tds e in
Retour (ne)
| AstSyntax.LocalTypeDef(td) ->
(* Analyse du typedef *)
analyse_tds_typedef tds td
@ -309,9 +401,6 @@ 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

View file

@ -18,15 +18,14 @@ let rec analyse_type_affectable a =
begin
match (analyse_type_affectable a) with
| (na, Pointeur t) -> (AstType.Dref(na, t), t)
| _ -> failwith "jsp koi mettre ici"
| _ -> failwith "Internal Error"
end
| AstTds.Ident(info) ->
begin
match info_ast_to_info info with
| InfoVar(_, t, _, _) -> (AstType.Ident(info), t)
| InfoConst _ -> (AstType.Ident(info), Int)
| InfoFun _ -> failwith "c chelou frr"
| InfoType _ -> failwith "c koi le pb encore"
| _ -> failwith "Internal Error"
end
| AstTds.Attribut(aff, info) ->
begin
@ -34,7 +33,7 @@ let rec analyse_type_affectable a =
match info_ast_to_info info with
| InfoVar(_, t, _, _) ->
(AstType.Attribut(n_aff, info), t)
| _ -> failwith "heuuuu wtf, c cringe"
| _ -> failwith "Internal Error"
end
@ -55,7 +54,7 @@ let rec analyse_type_expression e =
(AstType.AppelFonction(info, n_l_expr), t)
else
raise (TypesParametresInattendus(l_type_fun, l_type))
| _ -> failwith "pas normal"
| _ -> failwith "Internal Error"
end
| AstTds.Unaire(u, expr) ->
@ -105,7 +104,7 @@ let rec analyse_type_expression e =
| InfoVar(_, t, _, _) ->
let _ = modifier_type_info (Pointeur(t)) info in
(AstType.Adresse(info), Pointeur(t))
| _ -> failwith "FAIII with"
| _ -> failwith "Internal Error"
end
| AstTds.Tuple(l_expr) ->
@ -135,8 +134,8 @@ let rec analyse_type_instruction opt i =
| Dref a ->
begin
match (analyse_type_affectable a) with
| (na, Pointeur t) -> AstType.Affectation(na, ne)
| _ -> failwith "jsp koi mettre ici"
| (na, Pointeur _) -> AstType.Affectation(na, ne)
| _ -> failwith "Internal Error"
end
| AstTds.Ident info ->
begin
@ -146,7 +145,7 @@ let rec analyse_type_instruction opt i =
AstType.Affectation(AstType.Ident(info), ne)
else
raise (TypeInattendu(nt, t))
| _ -> failwith "wut"
| _ -> failwith "Internal Error"
end
| AstTds.Attribut(aff2, info) ->
begin
@ -157,7 +156,7 @@ let rec analyse_type_instruction opt i =
AstType.Affectation(Attribut(na, info), ne)
else
raise (TypeInattendu(nt, t))
| _ -> failwith "pas bon du tout"
| _ -> failwith "Internal Error"
end
end
@ -170,7 +169,7 @@ let rec analyse_type_instruction opt i =
| Bool -> AstType.AffichageBool(ne)
| Pointeur _ -> AstType.AffichagePointeur(ne)
| Struct _ -> AstType.AffichageStruct(ne, nt)
| _ -> failwith "un truc chelou"
| _ -> failwith "Internal Error"
end
| AstTds.Conditionnelle (e, b1, b2) ->
@ -203,7 +202,7 @@ let rec analyse_type_instruction opt i =
AstType.Retour(ne)
else
raise (TypeInattendu(nt, t))
| None -> failwith "Pas de return dans le main"
| None -> failwith "Internal Error"
end
| AstTds.Empty -> AstType.Empty
@ -244,7 +243,7 @@ let analyse_type_fonction opt (AstTds.Fonction(t, info, l_typinfo, bloc)) =
end
else
raise (TypeInattendu(t, t_ret))
| None -> failwith "Il faut un return dans une fonction"
| None -> failwith "Internal Error"
(* analyser : AstTds.ast -> AstType.ast *)

View file

@ -55,6 +55,7 @@ struct
match a with
| AstSyntax.Dref(n) -> (string_of_affectable n)
| AstSyntax.Ident(n) -> n ^ " "
| _ -> ""
(* Conversion des expressions *)
let rec string_of_expression e =
@ -69,6 +70,7 @@ struct
| Fraction -> "["^(string_of_expression e1)^"/"^(string_of_expression e2)^"] "
| _ -> (string_of_expression e1)^(string_of_binaire b)^(string_of_expression e2)^" "
end
|_ -> ""
let string_of_typedef (TypeDef(n, t)) = n ^ "->" ^ (string_of_type t) ^ "\n"