From 4cd506f3db7483f1caec73748bc9098908619b8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Pasteur?= Date: Tue, 6 Sep 2011 14:20:57 +0200 Subject: [PATCH] Added c ast for constant Also print only short names for struct fields --- compiler/obc/c/c.ml | 23 +++++++++++++++++++---- compiler/obc/c/cgen.ml | 2 +- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/compiler/obc/c/c.ml b/compiler/obc/c/c.ml index 9188267..0764e35 100644 --- a/compiler/obc/c/c.ml +++ b/compiler/obc/c/c.ml @@ -112,6 +112,8 @@ type cdecl = | Cdecl_struct of string * (string * cty) list (** C function declaration. *) | Cdecl_function of string * cty * (string * cty) list + (** C constant declaration (alias, name)*) + | Cdecl_constant of string * cty * cexpr (** C function definitions *) type cfundef = { @@ -170,6 +172,9 @@ let cname_of_qn qn = let pp_qualname fmt q = pp_string fmt (cname_of_qn q) +let pp_shortname fmt q = + pp_string fmt q.name + let rec pp_cty fmt cty = match cty with | Cty_int -> fprintf fmt "int" | Cty_float -> fprintf fmt "float" @@ -245,15 +250,22 @@ and pp_cexpr fmt ce = match ce with | Cconst c -> pp_cconst fmt c | Cvar s -> pp_string fmt s | Cderef e -> fprintf fmt "*%a" pp_cexpr e - | Cfield (Cderef e, f) -> fprintf fmt "%a->%a" pp_cexpr e pp_qualname f - | Cfield (e, f) -> fprintf fmt "%a.%a" pp_cexpr e pp_qualname f + | Cfield (Cderef e, f) -> fprintf fmt "%a->%a" pp_cexpr e pp_shortname f + | Cfield (e, f) -> fprintf fmt "%a.%a" pp_cexpr e pp_shortname f | Carray (e1, e2) -> fprintf fmt "%a[%a]" pp_cexpr e1 pp_cexpr e2 +and pp_cconst_expr fmt ce = match ce with + | Cstructlit (_, el) -> + fprintf fmt "{@[%a@]}" (pp_list1 pp_cconst_expr ",") el + | Carraylit el -> + fprintf fmt "{@[%a@]}" (pp_list1 pp_cconst_expr ",") el + | _ -> pp_cexpr fmt ce + and pp_clhs fmt clhs = match clhs with | CLvar s -> pp_string fmt s | CLderef lhs' -> fprintf fmt "*%a" pp_clhs lhs' - | CLfield (CLderef lhs, f) -> fprintf fmt "%a->%a" pp_clhs lhs pp_qualname f - | CLfield (lhs, f) -> fprintf fmt "%a.%a" pp_clhs lhs pp_qualname f + | CLfield (CLderef lhs, f) -> fprintf fmt "%a->%a" pp_clhs lhs pp_shortname f + | CLfield (lhs, f) -> fprintf fmt "%a.%a" pp_clhs lhs pp_shortname f | CLarray (lhs, e) -> fprintf fmt "%a[%a]" pp_clhs lhs @@ -281,6 +293,9 @@ let pp_cdecl fmt cdecl = match cdecl with | Cdecl_function (n, retty, args) -> fprintf fmt "@[%a %a(@[%a@]);@ @]@\n" pp_cty retty pp_string n pp_param_list args + | Cdecl_constant (n, cty, ce) -> + fprintf fmt "@[const %a %a = %a;@ @]@\n" + pp_cty cty pp_string n pp_cconst_expr ce let pp_cdef fmt cdef = match cdef with | Cfundef cfd -> diff --git a/compiler/obc/c/cgen.ml b/compiler/obc/c/cgen.ml index c4d71fa..bbe379d 100644 --- a/compiler/obc/c/cgen.ml +++ b/compiler/obc/c/cgen.ml @@ -771,7 +771,7 @@ let cdefs_and_cdecls_of_type_decl otd = cdecl_of_cfundef of_string_fun; cdecl_of_cfundef to_string_fun]) | Type_struct fl -> - let decls = List.map (fun f -> cname_of_qn f.Signature.f_name, + let decls = List.map (fun f -> cname_of_name f.Signature.f_name.name, ctype_of_otype f.Signature.f_type) fl in let decl = Cdecl_struct (name, decls) in ([], [decl])