feat: un peu d'affichage TODO: affichage d'un struct affectable & struct dans struct

This commit is contained in:
Guillotin Damien 2021-12-14 10:02:57 +01:00
parent 9fe64cc45e
commit 517d2e6e86
10 changed files with 105 additions and 34 deletions

View file

@ -189,7 +189,7 @@ type bloc = instruction list
| AffichageRat of expression | AffichageRat of expression
| AffichageBool of expression | AffichageBool of expression
| AffichagePointeur of expression | AffichagePointeur of expression
| AffichageStruct of expressionn | AffichageStruct of expression * typ
| Conditionnelle of expression * bloc * bloc | Conditionnelle of expression * bloc * bloc
| TantQue of expression * bloc | TantQue of expression * bloc
| Retour of expression | Retour of expression

View file

@ -1,5 +1,5 @@
main{ main{
typedef Point = struct { struct { int a int b } x int y int z }; typedef Point = struct { int x int y int z };
Point p = { {1 2} 3 4}; Point p = { 1 2 3 };
print (p.x.a); print (p.x);
} }

View file

@ -0,0 +1,5 @@
main{
typedef Point = struct { struct { int a int b } x int y int z };
Point p = { {1 2} 3 4};
print ((p.x).b);
}

View file

@ -0,0 +1,4 @@
main {
int * p = (new int);
print p;
}

View file

@ -0,0 +1,4 @@
main {
struct{int x int y} p = {1 2};
print p;
}

View file

