KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > kawa > lispexpr > DefineNamespace


1 package gnu.kawa.lispexpr;
2 import kawa.lang.*;
3 import gnu.expr.*;
4 import gnu.mapping.*;
5 import gnu.lists.*;
6 import gnu.bytecode.ClassType;
7 import gnu.kawa.xml.XmlNamespace;
8
9 public class DefineNamespace extends Syntax
10 {
11   private boolean makePrivate;
12   private boolean makeXML;
13   
14   public static final DefineNamespace define_namespace
15     = new DefineNamespace();
16   public static final DefineNamespace define_private_namespace
17     = new DefineNamespace();
18   public static final DefineNamespace define_xml_namespace
19     = new DefineNamespace();
20   static {
21     define_namespace.setName("define-namespace");
22     define_private_namespace.setName("define-private-namespace");
23     define_private_namespace.makePrivate = true;
24     define_xml_namespace.setName("define-xml-namespace");
25     define_xml_namespace.makeXML = true;
26   }
27
28   public boolean scanForDefinitions (Pair st, java.util.Vector JavaDoc forms,
29                                      ScopeExp defs, Translator tr)
30   {
31     Pair p1, p2;
32     if (! (st.cdr instanceof Pair)
33         || ! ((p1 = (Pair) st.cdr).car instanceof String JavaDoc)
34     || ! (p1.cdr instanceof Pair)
35     || (p2 = (Pair) p1.cdr).cdr != LList.Empty)
36       {
37     tr.error('e', "invalid syntax for define-namespace");
38     return false;
39       }
40     String JavaDoc name = (String JavaDoc) p1.car;
41     Declaration decl = defs.getDefine(name, 'w', tr);
42     tr.push(decl);
43     decl.setFlag(Declaration.IS_CONSTANT|Declaration.IS_NAMESPACE_PREFIX);
44     if (makePrivate)
45       {
46         decl.setFlag(Declaration.PRIVATE_SPECIFIED);
47         decl.setPrivate(true);
48       }
49     else if (defs instanceof ModuleExp)
50       decl.setCanRead(true);
51     Translator.setLine(decl, p1);
52     Expression value;
53     String JavaDoc literal = null;
54     if (p2.car instanceof FString)
55       {
56         literal = p2.car.toString();
57         Namespace namespace;
58         if (literal.startsWith("class:"))
59           {
60             String JavaDoc cname = literal.substring(6);
61             namespace
62               = ClassNamespace.getInstance(literal, ClassType.make(cname));
63             decl.setType(ClassType.make("gnu.kawa.lispexpr.ClassNamespace"));
64           }
65         else if (makeXML)
66           {
67             namespace = XmlNamespace.getInstance(name, literal);
68             decl.setType(ClassType.make("gnu.kawa.xml.XmlNamespace"));
69           }
70         else
71           {
72             namespace = Namespace.getInstance(literal);
73             decl.setType(ClassType.make("gnu.mapping.Namespace"));
74           }
75         value = new QuoteExp(namespace);
76     decl.setFlag(Declaration.TYPE_SPECIFIED);
77        }
78     else
79       value = tr.rewrite_car (p2, false);
80     decl.noteValue(value);
81     forms.addElement(SetExp.makeDefinition(decl, value));
82     return true;
83   }
84
85   public Expression rewriteForm (Pair form, Translator tr)
86   {
87     return tr.syntaxError ("define-namespace is only allowed in a <body>");
88   }
89
90   public static final String JavaDoc XML_NAMESPACE_MAGIC = "&xml&";
91 }
92
Popular Tags