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 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 ) 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 name = (String ) 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 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 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 XML_NAMESPACE_MAGIC = "&xml&"; 91 } 92 | Popular Tags |