@ -24,13 +24,15 @@ let rec getTailleAvant aff n =
(* print_endline (string_of_bool trouv); (* print_endline (string_of_bool trouv);
print_endline (s ^ " " ^ n); print_endline (s ^ " " ^ n);
print_endline (string_of_bool (s = n)); *) print_endline (string_of_bool (s = n)); *)
if s = n or trouv then if s = n || trouv then
(res, true) (res, true)
else else
(res + (getTaille t), false) (res + (getTaille t), false)
) (0, false) l_typstr ) (0, false) l_typstr
in tai in tai
| _ -> failwith "TODO or not TODO"
end end
| Attribut(aff,info) -> failwith "TODO"
and getTailleAttribut aff n = and getTailleAttribut aff n =
match aff with match aff with
@ -46,7 +48,9 @@ and getTailleAttribut aff n =
else else
res res
) l_typstr 0 ) l_typstr 0
| _ -> failwith "TODO' or not TODO'"
end end
| Attribut(aff,info) -> failwith "TODO'"
and analyse_code_affectable a = and analyse_code_affectable a =
match a with match a with
@ -68,13 +72,17 @@ and analyse_code_affectable a =
match aff with match aff with
| Dref(aff2, _) -> extraction_info aff2 | Dref(aff2, _) -> extraction_info aff2
| Ident(info) -> info | Ident(info) -> info
| Attribut(aff2, info) -> info | Attribut(_, info) -> info
in in
match (info_ast_to_info (extraction_info a)) with match (info_ast_to_info (extraction_info a)) with
| InfoVar(_, t, base, reg) -> | InfoVar(_, _, base, reg) ->
let InfoVar(n, _, _, _) = info_ast_to_info i in begin
match info_ast_to_info i with
| InfoVar(n, _, _, _) ->
let t_avant = getTailleAvant a n in let t_avant = getTailleAvant a n in
"LOAD (" ^ (string_of_int (getTailleAttribut a n)) ^ ") " ^ (string_of_int (base + t_avant)) ^ "[" ^ reg ^ "]\n" "LOAD (" ^ (string_of_int (getTailleAttribut a n)) ^ ") " ^ (string_of_int (base + t_avant)) ^ "[" ^ reg ^ "]\n"
| _ -> failwith "g pu d'ID"
end
| _ -> failwith "toujours pas bon" | _ -> failwith "toujours pas bon"
end end
@ -82,9 +90,11 @@ and analyse_code_expression e =
match e with match e with
| AppelFonction(i, le) -> | AppelFonction(i, le) ->
begin begin
let InfoFun(nom,_,_) = info_ast_to_info i in match info_ast_to_info i with
| InfoFun(nom,_,_) ->
(List.fold_right (fun e res -> analyse_code_expression e ^ res) le "") ^ (List.fold_right (fun e res -> analyse_code_expression e ^ res) le "") ^
"CALL (ST) " ^ nom ^ "\n" "CALL (ST) " ^ nom ^ "\n"
| _ -> failwith "eeeeencore un pb"
end end
| Booleen(b) -> | Booleen(b) ->
@ -128,18 +138,25 @@ and analyse_code_expression e =
"SUBR MAlloc\n" "SUBR MAlloc\n"
| Adresse(i) -> | Adresse(i) ->
let InfoVar(_, _, base, reg) = info_ast_to_info i in begin
"LOADL " ^ (string_of_int base) ^ "\n" match info_ast_to_info i with
| InfoVar(_, _, base, _) -> "LOADL " ^ (string_of_int base) ^ "\n"
| _ -> failwith "on a un pb"
end
| Tuple(l_expr) -> | Tuple(l_expr) ->
List.fold_right (fun e res -> analyse_code_expression e ^ res) l_expr "" List.fold_right (fun e res -> analyse_code_expression e ^ res) l_expr ""
and analyse_code_instruction i taille_return taille_args taille_var = and analyse_code_instruction i taille_return taille_args taille_var =
match i with match i with
| Declaration(i, e) -> | Declaration(i, e) ->
let InfoVar(_, t, base, reg) = info_ast_to_info i in begin
match info_ast_to_info i with
| InfoVar(_, t, base, reg) ->
"PUSH " ^ (string_of_int (getTaille t)) ^ "\n" ^ "PUSH " ^ (string_of_int (getTaille t)) ^ "\n" ^
analyse_code_expression e ^ analyse_code_expression e ^
"STORE (" ^ (string_of_int (getTaille t)) ^ ") " ^ (string_of_int base) ^ "[" ^ reg ^ "]\n" "STORE (" ^ (string_of_int (getTaille t)) ^ ") " ^ (string_of_int base) ^ "[" ^ reg ^ "]\n"
| _ -> failwith "match non exautique"
end
| Affectation(a, e) -> | Affectation(a, e) ->
begin begin
@ -161,7 +178,7 @@ and analyse_code_instruction i taille_return taille_args taille_var =
| Attribut(aff, info) -> | Attribut(aff, info) ->
begin begin
match (info_ast_to_info info) with match (info_ast_to_info info) with
| InfoVar(n, t, base, reg) -> | InfoVar(n, _, base, reg) ->
let t_avant = getTailleAvant aff n in let t_avant = getTailleAvant aff n in
(analyse_code_expression e) ^ (analyse_code_expression e) ^
"STORE (" ^ (string_of_int (getTailleAttribut aff n)) ^ ") " ^ (string_of_int (base + t_avant)) ^ "[" ^ reg ^ "]\n" "STORE (" ^ (string_of_int (getTailleAttribut aff n)) ^ ") " ^ (string_of_int (base + t_avant)) ^ "[" ^ reg ^ "]\n"
@ -183,17 +200,38 @@ and analyse_code_instruction i taille_return taille_args taille_var =
"SUBR BOut\n" "SUBR BOut\n"
| AffichagePointeur(e) -> | AffichagePointeur(e) ->
"LOADL '@'\n" ^
"SUBR COut\n" ^
(analyse_code_expression e) ^ (analyse_code_expression e) ^
"SUBR BOut\n" "SUBR IOut\n"
| AffichageStruct(le) ->
List.fold_right (
fun e res ->
res ^
(analyse_code_expression e) ^
"SUBR BOut\n"
) le ""
| AffichageStruct(e, t) ->
let l_e =
match e with
| Tuple(l_e) -> l_e
| Affectable(a) -> failwith "TODO encore"
| _ -> failwith "normal non"
in
let l_t =
match t with
| Struct(l_typstr) ->
let (l_t, _) = List.split l_typstr in
l_t
| _ -> failwith "un truc"
in
"LOADL '{'\n" ^
"SUBR COut\n" ^
(List.fold_right (
fun (e1, t1) res ->
(match t1 with
| Bool -> (analyse_code_instruction (AffichageBool(e1)) "0" "0" "0")
| Int -> (analyse_code_instruction (AffichageInt(e1)) "0" "0" "0")
| Rat -> (analyse_code_instruction (AffichageRat(e1)) "0" "0" "0")
| Pointeur _ -> (analyse_code_instruction (AffichagePointeur(e1)) "0" "0" "0")
| Struct _ -> (analyse_code_instruction (AffichageStruct(e1, t1)) "0" "0" "0")
| _ -> failwith "jamais la tfacon") ^ "LOADL ' '\n" ^ "SUBR COut\n" ^ res) (List.combine l_e l_t) "") ^
"LOADL '}'\n" ^
"SUBR COut\n"
| Conditionnelle(e, b1, b2) -> | Conditionnelle(e, b1, b2) ->
let etiq1 = getEtiquette () in let etiq1 = getEtiquette () in
@ -222,7 +260,6 @@ and analyse_code_instruction i taille_return taille_args taille_var =
"POP (" ^ taille_return ^ ") " ^ taille_var ^ "\n" ^ "POP (" ^ taille_return ^ ") " ^ taille_var ^ "\n" ^
"RETURN (" ^ taille_return ^ ") " ^ taille_args ^ "\n" "RETURN (" ^ taille_return ^ ") " ^ taille_args ^ "\n"
| Empty -> "" | Empty -> ""
and analyse_code_bloc bloc taille_return taille_args taille_var = and analyse_code_bloc bloc taille_return taille_args taille_var =
@ -232,7 +269,7 @@ and analyse_code_bloc bloc taille_return taille_args taille_var =
) bloc "" ^ ) bloc "" ^
"POP (0) " ^ taille_var ^ "\n" "POP (0) " ^ taille_var ^ "\n"
and analyse_code_fonction (AstPlacement.Fonction(info, l_typinfo, bloc)) = and analyse_code_fonction (AstPlacement.Fonction(info, _, bloc)) =
match info_ast_to_info info with match info_ast_to_info info with
| InfoFun(name, t, l_t) -> | 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_var = string_of_int (List.fold_right (fun e res -> taille_variables_declarees e + res) bloc 0) in

