diff --git a/expr_grammar_action.g b/expr_grammar_action.g index 5ab84b3a95e6f37fd7b765259728b824fbd26dec..60a5b346c730e1e52747422107298a79f1a451a2 100644 --- a/expr_grammar_action.g +++ b/expr_grammar_action.g @@ -1,6 +1,6 @@ tokens SYM_EOF SYM_IDENTIFIER<string> SYM_INTEGER<int> SYM_PLUS SYM_MINUS SYM_ASTERISK SYM_DIV SYM_MOD tokens SYM_LPARENTHESIS SYM_RPARENTHESIS SYM_LBRACE SYM_RBRACE -tokens SYM_ASSIGN SYM_SEMICOLON SYM_RETURN SYM_IF SYM_WHILE SYM_ELSE SYM_COMMA SYM_PRINT +tokens SYM_ASSIGN SYM_SEMICOLON SYM_RETURN SYM_IF SYM_WHILE SYM_ELSE SYM_COMMA tokens SYM_EQUALITY SYM_NOTEQ SYM_LT SYM_LEQ SYM_GT SYM_GEQ non-terminals S INSTR<tree> INSTRS<tree list> LINSTRS ELSE EXPR FACTOR non-terminals LPARAMS REST_PARAMS @@ -60,7 +60,6 @@ INSTRS -> { [] } INSTR -> SYM_IF SYM_LPARENTHESIS EXPR SYM_RPARENTHESIS SYM_LBRACE LINSTRS SYM_RBRACE ELSE { Node(Tif, [$3; $6; $8]) } INSTR -> SYM_WHILE SYM_LPARENTHESIS EXPR SYM_RPARENTHESIS INSTR { Node(Twhile, [$3; $5]) } INSTR -> SYM_RETURN EXPR SYM_SEMICOLON { Node(Treturn, [$2]) } -INSTR -> SYM_PRINT SYM_LPARENTHESIS EXPR SYM_RPARENTHESIS SYM_SEMICOLON { Node(Tprint, [$3]) } INSTR -> IDENTIFIER AFTER_IDENTIFIER_INSTR SYM_SEMICOLON { match $2 with | Assign exp -> Node(Tassign, [$1; exp]) diff --git a/src/ast.ml b/src/ast.ml index cfb67d68813386c3ef6d396f5c9edec01f3753bc..7560fa685835d10dadbf5fdafbd046d46869061c 100644 --- a/src/ast.ml +++ b/src/ast.ml @@ -22,7 +22,7 @@ open Batteries *) -type tag = Tassign | Tif | Twhile | Tblock | Treturn | Tprint +type tag = Tassign | Tif | Twhile | Tblock | Treturn | Tint | Tadd | Tmul | Tdiv | Tmod | Txor | Tsub | Tclt | Tcgt | Tcle | Tcge | Tceq | Tne @@ -51,7 +51,6 @@ let string_of_tag = function | Twhile -> "Twhile" | Tblock -> "Tblock" | Treturn -> "Treturn" - | Tprint -> "Tprint" | Tint -> "Tint" | Tadd -> "Tadd" | Tmul -> "Tmul" diff --git a/src/cfg.ml b/src/cfg.ml index 2a60c97dde93858dca8cb0acd4d788686e407ad4..467b19b8effc117ec88e216c87a5774c28d6eff2 100644 --- a/src/cfg.ml +++ b/src/cfg.ml @@ -13,7 +13,6 @@ type expr = type cfg_node = | Cassign of string * expr * int | Creturn of expr - | Cprint of expr * int | Ccmp of expr * int * int | Cnop of int | Ccall of string * expr list * int @@ -32,7 +31,6 @@ type cprog = cfg_fun prog let succs cfg n = match Hashtbl.find_option cfg n with | None -> Set.empty - | Some (Cprint (_, s)) | Some (Cassign (_, _, s)) -> Set.singleton s | Some (Creturn _) -> Set.empty | Some (Ccmp (_, s1, s2)) -> Set.of_list [s1;s2] @@ -45,7 +43,6 @@ let preds cfgfunbody n = Hashtbl.fold (fun m m' acc -> match m' with | Cassign (_, _, s) - | Cprint (_, s) | Cnop s | Ccall (_, _, s) -> if s = n then Set.add m acc else acc | Creturn _ -> acc @@ -71,7 +68,6 @@ let size_instr (i: cfg_node) : int = match (i : cfg_node) with | Cassign (_, e, _) -> 1 + size_expr e | Creturn e -> 1 + (size_expr e) - | Cprint (e, _) -> 1 + (size_expr e) | Ccmp (e, _, _) -> 1 + size_expr e | Cnop _ -> 1 | Ccall (_, args, _) -> 1 + List.fold_left (fun acc arg -> acc + size_expr arg) 0 args diff --git a/src/cfg_gen.ml b/src/cfg_gen.ml index ff2aa1b40a58fd120993c33ea76d81ad62566d50..f009b7baa4fbec07ee8334469e65bccd2e2ea279 100644 --- a/src/cfg_gen.ml +++ b/src/cfg_gen.ml @@ -69,10 +69,6 @@ let rec cfg_node_of_einstr (next: int) (cfg : (int, cfg_node) Hashtbl.t) | Elang.Ireturn e -> cfg_expr_of_eexpr e >>= fun e -> Hashtbl.replace cfg next (Creturn e); OK (next, next + 1) - | Elang.Iprint e -> - cfg_expr_of_eexpr e >>= fun e -> - Hashtbl.replace cfg next (Cprint (e,succ)); - OK (next, next + 1) | Elang.Icall (f, args) -> list_map_res cfg_expr_of_eexpr args >>= fun es -> Hashtbl.replace cfg next (Ccall (f, es, succ)); @@ -89,7 +85,6 @@ let rec reachable_nodes n (cfg: (int,cfg_node) Hashtbl.t) = match Hashtbl.find_option cfg n with | None -> reach | Some (Cnop succ) - | Some (Cprint (_, succ)) | Some (Cassign (_, _, succ)) -> reachable_aux succ reach | Some (Creturn _) -> reach | Some (Ccmp (_, s1, s2)) -> diff --git a/src/cfg_liveness.ml b/src/cfg_liveness.ml index aa402063e865558f9d0cbc79c32717de5f4e4789..0ecbbc34d329f097c1b884d5756f840c583a1354 100644 --- a/src/cfg_liveness.ml +++ b/src/cfg_liveness.ml @@ -32,7 +32,6 @@ let live_cfg_node (node: cfg_node) (live_after: string Set.t) = match node with | Cassign (s, e, i) -> vars_in_expr e | Creturn e -> vars_in_expr e - | Cprint (e, i) -> vars_in_expr e | Ccmp (e, i1, i2) -> vars_in_expr e | Cnop (i) -> Set.empty | Ccall (f, args, i) -> vars_in_expr (Ecall (f, args)) diff --git a/src/cfg_nop_elim.ml b/src/cfg_nop_elim.ml index dba2b517d3bd5a6eae86084e13ba3f83bfa0f2e2..4592c82806b38f96203a40847e384d208bf65f5c 100644 --- a/src/cfg_nop_elim.ml +++ b/src/cfg_nop_elim.ml @@ -64,7 +64,6 @@ let replace_succs nop_succs (n: cfg_node) = (* TODO *) match n with | Cassign (s, e, i) -> Cassign (s, e, replace_succ nop_succs i) - | Cprint (e, i) -> Cprint (e, replace_succ nop_succs i) | Ccmp (e, i1, i2) -> Ccmp (e, replace_succ nop_succs i1, replace_succ nop_succs i2) | Cnop i -> Cnop (replace_succ nop_succs i) | Creturn e -> Creturn e diff --git a/src/cfg_print.ml b/src/cfg_print.ml index a4524107bb648e3821eb41279a3878c7d92e1212..d7bc9888ff0be42ae9d5f7b20a1aac3f517ad116 100644 --- a/src/cfg_print.ml +++ b/src/cfg_print.ml @@ -17,7 +17,6 @@ let dump_list_cfgexpr l = let dump_arrows oc fname n (node: cfg_node) = match node with | Cassign (_, _, succ) - | Cprint (_, succ) | Cnop succ | Ccall (_, _, succ) -> Format.fprintf oc "n_%s_%d -> n_%s_%d\n" fname n fname succ @@ -30,7 +29,6 @@ let dump_arrows oc fname n (node: cfg_node) = let dump_cfg_node oc (node: cfg_node) = match node with | Cassign (v, e, _) -> Format.fprintf oc "%s = %s" v (dump_cfgexpr e) - | Cprint (e, _) -> Format.fprintf oc "print %s" (dump_cfgexpr e) | Creturn e -> Format.fprintf oc "return %s" (dump_cfgexpr e) | Ccmp (e, _, _) -> Format.fprintf oc "%s" (dump_cfgexpr e) | Cnop _ -> Format.fprintf oc "nop" diff --git a/src/cfg_run.ml b/src/cfg_run.ml index e2e421204f922d190bce803195f29afe19b47f36..a705b9638cf4d4afd9bc763e31b79e0ac8f1cf82 100644 --- a/src/cfg_run.ml +++ b/src/cfg_run.ml @@ -34,12 +34,18 @@ let rec eval_cfgexpr oc st cp (e: expr) : (int * int state) res = | Error msg -> Error msg | OK (i, st'') -> OK ((l@[i]), st'') ) (OK([], st)) args >>= fun (int_args, st') -> - find_function cp f >>= fun found_f -> - match eval_cfgfun oc st' cp f found_f int_args with - | Error msg -> Error msg - | OK (None, st'') -> Error (Format.sprintf "CFG: Function %s doesn't have a return value.\n" f) - | OK (Some ret, st'') -> OK (ret, st'') - + match find_function cp f with + | OK found_f -> + (match eval_cfgfun oc st' cp f found_f int_args with + | Error msg -> Error msg + | OK (None, st'') -> Error (Format.sprintf "CFG: Function %s doesn't have a return value.\n" f) + | OK (Some ret, st'') -> OK (ret, st'')) + | Error msg -> + (match do_builtin oc st.mem f int_args with + | Error msg -> Error msg + | OK None -> Error (Format.sprintf "CFG: Function %s doesn't have a return value.\n" f) + | OK (Some ret) -> OK (ret, st')) + and eval_cfginstr oc st cp ht (n: int): (int * int state) res = match Hashtbl.find_option ht n with | None -> Error (Printf.sprintf "Invalid node identifier\n") @@ -57,10 +63,6 @@ and eval_cfginstr oc st cp ht (n: int): (int * int state) res = | Creturn(e) -> eval_cfgexpr oc st cp e >>= fun (e, st') -> OK (e, st') - | Cprint(e, succ) -> - eval_cfgexpr oc st cp e >>= fun (e, st') -> - Format.fprintf oc "%d\n" e; - eval_cfginstr oc st' cp ht succ | Ccall (f, args, succ) -> List.fold_left ( fun (acc : (int list * int state) res) (arg : expr) -> @@ -72,9 +74,16 @@ and eval_cfginstr oc st cp ht (n: int): (int * int state) res = | OK (i, st'') -> OK ((l@[i]), st'') ) (OK([], st)) args >>= fun (int_args, st') -> - find_function cp f >>= fun found_f -> - eval_cfgfun oc st' cp f found_f int_args >>= fun (ret, st'') -> - eval_cfginstr oc st'' cp ht succ + match find_function cp f with + | OK found_f -> + (match eval_cfgfun oc st' cp f found_f int_args with + | Error msg -> Error msg + | OK (_, st'') -> eval_cfginstr oc st'' cp ht succ) + | Error msg -> + (match do_builtin oc st'.mem f int_args with + | OK _ -> eval_cfginstr oc st' cp ht succ + | Error msg -> Error msg ) + and eval_cfgfun oc st cp cfgfunname { cfgfunargs; cfgfunbody; diff --git a/src/e_regexp.ml b/src/e_regexp.ml index a87413d6fb052bca56730881cba0e5c388752812..e909133d0eed77cdfb9933719dd0ad7c48f32cd7 100644 --- a/src/e_regexp.ml +++ b/src/e_regexp.ml @@ -74,7 +74,6 @@ let list_regexp : (regexp * (string -> token option)) list = (keyword_regexp "if", fun _ -> Some (SYM_IF)); (keyword_regexp "else", fun _ -> Some (SYM_ELSE)); (keyword_regexp "return", fun _ -> Some (SYM_RETURN)); - (keyword_regexp "print", fun _ -> Some (SYM_PRINT)); (keyword_regexp "struct", fun _ -> Some (SYM_STRUCT)); (char_regexp '.', fun _ -> Some (SYM_POINT)); (char_regexp '+', fun _ -> Some (SYM_PLUS)); diff --git a/src/elang.ml b/src/elang.ml index 38b4f66064e4cedae6f4f8478ce1cae41b379c9a..03d287f62c07973da8aa33f72e70b81c18865c5f 100644 --- a/src/elang.ml +++ b/src/elang.ml @@ -17,7 +17,6 @@ type instr = | Iwhile of expr * instr | Iblock of instr list | Ireturn of expr - | Iprint of expr | Icall of string * expr list type efun = { diff --git a/src/elang_gen.ml b/src/elang_gen.ml index 1d4db2d1429c325bdedeeedad12cb9ea8b081995..54e92035f2002c236095886d338e539f505993aa 100644 --- a/src/elang_gen.ml +++ b/src/elang_gen.ml @@ -108,11 +108,6 @@ let rec make_einstr_of_ast (a: tree) : instr res = in match res_of_e with | OK exp -> OK (Ireturn exp) | Error msg -> Error msg) - | Node(Tprint, [e]) -> - (let res_of_e = make_eexpr_of_ast e - in match res_of_e with - | OK exp -> OK (Iprint exp) - | Error msg -> Error msg) | Node(Tcall, [StringLeaf f; Node(Targs, args)]) -> (let res = list_map_res make_eexpr_of_ast args in match res with diff --git a/src/elang_print.ml b/src/elang_print.ml index 8f7f8cf490c74b16488a4730058296cb8c9cd402..8e4d55d111be23ddb39cf66fccb0453657262e4a 100644 --- a/src/elang_print.ml +++ b/src/elang_print.ml @@ -56,9 +56,6 @@ let rec dump_einstr_rec indent oc i = | Ireturn(e) -> print_spaces oc indent; Format.fprintf oc "return %s;\n" (dump_eexpr e) - | Iprint(e) -> - print_spaces oc indent; - Format.fprintf oc "print %s;\n" (dump_eexpr e) | Icall(f, args) -> print_spaces oc indent; Format.fprintf oc "%s(%s);\n" f (String.concat ", " (List.map dump_eexpr args)) diff --git a/src/elang_run.ml b/src/elang_run.ml index 880e93885acae46e84b0c19c54227c195cc7bd4d..4a5bd71713a29230da9cb83f3d4d77635354265e 100644 --- a/src/elang_run.ml +++ b/src/elang_run.ml @@ -2,6 +2,7 @@ open Elang open Batteries open Prog open Utils +open Builtins let binop_bool_to_int f x y = if f x y then 1 else 0 @@ -65,13 +66,16 @@ let rec eval_eexpr oc st (ep: eprog) (e : expr) : (int * int state) res = | Error msg -> Error msg | OK (int_args, st') -> match find_function ep f with - | Error msg -> Error msg | OK found_f -> - match eval_efun oc st' ep found_f f int_args with + (match eval_efun oc st' ep found_f f int_args with | Error msg -> Error msg | OK (None, st'') -> Error (Format.sprintf "E: Function %s doesn't have a return value.\n" f) - | OK (Some ret, st'') -> OK (ret, st'') - + | OK (Some ret, st'') -> OK (ret, st'')) + | Error msg -> + (match do_builtin oc st'.mem f int_args with + | Error msg -> Error msg + | OK None -> Error (Format.sprintf "E: Function %s doesn't have a return value.\n" f) + | OK (Some ret) -> OK (ret, st')) (* [eval_einstr oc st ins] évalue l'instrution [ins] en partant de l'état [st]. @@ -125,12 +129,6 @@ and eval_einstr oc (st: int state) (ep: eprog) (ins: instr) : (match eval_eexpr oc st ep e with | Error msg -> Error msg | OK (v, st') -> OK(Some v, st')) - | Iprint e -> - (match eval_eexpr oc st ep e with - | Error msg -> Error msg - | OK (v, st') -> - Format.fprintf oc "%d\n" v; - OK(None, st')) | Icall (f, args) -> let (res : (int list * int state) res) = List.fold_left ( fun (acc : (int list * int state) res) (arg : expr) -> @@ -145,11 +143,14 @@ and eval_einstr oc (st: int state) (ep: eprog) (ins: instr) : | Error msg -> Error msg | OK (int_args, st') -> match find_function ep f with - | Error msg -> Error msg | OK found_f -> - match eval_efun oc st' ep found_f f int_args with + (match eval_efun oc st' ep found_f f int_args with | Error msg -> Error msg - | OK (_, st'') -> OK (None, st'') + | OK (_, st'') -> OK (None, st'')) + | Error msg -> + (match do_builtin oc st'.mem f int_args with + | OK _ -> OK (None, st') + | Error msg -> Error msg ) (* [eval_efun oc st f fname vargs] évalue la fonction [f] (dont le nom est [fname]) en partant de l'état [st], avec les arguments [vargs]. diff --git a/src/lexer.mll b/src/lexer.mll index 9aa999daef2ff056c38dcc9864da6727fc7baec6..f4ac582138f38bd094a29a549a36328836de3d37 100644 --- a/src/lexer.mll +++ b/src/lexer.mll @@ -30,7 +30,6 @@ rule token = parse | "void" { SYM_VOID } | "char" { SYM_CHAR } | "int" { SYM_INT } - | "print" { SYM_PRINT } | "struct" { SYM_STRUCT } | "if" { SYM_IF } | "else" { SYM_ELSE } diff --git a/src/linear_liveness.ml b/src/linear_liveness.ml index 5082e7fe9b9cf1460e1b2cf92889f7c7297d94f5..d8fe1aace6b30f06a261d51cdacf2fa0e884c5cf 100644 --- a/src/linear_liveness.ml +++ b/src/linear_liveness.ml @@ -8,7 +8,6 @@ open Rtl let gen_live (i: rtl_instr) = match i with | Rbinop (b, rd, rs1, rs2) -> Set.of_list [rs1; rs2] - | Rprint rs | Runop (_, _, rs) -> Set.singleton rs | Rconst (_, _) -> Set.empty | Rbranch (_, rs1, rs2, _) -> Set.of_list [rs1; rs2] @@ -26,7 +25,6 @@ let kill_live (i: rtl_instr) = | Rmov (rd,_) | Rcall (Some rd, _, _) -> Set.singleton rd | Rbranch (_, _, _, _) - | Rprint _ | Rret _ | Rjmp _ | Rlabel _ diff --git a/src/linear_run.ml b/src/linear_run.ml index 80517908cb8721c7501ca4e4d8056b7b89d87251..95514555c56c05ae34f75ab5142a2d3c1318af22 100644 --- a/src/linear_run.ml +++ b/src/linear_run.ml @@ -47,13 +47,6 @@ let rec exec_linear_instr oc lp fname f st (i: rtl_instr) = OK (None, st) | _ -> Error (Printf.sprintf "Mov on undefined register (%s)" (print_reg rs)) end - | Rprint r -> - begin match Hashtbl.find_option st.regs r with - | Some s -> - Format.fprintf oc "%d\n" s; - OK (None, st) - | _ -> Error (Printf.sprintf "Print on undefined register (%s)" (print_reg r)) - end | Rret r -> begin match Hashtbl.find_option st.regs r with | Some s -> OK (Some s, st) @@ -71,12 +64,20 @@ let rec exec_linear_instr oc lp fname f st (i: rtl_instr) = | Some v -> Some (vs@[v]))) (Some []) args in match vs_opt with - | Some params -> find_function lp g >>= fun found_g -> - (match rd_opt, exec_linear_fun oc lp st g found_g params with - | _, Error msg -> Error msg - | Some rd, OK (Some ret, st') -> exec_linear_instr oc lp fname f st' (Rconst (rd, ret)) - | Some rd, OK (None, st') -> Error (Printf.sprintf "Function %s doesn't have a return value" g) - | None, OK (_, st') -> OK(None, st')) + | Some params -> + (match find_function lp g with + | OK found_g -> + (match rd_opt, exec_linear_fun oc lp st g found_g params with + | _, Error msg -> Error msg + | Some rd, OK (Some ret, st') -> exec_linear_instr oc lp fname f st' (Rconst (rd, ret)) + | Some rd, OK (None, st') -> Error (Printf.sprintf "Function %s doesn't have a return value" g) + | None, OK (_, st') -> OK(None, st')) + | Error msg -> + (match rd_opt, do_builtin oc st.mem g params with + | _, Error msg -> Error msg + | Some rd, OK None -> Error (Format.sprintf "RTL: Function %s doesn't have a return value.\n" g) + | Some rd, OK (Some ret) -> exec_linear_instr oc lp fname f st (Rconst (rd, ret)) + | None, OK _ -> OK(None, st))) | _ -> Error (Printf.sprintf "Function %s applied on undefined register" g) end diff --git a/src/ltl_gen.ml b/src/ltl_gen.ml index 581f0c9b64f3710f3048ed905e62f31a5a1a1e9a..dbe0e577d949ac6127c82ee550b0d37a945edead 100644 --- a/src/ltl_gen.ml +++ b/src/ltl_gen.ml @@ -217,7 +217,6 @@ let written_rtl_regs_instr (i: rtl_instr) = | Rconst (rd, _) | Rmov (rd, _) | Rcall (Some rd, _, _)-> Set.singleton rd - | Rprint _ | Rret _ | Rlabel _ | Rbranch (_, _, _, _) @@ -228,7 +227,6 @@ let read_rtl_regs_instr (i: rtl_instr) = match i with | Rbinop (_, _, rs1, rs2) | Rbranch (_, rs1, rs2, _) -> Set.of_list [rs1; rs2] - | Rprint rs | Runop (_, _, rs) | Rmov (_, rs) | Rret rs -> Set.singleton rs @@ -302,24 +300,6 @@ let ltl_instrs_of_linear_instr fname live_out allocation load_loc reg_tmp1 allocation rs >>= fun (ls, rs) -> store_loc reg_tmp1 allocation rd >>= fun (ld, rd) -> OK (ls @ LMov(rd, rs) :: ld) - | Rprint r -> - let (save_a_regs, arg_saved, ofs) = - save_caller_save - (range 32) - (- (numspilled+1)) in - let parameter_passing = - match Hashtbl.find_option allocation r with - | None -> Error (Format.sprintf "Could not find allocation for register %d\n" r) - | Some (Reg rs) -> OK [LMov(reg_a0, rs)] - | Some (Stk o) -> OK [LLoad(reg_a0, reg_fp, (Archi.wordsize ()) * o, (archi_mas ()))] - in - parameter_passing >>= fun parameter_passing -> - OK (LComment "Saving a0-a7,t0-t6" :: save_a_regs @ - LAddi(reg_sp, reg_s0, (Archi.wordsize ()) * (ofs + 1)) :: - parameter_passing @ - LCall "print" :: - LComment "Restoring a0-a7,t0-t6" :: restore_caller_save arg_saved) - | Rret r -> load_loc reg_tmp1 allocation r >>= fun (l,r) -> OK (l @ [LMov (reg_ret, r) ; LJmp epilogue_label]) diff --git a/src/parser.ml b/src/parser.ml index 2e2c5f02499871c8a8fb311480a970dcbca55089..44e6a89a2ea7ddd961f9909aff536449b65c9192 100644 --- a/src/parser.ml +++ b/src/parser.ml @@ -53,7 +53,6 @@ let to_yacc_token = function | SYM_LBRACKET -> Yaccparser.SYM_LBRACKET | SYM_RBRACKET -> Yaccparser.SYM_RBRACKET | SYM_ALLOC -> Yaccparser.SYM_ALLOC -| SYM_PRINT -> Yaccparser.SYM_PRINT | SYM_EXTERN -> Yaccparser.SYM_EXTERN | SYM_INCLUDE(s) -> Yaccparser.SYM_INCLUDE s | SYM_AMPERSAND -> Yaccparser.SYM_AMPERSAND diff --git a/src/rtl.ml b/src/rtl.ml index 0360732db82bb6f335507b3ad392dba7e3ff7326..18d5f7d5a54cfaf976f19f1561f37f941f7659da 100644 --- a/src/rtl.ml +++ b/src/rtl.ml @@ -14,7 +14,6 @@ type rtl_instr = Rbinop of binop * reg * reg * reg | Rmov of reg * reg | Rret of reg | Rlabel of int - | Rprint of reg | Rcall of reg option * string * reg list type rtl_fun = { rtlfunargs: reg list; @@ -29,7 +28,6 @@ let written_rtl_regs_instr (i: rtl_instr) = | Runop (_, rd, _) | Rconst (rd, _) | Rmov (rd, _) -> Set.singleton rd - | Rprint _ | Rret _ | Rlabel _ | Rbranch (_, _, _, _) diff --git a/src/rtl_gen.ml b/src/rtl_gen.ml index e49d304f4b9e73e7859a18212522e75e1a542809..0dde9d9909f83c0191a1bd748aeacc5b1275eed9 100644 --- a/src/rtl_gen.ml +++ b/src/rtl_gen.ml @@ -90,9 +90,6 @@ let rtl_instrs_of_cfg_node ((next_reg:int), (var2reg: (string*int) list)) (c: cf | Creturn e -> let r_e, l, next_reg', var2reg' = rtl_instrs_of_cfg_expr (next_reg, var2reg) e in (l@[Rret r_e], next_reg', var2reg') - | Cprint (e, i) -> - let r_e, l, next_reg', var2reg' = rtl_instrs_of_cfg_expr (next_reg, var2reg) e - in (l@[Rprint r_e; Rjmp i], next_reg', var2reg') | Ccmp (e, i1, i2) -> let cmp, e1, e2 = rtl_cmp_of_cfg_expr e in let r1, l1, next_reg1, var2reg1 = rtl_instrs_of_cfg_expr (next_reg, var2reg) e1 diff --git a/src/rtl_print.ml b/src/rtl_print.ml index a9c1224e8920af8ab16733a816846d794f1f02dc..a2837a7cb90c5201b72a81dcb0aeb9452a17e7ae 100644 --- a/src/rtl_print.ml +++ b/src/rtl_print.ml @@ -39,7 +39,6 @@ let dump_rtl_instr name (live_in, live_out) ?(endl="\n") oc (i: rtl_instr) = Format.fprintf oc "jmp %s" (print_node s) | Rmov (rd, rs) -> Format.fprintf oc "%s <- %s" (print_reg rd) (print_reg rs) | Rret r -> Format.fprintf oc "ret %s" (print_reg r) - | Rprint r -> Format.fprintf oc "print %s" (print_reg r) | Rlabel n -> Format.fprintf oc "%s_%d:" name n | Rcall (rd_opt, f, regs) -> match rd_opt with diff --git a/src/rtl_run.ml b/src/rtl_run.ml index fb7a809f37c47f6bbaaa824117bffa843e4826d8..8a1fa9872ceea80eeb2a9878509c1a36683a5b8e 100644 --- a/src/rtl_run.ml +++ b/src/rtl_run.ml @@ -69,13 +69,6 @@ let rec exec_rtl_instr oc rp rtlfunname f st (i: rtl_instr) = | Some s -> OK (Some s, st) | _ -> Error (Printf.sprintf "Ret on undefined register (%s)" (print_reg r)) end - | Rprint r -> - begin match Hashtbl.find_option st.regs r with - | Some s -> - Format.fprintf oc "%d\n" s; - OK (None, st) - | _ -> Error (Printf.sprintf "Print on undefined register (%s)" (print_reg r)) - end | Rlabel n -> OK (None, st) | Rcall (rd_opt, g, args) -> begin @@ -88,13 +81,22 @@ let rec exec_rtl_instr oc rp rtlfunname f st (i: rtl_instr) = | Some v -> Some (vs@[v]))) (Some []) args in match vs_opt with - | Some params -> find_function rp g >>= fun found_g -> - (match rd_opt, exec_rtl_fun oc rp st g found_g params with - | _, Error msg -> Error msg - | Some rd, OK (Some ret, st') -> exec_rtl_instr oc rp rtlfunname f st' (Rconst (rd, ret)) - | Some rd, OK (None, st') -> Error (Printf.sprintf "Function %s doesn't have a return value" g) - | None, OK (_, st') -> OK(None, st')) + | Some params -> + (match find_function rp g with + | OK found_g -> + (match rd_opt, exec_rtl_fun oc rp st g found_g params with + | _, Error msg -> Error msg + | Some rd, OK (Some ret, st') -> exec_rtl_instr oc rp rtlfunname f st' (Rconst (rd, ret)) + | Some rd, OK (None, st') -> Error (Printf.sprintf "Function %s doesn't have a return value" g) + | None, OK (_, st') -> OK(None, st')) + | Error msg -> + (match rd_opt, do_builtin oc st.mem g params with + | _, Error msg -> Error msg + | Some rd, OK None -> Error (Format.sprintf "RTL: Function %s doesn't have a return value.\n" g) + | Some rd, OK (Some ret) -> exec_rtl_instr oc rp rtlfunname f st (Rconst (rd, ret)) + | None, OK _ -> OK(None, st))) | _ -> Error (Printf.sprintf "Function %s applied on undefined register" g) + end and exec_rtl_instr_at oc rp rtlfunname ({ rtlfunbody; } as f: rtl_fun) st i = diff --git a/src/symbols.ml b/src/symbols.ml index 71760ef8380d4e4fefc2f934565fab43c68fe9b4..ce80f8172a090f9653f95ba71b3e73879919e612 100644 --- a/src/symbols.ml +++ b/src/symbols.ml @@ -50,7 +50,6 @@ type token = | SYM_LBRACKET | SYM_RBRACKET | SYM_ALLOC - | SYM_PRINT | SYM_EXTERN | SYM_INCLUDE of string | SYM_AMPERSAND @@ -99,7 +98,6 @@ let string_of_symbol = function | SYM_LBRACKET -> "SYM_LBRACKET" | SYM_RBRACKET -> "SYM_RBRACKET" | SYM_ALLOC -> "SYM_ALLOC" -| SYM_PRINT -> "SYM_PRINT" | SYM_EXTERN -> "SYM_EXTERN" | SYM_INCLUDE(s) -> Printf.sprintf "SYM_INCLUDE(%s)" s | SYM_AMPERSAND -> "SYM_AMPERSAND" diff --git a/src/yaccparser.mly b/src/yaccparser.mly index 3c9a390a95b44e92e4168327630e1d43af1873a3..f33548304ee38a08febd46d65de15df788cf2bd4 100644 --- a/src/yaccparser.mly +++ b/src/yaccparser.mly @@ -14,7 +14,7 @@ %token<int> SYM_INTEGER %token SYM_PLUS SYM_MINUS SYM_ASTERISK SYM_DIV SYM_MOD %token SYM_LPARENTHESIS SYM_RPARENTHESIS SYM_LBRACE SYM_RBRACE -%token SYM_ASSIGN SYM_SEMICOLON SYM_RETURN SYM_IF SYM_WHILE SYM_ELSE SYM_COMMA SYM_PRINT +%token SYM_ASSIGN SYM_SEMICOLON SYM_RETURN SYM_IF SYM_WHILE SYM_ELSE SYM_COMMA %token SYM_EQUALITY SYM_NOTEQ SYM_LT SYM_LEQ SYM_GT SYM_GEQ %left SYM_EQUALITY SYM_NOTEQ @@ -68,7 +68,6 @@ | SYM_IF SYM_LPARENTHESIS expr SYM_RPARENTHESIS linstrs ntelse { Node (Tif, [$3; $5; $6]) } | SYM_WHILE SYM_LPARENTHESIS expr SYM_RPARENTHESIS instr { Node( Twhile, [$3; $5]) } | SYM_RETURN expr SYM_SEMICOLON { Node(Treturn, [$2]) } - | SYM_PRINT expr SYM_SEMICOLON { Node(Tprint, [$2]) } | linstrs { $1 }; ntelse : SYM_ELSE linstrs { $2 } diff --git a/tests/funcall/argswap.e.expect_lexer b/tests/funcall/argswap.e.expect_lexer index 89b98c324fdb2b227f987c44d6cd1bba0c75859d..2c8a87dc1d273f5d6156be905b62504276797c7b 100644 --- a/tests/funcall/argswap.e.expect_lexer +++ b/tests/funcall/argswap.e.expect_lexer @@ -5,12 +5,12 @@ SYM_COMMA SYM_IDENTIFIER(b) SYM_RPARENTHESIS SYM_LBRACE -SYM_PRINT +SYM_IDENTIFIER(print) SYM_LPARENTHESIS SYM_IDENTIFIER(a) SYM_RPARENTHESIS SYM_SEMICOLON -SYM_PRINT +SYM_IDENTIFIER(print) SYM_LPARENTHESIS SYM_IDENTIFIER(b) SYM_RPARENTHESIS @@ -30,12 +30,12 @@ SYM_COMMA SYM_IDENTIFIER(b) SYM_RPARENTHESIS SYM_LBRACE -SYM_PRINT +SYM_IDENTIFIER(print) SYM_LPARENTHESIS SYM_IDENTIFIER(a) SYM_RPARENTHESIS SYM_SEMICOLON -SYM_PRINT +SYM_IDENTIFIER(print) SYM_LPARENTHESIS SYM_IDENTIFIER(b) SYM_RPARENTHESIS diff --git a/tests/funcall/print_and_fun.e.expect_lexer b/tests/funcall/print_and_fun.e.expect_lexer index d8e49347bfd160352797416d6be13177edbc3ee4..834218f66d791aed054dec525bb4e0e33596260b 100644 --- a/tests/funcall/print_and_fun.e.expect_lexer +++ b/tests/funcall/print_and_fun.e.expect_lexer @@ -21,12 +21,12 @@ SYM_LPARENTHESIS SYM_INTEGER(8) SYM_RPARENTHESIS SYM_SEMICOLON -SYM_PRINT +SYM_IDENTIFIER(print) SYM_LPARENTHESIS SYM_IDENTIFIER(a) SYM_RPARENTHESIS SYM_SEMICOLON -SYM_PRINT +SYM_IDENTIFIER(print) SYM_LPARENTHESIS SYM_IDENTIFIER(b) SYM_RPARENTHESIS