package nl.bluering; import java.util.*; public abstract class NameSpace { private Hashtable h=new Hashtable(); protected NameSpace next; public NameSpace(){} protected Object objectget(String s,boolean create) { Object r=h.get(s); if(r==null&&next!=null) r=next.objectget(s,false); if(r==null&&create) r=create(s); return r; } /** * returns the variable */ Variable object2var(Object o,boolean create,String name) { if(o instanceof Variable) return (Variable)o; if (o instanceof Vertical) {Vertical v=(Vertical) o; if(v.canget()) return v.get(); if(create) return v.newlocal(new Variable(name)); } return null; } public Variable getvar(String x,boolean create) {Object o=objectget(x,create); if(o==null) return null; return object2var(o,create,x); } protected void objectput(String s,Object o) {h.put(s,o); } abstract Object create(String s); public void dump(ExpWriter ew) { Object o; for (Enumeration e = h.elements() ; e.hasMoreElements() ;) { Variable v=object2var(e.nextElement(),false,null); if (v!=null) {ew.write(v.toString()); ew.write(" = "); ew.write(v.getexp()); ew.write("\n"); } } } } class FlatSpace extends NameSpace { public FlatSpace() {} Object create(String s) { Variable v=new Variable(s); objectput(s,v); return v; } } class StackSpace extends NameSpace { public StackSpace() {} Object create(String s) { Vertical v=new Vertical(s); objectput(s,v); return v; } Vertical getvertical(String s,boolean create) {return (Vertical)objectget(s,create); } }