source: to-imperative/trunk/compiler/rfp_asail_java.rf @ 2474

Last change on this file since 2474 was 2474, checked in by orlov, 14 years ago
  • No variable declarations with DEREF and SUBEXPR in ASAIL.
  • Typo fixed: EXPORTS -> EXPORT in asail_java and asail_jbc.
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 18.2 KB
Line 
1// $Id: rfp_asail_java.rf 2474 2007-02-26 21:51:18Z orlov $
2
3$use Access Apply Arithm Box Class Compare Convert JavaMangle List StdIO Table;
4$use "rfpc";
5$use "rfp_helper";
6
7$box Int;
8
9$box Module-Name;
10
11$box Entry;
12
13$box Entry-Name;
14
15$box Current-Namespace;
16
17$box Func-Name;
18
19$box Ress;
20$table Result;
21$box Res-Assigns;
22
23$table Iter-Vars;
24
25$func ASAIL-To-Java e.body = e.java-code;
26
27$func Expr-To-Java (e.ASAIL-Expr-init ) e.ASAIL-Expr-rest = e.aux-arrays (e.java-expr);
28
29$func Expr-Ref-To-Java e.ASAIL-Expr-Ref = e.aux-arrays (e.JAVA-Expr-Ref);
30
31$func Expr-Int-To-Java s.acc e.ASAIL-Expr-Int = e.JAVA-Expr-Int;
32
33$func Step-To-Java e.step-operators = e.java-step-operators;
34
35$func Const-Expr-To-Java e.ASAIL-const-expr = e.aux-arrays (e.JAVA-const-expr);
36
37$func Expr-Args-To-Java e.args = e.aux-arrays (e.java-args);
38
39$func Int-Args-To-Java s.acc e.args = e.java-args;
40
41$func Var-Args-To-Java e.args = e.java-args;
42
43$func Symbol-To-Java s.RFP-Symbol = e.JAVA-String;
44
45$func Name-To-Java t.name = e.JAVA-Name;
46
47$func Var-To-Java t.var = e.java-var;
48
49$func Cond-To-Java s.acc t.cond = e.JAVA-Cond;
50
51$func Infix-To-Java s.acc s.func-for-converting-args-to-java s.op e.args = e.java-expr;
52
53$func Access-Mode s.linkage = e.java-access-mode;
54
55$box Free-Idx;
56
57$func Free-Index = e.free-index;
58
59$func Declare-Results (e.ress) e.acc-java-ress = e.decls (e.java-ress);
60
61
62
63$func GetJavaName e.name = e.javaName;
64
65GetJavaName e.name = <Concat <Map! &To-Word (<Map! &Rfp2Java (<Paren e.name>)>)>>;
66
67$func GetJavaQName e.moduleName t.name = s.javaQName;
68
69GetJavaQName e.moduleName t.name = {
70    e.moduleName : "refal" "plus" s.module = "org" "refal" "plus" "library" s.module;
71    e.moduleName;
72  } :: e.moduleName,
73  <To-Word <Intersperse ('.') <GetJavaName e.moduleName t.name>>>;
74
75$func GetJavaModuleName e.moduleName = e.javaModuleName;
76
77GetJavaModuleName e.moduleName = {
78    e.moduleName : "refal" "plus" e.tail = "org" "refal" "plus" "library" e.tail;
79    e.moduleName;
80  } :: e.moduleName,
81  <GetJavaName e.moduleName>;
82
83RFP-ASAIL-To-Java (MODULE (e.moduleName) e.asail) =
84  <Store &Free-Idx>,
85  <Clear-Table &Iter-Vars>,
86  {
87    <Store &Int <Lookup &RFP-Options INT>>;
88    <Store &Int BigInteger>;
89  },
90  <Store &Current-Namespace e.moduleName>,
91  {
92    <Store &Entry <Lookup &RFP-Options ENTRIES>>;
93    <Store &Entry (e.moduleName Main)>;
94  },
95  <Store &Entry-Name /*empty*/>,
96  <To-Word <Intersperse ('.') e.moduleName>> :: s.refal-mod-name,
97  <Store &Module-Name s.refal-mod-name>,
98  <GetJavaModuleName e.moduleName> :: e.javaModuleName,
99  {
100    <ASAIL-To-Java e.asail> : v.java,
101      e.javaModuleName : e.package s.class,
102      {
103        e.package : v = ('package '<Intersperse ('.') e.package>';');;
104      } :: e.package,
105      {
106        <? &Entry-Name> : v.name =
107          ()
108          ('public static void main (java.lang.String[] args) {' (
109            ('RefalRuntime.setArgs ("'s.refal-mod-name'", args);')
110            ('try {' (v.name' (new Result ());') '}')
111            ('catch (RefalException e) {' (
112              ('java.lang.System.out.println ("$error: " + e);')
113              ('java.lang.System.exit (100);')
114            )'}')
115          )'}');;
116      } :: e.entry,
117      e.package ('import org.refal.plus.*;')('public class 's.class' {' (v.java e.entry) '}');;
118  } :: e.java,
119  (e.javaModuleName) (e.java);
120
121ASAIL-To-Java e.asail, {
122  e.asail : t.item e.rest, t.item : {
123    (s.tag IMPORT e) = /*empty*/;
124    (s.tag s.linkage t.name (e.args) (e.ress) e.body),
125      s.tag : \{
126        FUNC  = ('void') /*empty*/;
127        FUNC? = ('boolean') ('return true;');
128      } :: (e.return-type) e.return =
129      <Store &Ress e.ress>,
130      <Clear-Table &Result>,
131      { <? &Entry> : e t.name e = <Store &Entry-Name <Rfp2Java t.name>>;; },
132      <Store &Func-Name <Name-To-Java t.name>>,
133      ()
134      ('static '<Access-Mode s.linkage>' 'e.return-type' '
135        <? &Func-Name>' ('<Var-Args-To-Java Expr e.args Result e.ress>') throws RefalException')
136        ('{' (<ASAIL-To-Java e.body> e.return) '}');
137    (TRACE t.name) =
138      <Bind &RFP-Trace (t.name) ()>;
139    (IF-INT-CMP s.op (e.arg1) (e.arg2) e.body) =
140      <Box> :: s.acc,
141      <Expr-Int-To-Java s.acc e.arg1> ' 's.op' ' <Expr-Int-To-Java s.acc e.arg2> :: e.cond,
142      <? s.acc>
143      ('if (' e.cond ')')
144      ('{' (<ASAIL-To-Java e.body>) '}');
145    (IF t.cond e.body) =
146      <Box> :: s.acc,
147      <Cond-To-Java s.acc t.cond> :: e.j-cond,
148      {
149        t.cond : (CALL-FAILS e) =
150          () (<? &Res-Assigns> <Store &Res-Assigns /*empty*/>);
151        (<? &Res-Assigns> <Store &Res-Assigns /*empty*/>) ();
152      } :: (e.if-yes-assigns) (e.if-not-assigns),
153      <? s.acc>
154      ('if ('e.j-cond')')
155      ('{' (
156        e.if-yes-assigns
157        <ASAIL-To-Java e.body>
158      )'}' )
159      e.if-not-assigns;
160    (FOR (e.cont-label) (e.break-label) () (e.step) e.body) =
161      {
162        e.cont-label : t = <Rfp2Java (LABEL e.cont-label)> ': ';;
163      } :: e.cont,
164      {
165        e.break-label : t = <Rfp2Java (LABEL e.break-label)> ': ';;
166      } :: e.break,
167      {
168        e.step : (s.d e.var), s.d : \{ INC-ITER; DEC-ITER; } =
169          <Lookup &Iter-Vars e.var> : e.new-var t.var1 t.var2,
170          ('Expr '<Rfp2Java t.var1>' = 'e.new-var'.getLeft();')
171          ('Expr '<Rfp2Java t.var2>' = 'e.new-var'.getRight();');;
172      } :: e.split-vars,
173      (e.break e.cont 'for ( ; ; '<Step-To-Java e.step>')')
174      ('{' (
175        e.split-vars <? &Res-Assigns> <Store &Res-Assigns /*empty*/>
176        <ASAIL-To-Java e.body>
177      ) '}');
178    (LABEL (e.label) e.body) =
179      (<Rfp2Java (LABEL e.label)>': {' (<ASAIL-To-Java e.body>) '}');
180    (TRY e.body) =
181      ('try') ('{' (
182        ('if (false)'
183          ('throw new RefalException ("'<? &Module-Name>'", "'<? &Func-Name>'", '
184            '"This is for avoiding \'Unreachable code\' errors");'
185        )   )
186        <ASAIL-To-Java e.body>
187      ) '}');
188    (CATCH-ERROR e.body) =
189      ('catch (RefalException error) {' (
190        ('Expr err = error.getExpr ();')
191        (<ASAIL-To-Java e.body>)
192      ) '}');
193    RETFAIL = ('return false;');
194    FATAL =
195      ('throw new RefalException ("'<? &Module-Name>'", "'<? &Func-Name>'", "Unexpected fail");');
196    (LSPLIT t.name (e.min) t.var1 t.var2) =
197      <Expr-Ref-To-Java t.name> :: e.a (e.n),
198      '_va_' <Free-Index> :: e.new-var,
199      <Bind &Iter-Vars (t.name) (e.new-var t.var1 t.var2)>,
200      <Box> :: s.acc,
201      <Expr-Int-To-Java s.acc e.min> :: e.min,
202      e.a <? s.acc>
203      ('Expr.SplitIterator 'e.new-var' = 'e.n'.leftSplit('e.min');');
204    (RSPLIT t.name (e.min) t.var1 t.var2) =
205      <Expr-Ref-To-Java t.name> :: e.a (e.n),
206      '_va_' <Free-Index> :: e.new-var,
207      <Bind &Iter-Vars (t.name) (e.new-var t.var1 t.var2)>,
208      <Box> :: s.acc,
209      <Expr-Int-To-Java s.acc e.min> :: e.min,
210      e.a <? s.acc>
211      ('Expr.SplitIterator 'e.new-var' = 'e.n'.rightSplit('e.min');');
212    (ASSIGN t.var e.expr) =
213      <Expr-To-Java () e.expr> :: e.a (e.j-expr),
214      {
215        <? &Ress> : e t.var e =
216          e.a (<Rfp2Java t.var>'.assign ('e.j-expr');');
217        e.a (<Lookup &Result t.var>'.assign ('e.j-expr');');
218        e.a (<Rfp2Java t.var>' = 'e.j-expr';');
219      };
220    (DECL s.type t.var) =
221      <Rfp2Java t.var> :: e.j-var,
222      {
223        s.type : Result =
224          <Bind &Result (t.var) (e.j-var)>,
225          ('Result 'e.j-var' = new Result ();');
226        <Unbind &Result t.var>,
227          ('Expr 'e.j-var' = Expr.empty;');
228      };
229    (INT t.var e.expr) =
230      <Box> :: s.acc,
231      <Expr-Int-To-Java s.acc e.expr> :: e.expr,
232      <? s.acc> ('int '<Rfp2Java t.var>' = 'e.expr';');
233    (EXPR t.var e.expr) =
234      <Unbind &Result t.var>,
235      <Expr-Ref-To-Java e.expr> :: e.a (e.j-expr),
236      e.a ('Expr '<Rfp2Java t.var>' = 'e.j-expr';');
237    (DROP t.var) =
238      (<Var-To-Java t.var>'.drop ();');
239    (CONTINUE t.label) =
240      ('continue '<Rfp2Java (LABEL t.label)>';');
241    (BREAK t.label) =
242      ('break '<Rfp2Java (LABEL t.label)>';');
243    (ERROR e.expr) =
244      <Expr-Ref-To-Java e.expr> :: e.a (e.j-expr),
245      e.a ('throw new RefalException ('e.j-expr');');
246    (CONSTEXPR s.linkage t.name (e.comment) e.expr),
247      {
248        t.name : (STATIC e) = <Rfp2Java t.name>;
249        <Name-To-Java t.name>;
250      } :: e.n,
251      <Const-Expr-To-Java e.expr> :: e.a (e.j-expr),
252      e.a ('static '<Access-Mode s.linkage>' final Expr 'e.n' = 'e.j-expr';');
253    (OBJ s.linkage s.tag t.name) =
254      <To-Chars s.tag> : s1 e2,
255      'Named' s1 <To-Lower e2> :: e.class-name,
256      t.name :  (e s.n),
257      ('static '<Access-Mode s.linkage>' final Expr '<Name-To-Java t.name>
258        ' = new Expr (new org.refal.plus.library.'e.class-name' ("'s.n'"));');
259    (DECL-OBJ t.name) = ;
260    (DECL-FUNC t.name) = ;
261    /*
262     * s.call can be CALL or TAILCALL or TAILCALL?
263     */
264    (s.call t.name (e.args) (e.ress)) =
265      <Declare-Results (e.ress)> :: e.decls (e.ress),
266      <Expr-Args-To-Java e.args Result e.ress> :: e.arrays (e.args),
267      <Name-To-Java t.name>' ('e.args')' :: e.c,
268      {
269        s.call : TAILCALL? =
270          e.arrays e.decls ('if (!'e.c') {' ('return false;') '}');
271        e.arrays e.decls (e.c';') <? &Res-Assigns>
272          <Store &Res-Assigns /*empty*/>;
273      };
274  } :: e.java-item,
275    {
276      e.java-item : ('break ' e) = e.java-item;
277      e.java-item <ASAIL-To-Java e.rest>;
278    };
279  /*empty*/;
280};
281
282Declare-Results {
283  (t.var e.r) e.ress, {
284    <In-Table? &Result t.var> = <Declare-Results (e.r) e.ress (<Rfp2Java t.var>)>;
285    <? &Ress> : e t.var e     = <Declare-Results (e.r) e.ress (<Rfp2Java t.var>)>;
286    '_va_' <Free-Index> :: e.new-var,
287      <Put &Res-Assigns (<Rfp2Java t.var>' = 'e.new-var'.getExpr ();')> =
288      ('Result 'e.new-var' = new Result ();') <Declare-Results (e.r) e.ress (e.new-var)>;
289  };
290  () e.ress = (e.ress);
291};
292
293/*
294 * Determine type of e.expr - int or Refal.
295 */
296Expr-To-Java (e.init) e.expr-all, e.expr-all : {
297  /*empty*/ = <Expr-Ref-To-Java e.init>;
298  (PAREN e.expr) e.rest = <Expr-Ref-To-Java e.init e.expr-all>;
299  (EXPR e.expr) e.rest = <Expr-Ref-To-Java e.init e.expr-all>;
300  (DEREF e.expr) e.rest = <Expr-Ref-To-Java e.init e.expr-all>;
301  (SUBEXPR e.expr) e.rest = <Expr-Ref-To-Java e.init e.expr-all>;
302  (LENGTH e.expr) e.rest = (<Expr-Int-To-Java XXX e.init e.expr-all>);
303  (MAX e.args) e.rest = (<Expr-Int-To-Java XXX e.init e.expr-all>);
304  (MIN e.args) e.rest = (<Expr-Int-To-Java XXX e.init e.expr-all>);
305  (INFIX s.op e.args) e.rest = (<Expr-Int-To-Java XXX e.init e.expr-all>);
306  (s.var-tag (e.QualifiedName)) e.rest =
307    <Expr-To-Java (e.init (s.var-tag (e.QualifiedName))) e.rest>;
308};
309
310$func Term-Ref-To-Java s.acc term = e.term;
311
312Expr-Ref-To-Java {
313  /*empty*/ = ('Expr.empty');
314  term =
315    <Box> :: s.acc,
316    <Term-Ref-To-Java s.acc term> :: e.term,
317    <? s.acc> (e.term);
318  t1 t2 =
319    <Box> :: s.acc,
320    <Term-Ref-To-Java s.acc t1> :: e.t1,
321    <Term-Ref-To-Java s.acc t2> :: e.t2,
322    <? s.acc> ('new Expr ('e.t1', 'e.t2')');
323  expr =
324    '_va_'<Free-Index> :: e.new-var,
325    <Box> :: s.acc,
326    <Infix-To-Java s.acc &Term-Ref-To-Java "," <Paren expr>> :: e.arr-init,
327    <? s.acc>
328    ('Expr[] 'e.new-var' = { 'e.arr-init' };')
329    ('Expr.concat ('e.new-var')');
330};
331
332Term-Ref-To-Java s.acc term = term : {
333  (PAREN e.expr) =
334    <Expr-Ref-To-Java e.expr> :: e.a (e.j-expr),
335    <Put s.acc e.a>,
336    'new Expr('e.j-expr')';
337  (DEREF e.expr (e.pos)) =
338    <Expr-Ref-To-Java e.expr> :: e.a (e.j-expr),
339    <Put s.acc e.a>,
340    <Expr-Int-To-Java s.acc e.pos> :: e.pos,
341    '(Expr) 'e.j-expr'.at ('e.pos')';
342  (SUBEXPR e.expr (e.pos) (e.len)) =
343    <Expr-Ref-To-Java e.expr> :: e.a (e.j-expr),
344    <Put s.acc e.a>,
345    <Expr-Int-To-Java s.acc e.pos> :: e.pos,
346    <Expr-Int-To-Java s.acc e.len> :: e.len,
347    'new Expr ('e.j-expr', 'e.pos', 'e.len')';
348  (REF t.name) = <Name-To-Java t.name>;
349  ERROR-EXPR = 'err';
350  (s.var-tag e.ns t.name) = <Var-To-Java term>;
351};
352
353Expr-Int-To-Java s.acc expr = expr : {
354//  /*empty*/ = /*empty*/;
355  s.ObjectSymbol =
356    {
357      <Int? s.ObjectSymbol> = s.ObjectSymbol;
358      $error ("Illegal int-symbol: " s.ObjectSymbol);
359        //FIXME: надо проверять, что число не
360        //       выходит за допустимые границы.
361        //       Задавать эти границы опциями.
362    };
363  (LENGTH e.expr) =
364    <Expr-Ref-To-Java e.expr> :: e.a (e.j-expr),
365    <Put s.acc e.a>,
366    e.j-expr'.getLen ()';
367  (MAX e.args) =
368    'java.lang.Math.max ('<Int-Args-To-Java s.acc e.args>')';
369  (MIN e.args) =
370    'java.lang.Math.min ('<Int-Args-To-Java s.acc e.args>')';
371  (INFIX s.op e.args) =
372    '(' <Infix-To-Java s.acc &Expr-Int-To-Java s.op e.args> ')';
373//  (REF t.name) = <Name-To-Java t.name>;
374  (s.var-tag t.name) = <Rfp2Java (s.var-tag t.name)>;
375  expr = '(' <Infix-To-Java s.acc &Expr-Int-To-Java "+" <Paren expr>> ')';
376};
377
378Cond-To-Java s.acc t.cond = t.cond : {
379  (CALL-FAILS (CALL t.name (e.exprs) (e.ress))) =
380    <Declare-Results (e.ress)> :: e.decls (e.ress),
381    <Expr-Args-To-Java e.exprs Result e.ress> :: e.arrays (e.args),
382    <Put s.acc e.arrays e.decls>,
383    '!'<Name-To-Java t.name>' ('e.args')';
384  (ITER-FAILS e.expr) =
385    '!'<Middle 0 2 <Lookup &Iter-Vars e.expr>>'.isValid ()';
386  (SYMBOL? e.expr (e.pos)) =
387    <Expr-Ref-To-Java e.expr> :: e.a (e.j-expr),
388    <Put s.acc e.a>,
389    e.j-expr'.symbolAt ('<Expr-Int-To-Java s.acc e.pos>')';
390  (EQ e.expr1 (e.expr2) (e.pos)) =
391    <Expr-Ref-To-Java e.expr1> :: e.a1 (e.j-expr1),
392    <Expr-Ref-To-Java e.expr2> :: e.a2 (e.j-expr2),
393    <Put s.acc e.a1 e.a2>,
394    e.j-expr1'.eq ('e.j-expr2', '<Expr-Int-To-Java s.acc e.pos>')';
395  (TERM-EQ e.expr1 (e.expr2) (e.pos)) =
396    <Expr-Ref-To-Java e.expr1> :: e.a1 (e.j-expr1),
397    <Expr-Ref-To-Java e.expr2> :: e.a2 (e.j-expr2),
398    <Put s.acc e.a1 e.a2>,
399    e.j-expr1'.termEq ('e.j-expr2', '<Expr-Int-To-Java s.acc e.pos> ')';
400  (NOT t.not-cond) =
401    '!' <Cond-To-Java s.acc t.not-cond>;
402};
403
404Infix-To-Java s.acc s.arg2java s.op e.args, {
405  e.args : (e.arg) e.rest =
406    <Apply s.arg2java s.acc e.arg> :: e.arg,
407    <Infix-To-Java s.acc s.arg2java s.op e.rest> :: e.rest,
408    {
409      e.arg : v, e.rest : v = e.arg ' ' s.op ' ' e.rest;
410      e.arg e.rest;
411    };;
412};
413
414Step-To-Java {
415  /*empty*/ = /*empty*/;
416  (INC-ITER e.expr) = <Middle 0 2 <Lookup &Iter-Vars e.expr>>'.next ()';
417  (DEC-ITER e.expr) = <Middle 0 2 <Lookup &Iter-Vars e.expr>>'.prev ()';
418};
419
420$func Const-Expr-Aux (e.accum) e.expr = (e.arrays) e.java-expr;
421
422Const-Expr-To-Java {
423  /*empty*/ = ('Expr.empty');
424  (SUBEXPR t.name s.pos s.len) = ('new Expr ('<Rfp2Java t.name>', 's.pos', 's.len')');
425                  //FIXME: надо проверять, что s.pos и s.len
426                  //       не превышают допустимых величин.
427                  //       Задавать эти величины опциями.
428  e.expr =
429    <Const-Expr-Aux () e.expr> : {
430      (e.arrays) (e1)      = e.arrays (e1);
431      (e.arrays) (e1) (e2) = e.arrays ('new Expr ('e1', 'e2')');
432      (e.arrays) e.concat  =
433        '_va_'<Free-Index> :: e.new-var,
434        e.arrays
435        ('static private final Expr[] 'e.new-var' = { '<Concat <Intersperse (', ') e.concat>>' };')
436        ('Expr.concat ('e.new-var')');
437    };
438};
439
440Const-Expr-Aux (e.accum) e.expr, {
441  e.expr : s.sym e.rest, <Char? s.sym> =
442    <Const-Expr-Aux (e.accum <Symbol-To-Java s.sym>) e.rest>;
443  e.accum : v =
444    <Const-Expr-Aux () e.expr> :: (e.arrays) e.j-expr,
445    (e.arrays) ('Expr.fromSequence ("'e.accum'")') e.j-expr;
446  e.expr : t.item e.rest, t.item : {
447    (PAREN e.paren-expr) =
448      <Const-Expr-To-Java e.paren-expr> :: e.arrays (e.j-expr),
449      (e.arrays) ('new Expr ('e.j-expr')');
450    (REF t.name) =
451      () (<Name-To-Java t.name>);
452    (STATIC e) =
453      () (<Rfp2Java t.item>);
454    (FUNC? t.name) = () ('new Expr (new Func () {'
455      ('public boolean eval (Expr arg, Result res) throws RefalException {'
456        ('return '<Name-To-Java t.name>' (arg, res);')
457      '}') '})');
458    (FUNC t.name) = () ('new Expr (new Func () {'
459      ('public boolean eval (Expr arg, Result res) throws RefalException {'
460        ((<Name-To-Java t.name>' (arg, res);')
461         ('return true;'))
462      '}') '})');
463    s.sym, {
464      <Int? s.sym> =
465        {
466          <? &Int> : BigInteger = 'java.math.BigInteger';
467          <? &Int>;
468        } :: e.class,
469        () ('new Expr (new 'e.class' ("'s.sym'"))');
470      <Word? s.sym> =
471        () ('new Expr (new Word ("'<Symbol-To-Java s.sym>'"))');
472    };
473  } :: (e.arrays) e.java-item =
474    <Const-Expr-Aux () e.rest> :: (e.new-arrays) e.java-rest,
475    (e.arrays e.new-arrays) e.java-item e.java-rest;
476  = () /*empty*/;
477};
478
479Symbol-To-Java s.ObjectSymbol, {
480  <To-Chars s.ObjectSymbol> () $iter {
481    e.symbol : s.char e.rest, s.char : {
482      '\\' = '\\\\';
483      '\n' = '\\n';
484      '\t' = '\\t';
485//        '\v' = '\\v';
486//        '\b' = '\\b';
487      '\r' = '\\r';
488//        '\f' = '\\f';
489      '\"' = '\\"';
490//      '\'' = '\\\'';
491      s = s.char;
492    } :: e.java-char,
493    e.rest (e.java-symbol e.java-char);
494  } :: e.symbol (e.java-symbol),
495    e.symbol : /*empty*/ =
496    e.java-symbol;
497};
498
499Int-Args-To-Java s.acc e.args =
500  e.args (/*e.java-args*/) $iter {
501    e.args : (e.arg) e.rest =
502      {
503        e.rest : v = ', ';
504        /*empty*/;
505      } :: e.comma,
506      e.rest (e.java-args <Expr-Int-To-Java s.acc e.arg> e.comma);
507    } :: e.args (e.java-args),
508  e.args : /*empty*/ =
509  e.java-args;
510
511Var-Args-To-Java e.args =
512  e.args (/*e.type*/) (/*e.java-args*/) $iter {
513    e.args : s.t e.rest =
514      e.rest (s.t) (e.java-args);
515    e.args : t.arg e.rest =
516      {
517        e.rest : e (e) e = ', ';
518        /*empty*/;
519      } :: e.comma,
520      e.rest (e.type) (e.java-args e.type' '<Rfp2Java t.arg> e.comma);
521    } :: e.args (e.type) (e.java-args),
522  e.args : /*empty*/ =
523  e.java-args;
524
525Expr-Args-To-Java e.args =
526  e.args (/*e.type*/) (/*e.java-args*/) (/*e.arrays*/) $iter {
527    e.args : s.t e.rest =
528      e.rest (s.t) (e.java-args) (e.arrays);
529    e.args : (e.arg) e.rest =
530      {
531        e.rest : e (e) e = ', ';
532        /*empty*/;
533      } :: e.comma,
534      {
535        e.type : /*empty*/ =
536          <Expr-Ref-To-Java e.arg> :: e.a (e.j-arg),
537          e.rest (e.type) (e.java-args e.j-arg e.comma) (e.arrays e.a);
538        e.rest (e.type) (e.java-args e.arg e.comma) (e.arrays);
539      };
540  } :: e.args (e.type) (e.java-args) (e.arrays),
541  e.args : /*empty*/ =
542  e.arrays (e.java-args);
543
544Name-To-Java (e.obj-name) =
545  <? &Current-Namespace> :: e.namespace,
546  {
547    e.obj-name : e.namespace e.cont = e.cont;
548    e.obj-name;
549  } :: e.name,
550  <To-Word <Intersperse ('.') <GetJavaModuleName e.name>>>;
551
552Var-To-Java t.var = {
553  <Lookup &Result t.var>'.getExpr ()';
554  <Rfp2Java t.var>;
555};
556
557Access-Mode {
558  EXPORT = 'public';
559  s = ;
560};
561
562Free-Index =
563  <? &Free-Idx> : {
564    /*empty*/ = 1;
565    s.idx     = <"+" s.idx 1>;
566  } :: s.idx,
567  <Store &Free-Idx s.idx>,
568  s.idx;
Note: See TracBrowser for help on using the repository browser.