// $Id$ $use Access Apply Arithm Box Class Compare Convert JavaMangle List StdIO Table; $use "rfpc"; $use "rfp_helper"; $box Int; $box Module_Name; $box Entry; $box Entry_Name; $box Current_Namespace; $box Func_Name; $box Ress; $table Result; $box Res_Assigns; $table Iter_Vars; $func ASAIL_To_Java e.body = e.java_code; $func Expr_Ref_To_Java e.ASAIL_Expr_Ref = e.aux_arrays (e.JAVA_Expr_Ref); $func Expr_Int_To_Java s.acc e.ASAIL_Expr_Int = e.JAVA_Expr_Int; $func Step_To_Java e.step_operators = e.java_step_operators; $func Const_Expr_To_Java e.ASAIL_const_expr = e.aux_arrays (e.JAVA_const_expr); $func Expr_Args_To_Java e.args = e.aux_arrays (e.java_args); $func Int_Args_To_Java s.acc e.args = e.java_args; $func Var_Args_To_Java e.args = e.java_args; $func Symbol_To_Java s.RFP_Symbol = e.JAVA_String; $func Name_To_Java t.name = e.JAVA_Name; $func Var_To_Java t.var = e.java_var; $func Cond_To_Java s.acc t.cond = e.JAVA_Cond; $func Infix_To_Java s.acc s.func_for_converting_args_to_java s.op e.args = e.java_expr; $func Access_Mode s.linkage = e.java_access_mode; $box Free_Idx; $func Free_Index = e.free_index; $func Declare_Results (e.ress) e.acc_java_ress = e.decls (e.java_ress); $func GetJavaName e.name = e.javaName; GetJavaName e.name = )>)>>; $func GetJavaModuleName e.moduleName = e.javaModuleName; GetJavaModuleName e.moduleName = { e.moduleName : "refal" "plus" e.tail = "org" "refal" "plus" "library" e.tail; e.moduleName; } :: e.moduleName, { = e.moduleName; ; }; RFP_ASAIL_To_Java (MODULE (e.moduleName) e.asail) = , , { >; ; }, , { >; ; }, , > :: s.refal_mod_name, , :: e.javaModuleName, { : v.java, e.javaModuleName : e.package s.class, { e.package : v = ('package '';');; } :: e.package, { : v.name = () ('public static void main (java.lang.String[] args) {' ( ('RefalRuntime.setArgs ("'s.refal_mod_name'", args);') ('try {' (v.name' (new Result ());') '}') ('catch (RefalException e) {' ( ('java.lang.System.out.println ("$error: " + e);') ('java.lang.System.exit (100);') )'}') )'}');; } :: e.entry, e.package ('import org.refal.plus.*;')('public class 's.class' {' (v.java e.entry) '}');; } :: e.java, (e.javaModuleName) (e.java); ASAIL_To_Java e.asail, { e.asail : t.item e.rest, t.item : { (s.tag IMPORT e) = /*empty*/; (s.tag s.linkage t.name (e.args) (e.ress) e.body), s.tag : \{ FUNC = ('void') /*empty*/; "FUNC?" = ('boolean') ('return true;'); } :: (e.return_type) e.return = , , { : e t.name e = >;; }, >, () ('static '' 'e.return_type' ' ' ('') throws RefalException') ('{' ( e.return) '}'); (TRACE t.name) = ; ("IF-INT-CMP" s.op (e.arg1) (e.arg2) e.body) = :: s.acc, ' 's.op' ' :: e.cond, ('if (' e.cond ')') ('{' () '}'); (IF t.cond e.body) = :: s.acc, :: e.j_cond, { t.cond : ("CALL-FAILS" e) = () ( ); ( ) (); } :: (e.if_yes_assigns) (e.if_not_assigns), ('if ('e.j_cond')') ('{' ( e.if_yes_assigns )'}' ) e.if_not_assigns; (FOR (e.cont_label) (e.break_label) () (e.step) e.body) = { e.cont_label : t = ': ';; } :: e.cont, { e.break_label : t = ': ';; } :: e.break, { e.step : (s.d e.var), s.d : \{ "INC-ITER"; "DEC-ITER"; } = : e.new_var t.var1 t.var2, ('Expr '' = 'e.new_var'.getLeft();') ('Expr '' = 'e.new_var'.getRight();');; } :: e.split_vars, (e.break e.cont 'for ( ; ; '')') ('{' ( e.split_vars ) '}'); (LABEL (e.label) e.body) = (': {' () '}'); (TRY e.body) = ('try') ('{' ( ('if (false)' ('throw new RefalException ("''", "''", ' '"This is for avoiding \'Unreachable code\' errors");' ) ) ) '}'); ("CATCH-ERROR" e.body) = ('catch (RefalException error) {' ( ('Expr err = error.getExpr ();') () ) '}'); RETFAIL = ('return false;'); FATAL = ('throw new RefalException ("''", "''", "Unexpected fail");'); (LSPLIT t.name (e.min) t.var1 t.var2) = :: e.a (e.n), '_va_' :: e.new_var, , :: s.acc, :: e.min, e.a ('Expr.SplitIterator 'e.new_var' = 'e.n'.leftSplit('e.min');'); (RSPLIT t.name (e.min) t.var1 t.var2) = :: e.a (e.n), '_va_' :: e.new_var, , :: s.acc, :: e.min, e.a ('Expr.SplitIterator 'e.new_var' = 'e.n'.rightSplit('e.min');'); (DECL (INT t.var)) = ('int '';'); (ASSIGN (INT t.var) e.expr) = :: s.acc, :: e.expr, (' = 'e.expr';'); (ASSIGN t.var e.expr) = :: e.a (e.j_expr), { : e t.var e = e.a ('.assign ('e.j_expr');'); e.a ('.assign ('e.j_expr');'); e.a (' = 'e.j_expr';'); }; (DECL s.type t.var) = :: e.j_var, { s.type : Result = , ('Result 'e.j_var' = new Result ();'); , ('Expr 'e.j_var' = Expr.empty;'); }; (DROP t.var) = ('.drop ();'); (CONTINUE t.label) = ('continue '';'); (BREAK t.label) = ('break '';'); (ERROR e.expr) = :: e.a (e.j_expr), e.a ('throw new RefalException ('e.j_expr');'); (CONSTEXPR s.linkage t.name (e.comment) e.expr), { t.name : (STATIC e) = ; ; } :: e.n, :: e.a (e.j_expr), e.a ('static '' final Expr 'e.n' = 'e.j_expr';'); (OBJ s.linkage s.tag t.name) = : s1 e2, 'Named' s1 :: e.class_name, t.name : (e s.n), ('static '' final Expr ' ' = new Expr (new org.refal.plus.library.'e.class_name' ("'s.n'"));'); ("DECL-OBJ" t.name) = ; ("DECL-FUNC" t.name) = ; /* * s.call can be CALL or TAILCALL or TAILCALL? */ (s.call t.name (e.args) (e.ress)) = :: e.decls (e.ress), :: e.arrays (e.args), ' ('e.args')' :: e.c, { s.call : "TAILCALL?" = e.arrays e.decls ('if (!'e.c') {' ('return false;') '}'); e.arrays e.decls (e.c';') ; }; } :: e.java_item, { e.java_item : ('break ' e) = e.java_item; e.java_item ; }; /*empty*/; }; Declare_Results { (t.var e.r) e.ress, { = )>; : e t.var e = )>; '_va_' :: e.new_var, ' = 'e.new_var'.getExpr ();')> = ('Result 'e.new_var' = new Result ();') ; }; () e.ress = (e.ress); }; $func Term_Ref_To_Java s.acc term = e.term; Expr_Ref_To_Java { /*empty*/ = ('Expr.empty'); term = :: s.acc, :: e.term, (e.term); t1 t2 = :: s.acc, :: e.t1, :: e.t2, ('new Expr ('e.t1', 'e.t2')'); expr = '_va_' :: e.new_var, :: s.acc, > :: e.arr_init, ('Expr[] 'e.new_var' = { 'e.arr_init' };') ('Expr.concat ('e.new_var')'); }; Term_Ref_To_Java s.acc term = term : { (PAREN e.expr) = :: e.a (e.j_expr), , 'new Expr('e.j_expr')'; (DEREF e.expr (e.pos)) = :: e.a (e.j_expr), , :: e.pos, '(Expr) 'e.j_expr'.at ('e.pos')'; (SUBEXPR e.expr (e.pos) (e.len)) = :: e.a (e.j_expr), , :: e.pos, :: e.len, 'new Expr ('e.j_expr', 'e.pos', 'e.len')'; (REF t.name) = ; "ERROR-EXPR" = 'err'; (s.var_tag e.ns t.name) = ; }; Expr_Int_To_Java s.acc expr = expr : { // /*empty*/ = /*empty*/; s.ObjectSymbol = { = s.ObjectSymbol; $error ("Illegal int-symbol: " s.ObjectSymbol); //FIXME: It is needed to check that // s.ObjectSymbol is less than 2^31 or another limit. // Set this limit in option. }; (LENGTH e.expr) = :: e.a (e.j_expr), , e.j_expr'.getLen ()'; (MAX e.args) = 'java.lang.Math.max ('')'; (MIN e.args) = 'java.lang.Math.min ('')'; (INFIX s.op e.args) = '(' ')'; // (REF t.name) = ; (INT t.var) = ; expr = '(' > ')'; }; Cond_To_Java s.acc t.cond = t.cond : { ("CALL-FAILS" (CALL t.name (e.exprs) (e.ress))) = :: e.decls (e.ress), :: e.arrays (e.args), , '!'' ('e.args')'; ("ITER-FAILS" e.expr) = '!'>'.isValid ()'; ("SYMBOL?" e.expr (e.pos)) = :: e.a (e.j_expr), , e.j_expr'.symbolAt ('')'; (EQ e.expr1 (e.expr2) (e.pos)) = :: e.a1 (e.j_expr1), :: e.a2 (e.j_expr2), , e.j_expr1'.eq ('e.j_expr2', '')'; ("TERM-EQ" e.expr1 (e.expr2) (e.pos)) = :: e.a1 (e.j_expr1), :: e.a2 (e.j_expr2), , e.j_expr1'.termEq ('e.j_expr2', ' ')'; (NOT t.not_cond) = '!' ; }; Infix_To_Java s.acc s.arg2java s.op e.args, { e.args : (e.arg) e.rest = :: e.arg, :: e.rest, { e.arg : v, e.rest : v = e.arg ' ' s.op ' ' e.rest; e.arg e.rest; };; }; Step_To_Java { /*empty*/ = /*empty*/; ("INC-ITER" e.expr) = >'.next ()'; ("DEC-ITER" e.expr) = >'.prev ()'; }; $func Const_Expr_Aux (e.accum) e.expr = (e.arrays) e.java_expr; Const_Expr_To_Java { /*empty*/ = ('Expr.empty'); (SUBEXPR t.name s.pos s.len) = ('new Expr ('', 's.pos', 's.len')'); //FIXME: It is needed to check that // s.pos и s.len is less than 2^31 or another limit. // Set this limit in option. e.expr = : { (e.arrays) (e1) = e.arrays (e1); (e.arrays) (e1) (e2) = e.arrays ('new Expr ('e1', 'e2')'); (e.arrays) e.concat = '_va_' :: e.new_var, e.arrays ('static private final Expr[] 'e.new_var' = { '>' };') ('Expr.concat ('e.new_var')'); }; }; Const_Expr_Aux (e.accum) e.expr, { e.expr : s.sym e.rest, = ) e.rest>; e.accum : v = :: (e.arrays) e.j_expr, (e.arrays) ('Expr.fromSequence ("'e.accum'")') e.j_expr; e.expr : t.item e.rest, t.item : { (PAREN e.paren_expr) = :: e.arrays (e.j_expr), (e.arrays) ('new Expr ('e.j_expr')'); (REF t.name) = () (); (STATIC e) = () (); ("FUNC?" t.name) = () ('new Expr (new Func () {' ('public boolean eval (Expr arg, Result res) throws RefalException {' ('return '' (arg, res);') '}') '})'); (FUNC t.name) = () ('new Expr (new Func () {' ('public boolean eval (Expr arg, Result res) throws RefalException {' ((' (arg, res);') ('return true;')) '}') '})'); s.sym, { = { : BigInteger = 'java.math.BigInteger'; ; } :: e.class, () ('new Expr (new 'e.class' ("'s.sym'"))'); = () ('new Expr (new Word ("''"))'); }; } :: (e.arrays) e.java_item = :: (e.new_arrays) e.java_rest, (e.arrays e.new_arrays) e.java_item e.java_rest; = () /*empty*/; }; Symbol_To_Java s.ObjectSymbol, { () $iter { e.symbol : s.char e.rest, s.char : { '\\' = '\\\\'; '\n' = '\\n'; '\t' = '\\t'; // '\v' = '\\v'; // '\b' = '\\b'; '\r' = '\\r'; // '\f' = '\\f'; '\"' = '\\"'; // '\'' = '\\\''; s = s.char; } :: e.java_char, e.rest (e.java_symbol e.java_char); } :: e.symbol (e.java_symbol), e.symbol : /*empty*/ = e.java_symbol; }; Int_Args_To_Java s.acc e.args = e.args (/*e.java-args*/) $iter { e.args : (e.arg) e.rest = { e.rest : v = ', '; /*empty*/; } :: e.comma, e.rest (e.java_args e.comma); } :: e.args (e.java_args), e.args : /*empty*/ = e.java_args; Var_Args_To_Java e.args = e.args (/*e.type*/) (/*e.java-args*/) $iter { e.args : s.t e.rest = e.rest (s.t) (e.java_args); e.args : t.arg e.rest = { e.rest : e (e) e = ', '; /*empty*/; } :: e.comma, e.rest (e.type) (e.java_args e.type' ' e.comma); } :: e.args (e.type) (e.java_args), e.args : /*empty*/ = e.java_args; Expr_Args_To_Java e.args = e.args (/*e.type*/) (/*e.java-args*/) (/*e.arrays*/) $iter { e.args : s.t e.rest = e.rest (s.t) (e.java_args) (e.arrays); e.args : (e.arg) e.rest = { e.rest : e (e) e = ', '; /*empty*/; } :: e.comma, { e.type : /*empty*/ = :: e.a (e.j_arg), e.rest (e.type) (e.java_args e.j_arg e.comma) (e.arrays e.a); e.rest (e.type) (e.java_args e.arg e.comma) (e.arrays); }; } :: e.args (e.type) (e.java_args) (e.arrays), e.args : /*empty*/ = e.arrays (e.java_args); Name_To_Java (e.obj_name) = :: e.namespace, { e.obj_name : e.namespace e.cont = e.cont; e.obj_name; } :: e.name, >>; Var_To_Java t.var = { '.getExpr ()'; ; }; Access_Mode { EXPORT = 'public'; s = ; }; Free_Index = : { /*empty*/ = 1; s.idx = ; } :: s.idx, , s.idx;