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

Last change on this file since 2043 was 2043, checked in by orlov, 14 years ago
  • Improved block extraction from result expressions.
  • Use asail2asail when converting to C++.
  • Remove duplicate declarations after cleanup of blocks

(rfp_asail2asail.Remove-Dupl-Decl).

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