// $Id$ $use Apply Arithm Box Class Compare List StdIO Table; $func Simplify_Infix t.asail_term = t.asail_term; $func Simplify_Arithm e = e; $func? Simplify_Cmp s.op (expr1) (expr2) = e; $func Simplify e.asail = e.asail; $func Remove_Unreachable e.asail = e.asail; $func Remove_Dupl_Decl (e.decls) (e.subst) e.asail = e.asail; $func Process_Var (e.decls) (e.subst) s.type t.var = e.maybe_decl (e.decls) (e.subst); $func Free_Idx = s.idx; $box Idx; Simplify_ASAIL (MODULE t.ModuleName e.asail) = , (MODULE t.ModuleName >>); Simplify { t.first e.rest, t.first : { ("IF-INT-CMP" s.op (e.arg1) (e.arg2) e.body) = { ) ()> : { (e1) (e2) = ("IF-INT-CMP" s.op (e1) (e2) ); /*empty*/ = ; };; }; (IF t.cond e.body) = (IF t.cond ); (ASSIGN (INT t.var) e.expr) = (ASSIGN (INT t.var) ); (e1) = (); s1 = s1; } :: e.first = e.first ;; }; $box Blocks; $table Breaks; $box Last_Breaks; $func? GetR s.box = t.right_term; GetR s.box = : e1 t2, , t2; Remove_Unreachable { t1 e2, t1 : \{ (FUNC t.name t.in t.out e.body) = , , e.body; ("FUNC?" t.name t.in t.out e.body) = , , e.body; (FOR (e.cont) (e.break) (e.cond) (e.step) e.body) = , e.body; (LABEL (t.label) e.body) = , e.body; (IF t.cond e.body) = , e.body; ("IF-INT-CMP" s.op t.arg1 t.arg2 e.body) = , e.body; (TRY e.body) = , e.body; ("CATCH-ERROR" e.body) = , e.body; } :: e.body = , :: e.body, : { (LABEL (t.label)) = { = (LABEL (t.label) e.body) (e2); { : e (LABEL (t.other_label)), : /*empty*/ = ;; } = /*empty*/ (e.body e2); }; (FOR (e.cont) (e.break) (/*empty-cond*/) (e.step)) = { = (FOR (e.cont) (e.break) (/*empty-cond*/) (e.step) e.body) (e2); (FOR (e.cont) (e.break) (/*empty-cond*/) (e.step) e.body) (); }; (TRY) = { : e (e "Normal-Exit") = (TRY e.body) (e2); e2 : ("CATCH-ERROR" e.catch_body) e3, (TRY e.body) (("CATCH-ERROR" e.catch_body e3)); }; (e.item) = (e.item e.body) (e2); } :: e.t1 (e2), :: t.breaks, { e.t1 : v, t.breaks : (e t.l e), , $fail;; }, e.t1 ; t1 e2, t1 : \{ (BREAK t.label) = : (e.breaks), , { : e (LABEL (t.label)); , t1; }; (CONTINUE t.label) = { : e (FOR (t.label) (e.break) (e.cond) (e.step)); t1; }; RETFAIL = t1; (ERROR e) = t1; FATAL = t1; }; t1 e2 = t1 ; /*empty*/ = { : (e.breaks), ;; }; }; Remove_Dupl_Decl (e.decls) (e.subst) e.items, e.items : { t1 e.rest = { t1 : (DECL s.type t.var) = :: e.d (e.decls) (e.subst), e.d ; t1 : (s.split expr (e.len) t.var1 t.var2), s.split : \{ LSPLIT; RSPLIT; } = :: expr, :: e.decl1 (e.decls) (e.subst), { e.decl1 : (DECL s.type t.new_var) = t.new_var; t.var1; } :: t.var1, :: e.decl2 (e.decls) (e.subst), { e.decl2 : (DECL s.type t.new_var) = t.new_var; t.var2; } :: t.var2, (s.split expr t.var1 t.var2) ; e.subst : e (t1 t.new_var) e = ; t1 : (e2) = () ; t1 ; }; /*empty*/ = /*empty*/; }; Process_Var (e.decls) (e.subst) s.type t.var, { e.decls : $r e (DECL s.type_old t.var) e = { s.type : s.type_old = /*empty*/ (e.decls) (e.subst); t.var : (s.tag e (e.name)), (s.tag 'dd' (e.name )) :: t.new_var, (DECL s.type t.new_var) :: t.decl, t.decl (e.decls t.decl) (e.subst (t.var t.new_var)); }; (DECL s.type t.var) (e.decls (DECL s.type t.var)) (e.subst); }; $func Eval_Mult e = e; $func Eval_Div e = e; $func Eval_Rem e = e; $func Eval_Add e = e; $func Eval__ e = e; Simplify_Infix /*txxx = , txxx :*/ { (INFIX s.op e.args), s.op : { "*" = )>; "/" = )>; "%" = )>; "+" = )>; "-" = )>; s = ; } : { t1 = t1; e1 = (INFIX s.op ); }; (e1) = (); s1 = s1; }; Simplify_Arithm (e.args) = )> : { t1 = t1; e1 = (INFIX "+" ); }; Eval_Mult { 0 e = 0; e 0 = 0; 1 e2 = e2; e1 1 = e1; s1 e2 s3 = e2 ; s1 e2 = e2 s1; e2 = e2; }; Eval_Add { 0 e2 = e2; e1 0 = e1; s1 e2 s3 = e2 ; s1 e2 = e2 s1; e2 = e2; }; Eval_Div { e1 1 = e1; e1 = e1; }; Eval_Rem { e1 1 = 0; e1 = e1; }; Eval__ { e1 0 = e1; e1 = e1; }; $func? Cmp s.fn (expr1) (expr2) = e; Simplify_Cmp s.op (expr1) (expr2) = s.op : { "!=" = &Ne; ">" = ≫ "<" = ≪ } :: s.op, ; Cmp { s.fn (e11 tx e12) (e21 tx e22) = ; s.fn (e1) (e2), , = ) ()>; s.fn (e1) (e2) = (e1) (e2); }; Free_Idx = { : s1 = ; 1; } :: s1, , s1;