View file

@ -26,6 +26,7 @@ let rec analyse_type_affectable a =
| InfoVar(_, t, _, _) -> (AstType.Ident(info), t) | InfoVar(_, t, _, _) -> (AstType.Ident(info), t)
| InfoConst _ -> (AstType.Ident(info), Int) | InfoConst _ -> (AstType.Ident(info), Int)
| InfoFun _ -> failwith "c chelou frr" | InfoFun _ -> failwith "c chelou frr"
| InfoType _ -> failwith "c koi le pb encore"
end end
| AstTds.Attribut(aff, info) -> | AstTds.Attribut(aff, info) ->
begin begin
@ -99,9 +100,13 @@ let rec analyse_type_expression e =
(AstType.NewType(t), Pointeur(t)) (AstType.NewType(t), Pointeur(t))
| AstTds.Adresse(info) -> | AstTds.Adresse(info) ->
let InfoVar(_, t, _, _) = info_ast_to_info info in begin
match info_ast_to_info info with
| InfoVar(_, t, _, _) ->
let _ = modifier_type_info (Pointeur(t)) info in let _ = modifier_type_info (Pointeur(t)) info in
(AstType.Adresse(info), Pointeur(t)) (AstType.Adresse(info), Pointeur(t))
| _ -> failwith "FAIII with"
end
| AstTds.Tuple(l_expr) -> | AstTds.Tuple(l_expr) ->
let n_l_expr, l_type = List.split (List.map analyse_type_expression l_expr) in let n_l_expr, l_type = List.split (List.map analyse_type_expression l_expr) in
@ -143,6 +148,7 @@ let rec analyse_type_instruction opt i =
raise (TypeInattendu(nt, t)) raise (TypeInattendu(nt, t))
| _ -> failwith "wut" | _ -> failwith "wut"
end end
| AstTds.Attribut _ -> failwith "TODOOO"
end end
| AstTds.Affichage e -> | AstTds.Affichage e ->
@ -153,7 +159,7 @@ let rec analyse_type_instruction opt i =
| Rat -> AstType.AffichageRat(ne) | Rat -> AstType.AffichageRat(ne)
| Bool -> AstType.AffichageBool(ne) | Bool -> AstType.AffichageBool(ne)
| Pointeur _ -> AstType.AffichagePointeur(ne) | Pointeur _ -> AstType.AffichagePointeur(ne)
| Struct _ -> AstType.AffichageStruct(ne) | Struct _ -> AstType.AffichageStruct(ne, nt)
| _ -> failwith "un truc chelou" | _ -> failwith "un truc chelou"
end end

