1 package kawa.standard; 2 import kawa.lang.*; 3 import gnu.lists.*; 4 import gnu.mapping.*; 5 import gnu.expr.*; 6 import gnu.bytecode.*; 7 8 public class define_alias extends Syntax 9 { 10 public static final define_alias define_alias = new define_alias(); 11 static { define_alias.setName("define-alias"); } 12 13 public boolean scanForDefinitions (Pair st, java.util.Vector forms, 14 ScopeExp defs, Translator tr) 15 { 16 Object formCdr = st.cdr; 17 SyntaxForm formSyntax = null; 18 while (formCdr instanceof SyntaxForm) 19 { 20 formSyntax = (SyntaxForm) formCdr; 21 formCdr = formSyntax.form; 22 } 23 if (formCdr instanceof Pair) 24 { 25 Pair p = (Pair) formCdr; 26 SyntaxForm nameSyntax = formSyntax; 27 Object name = p.car; 28 while (name instanceof SyntaxForm) 29 { 30 nameSyntax = (SyntaxForm) name; 31 name = nameSyntax.form; 32 } 33 formCdr = p.cdr; 34 while (formCdr instanceof SyntaxForm) 35 { 36 formSyntax = (SyntaxForm) formCdr; 37 formCdr = formSyntax.form; 38 } 39 if ((name instanceof String || name instanceof Symbol) 40 && formCdr instanceof Pair 41 && (p = (Pair) formCdr).cdr == LList.Empty) 42 { 43 Declaration decl = tr.define(name, nameSyntax, defs); 44 decl.setIndirectBinding(true); 45 decl.setAlias(true); 46 Expression arg = tr.rewrite_car(p, formSyntax); 47 if (arg instanceof ReferenceExp) 48 ((ReferenceExp) arg).setDontDereference(true); 49 else 50 arg = location.rewrite(arg, tr); 51 tr.mustCompileHere(); tr.push(decl); 53 SetExp sexp = new SetExp(decl, arg); 54 tr.setLineOf(sexp); 55 decl.noteValue(arg); 56 sexp.setDefining (true); 57 if (! (arg instanceof ReferenceExp)) 58 decl.setType(ClassType.make("gnu.mapping.Location")); 59 forms.addElement(sexp); 60 return true; 61 } 62 } 63 tr.error('e', "invalid syntax for define-alias"); 64 return false; 65 } 66 67 public Expression rewrite (Object obj, Translator tr) 68 { 69 return tr.syntaxError ("define-alias is only allowed in a <body>"); 70 } 71 } 72 | Popular Tags |