View file

@ -289,6 +289,7 @@ let string_of_info info =
| InfoVar (n,t,dep,base) -> "Variable "^n^" : "^(string_of_type t)^" "^(string_of_int dep)^"["^base^"]" | InfoVar (n,t,dep,base) -> "Variable "^n^" : "^(string_of_type t)^" "^(string_of_int dep)^"["^base^"]"
| InfoFun (n,t,tp) -> "Fonction "^n^" : "^(List.fold_right (fun elt tq -> if tq = "" then (string_of_type elt) else (string_of_type elt)^" * "^tq) tp "" )^ | InfoFun (n,t,tp) -> "Fonction "^n^" : "^(List.fold_right (fun elt tq -> if tq = "" then (string_of_type elt) else (string_of_type elt)^" * "^tq) tp "" )^
" -> "^(string_of_type t) " -> "^(string_of_type t)
| InfoType(n, t) -> "Type" ^ n ^ ": " ^ (string_of_type t)
(* Affiche la tds locale *) (* Affiche la tds locale *)
let afficher_locale tds = let afficher_locale tds =

View file

@ -138,4 +138,16 @@ let%expect_test "typedef2" =
let%expect_test "struct1" = let%expect_test "struct1" =
runtam "../../fichiersRat/src-rat-tam-test/struct1.rat"; runtam "../../fichiersRat/src-rat-tam-test/struct1.rat";
[%expect{| 123 |}] [%expect{| 1 |}]
let%expect_test "struct2" =
runtam "../../fichiersRat/src-rat-tam-test/struct2.rat";
[%expect{| 2 |}]
let%expect_test "printPointeur" =
runtam "../../fichiersRat/src-rat-tam-test/testprintPointeur.rat";
[%expect{| @1048575 |}]
let%expect_test "printStruct" =
runtam "../../fichiersRat/src-rat-tam-test/testprintStruct.rat";
[%expect{| {1 2 } |}]

View file

@ -5,6 +5,7 @@ let rec string_of_type t =
| Bool -> "Bool" | Bool -> "Bool"
| Int -> "Int" | Int -> "Int"
| Rat -> "Rat" | Rat -> "Rat"
| TIdent s -> s
| Pointeur(t_p) -> "*" ^ string_of_type t_p | Pointeur(t_p) -> "*" ^ string_of_type t_p
| Struct(l_typstr) -> "{" ^ (List.fold_right (fun (t, s) res -> string_of_type t ^ " : " ^ s ^ " " ^ res) l_typstr "}") | Struct(l_typstr) -> "{" ^ (List.fold_right (fun (t, s) res -> string_of_type t ^ " : " ^ s ^ " " ^ res) l_typstr "}")
| Undefined -> "Undefined" | Undefined -> "Undefined"
@ -57,6 +58,7 @@ let rec getTaille t =
| Int -> 1 | Int -> 1
| Bool -> 1 | Bool -> 1
| Rat -> 2 | Rat -> 2
| TIdent _ -> failwith "les typedef n'ont pas de taille"
| Pointeur(_) -> 1 | Pointeur(_) -> 1
| Struct(l_typestr) -> List.fold_right (fun (t, _) res -> (getTaille t) + res) l_typestr 0 | Struct(l_typestr) -> List.fold_right (fun (t, _) res -> (getTaille t) + res) l_typestr 0
| Undefined -> 0 | Undefined -> 0