import syntaxtree.*; import java.util.*; class Environment { private Stack stack; public Environment() { stack = new Stack(); } public void pushMethod(MethodEnv m){ stack.push(m); } public void popMethod(){ stack.pop(); } public MethodEnv topMethod(){ return stack.peek(); } public Object getVarValue(String id){ MethodEnv m = topMethod(); if(m.containsVar(id)) return m.getVarValue(id); if(m.containsParam(id)) return m.getParamValue(id); ClassEnv c = m.enclosingClass; while(c != null) { if(c.containsVar(id)) { return c.getVarValue(id); } else { if(c.parent() == null) { c = null; } else { c = c.parent(); } } } return null; } public void setVarValue(String id, Object o){ MethodEnv m = topMethod(); if(m.containsVar(id)) { m.setVarValue(id, o); return; } if(m.containsParam(id)) { m.setParamValue(id, o); return; } ClassEnv c = m.enclosingClass; while(c != null) { if(c.containsVar(id)) { c.setVarValue(id, o); return; } else { if(c.parent() == null) { c = null; } else { c = c.parent(); } } } } }//Environment class ClassEnv { String id; ClassEnv parent; Hashtable globals; public ClassEnv(Class c) { id = c.id; globals = new Hashtable(); for (Enumeration e = c.globals.keys(); e.hasMoreElements() ;) globals.put((String)(e.nextElement()), new Integer(0)); } public ClassEnv() {} public ClassEnv parent() { return parent; } public Object getVarValue(String id) { if(containsVar(id)) return globals.get(id); return null; } public boolean setVarValue(String id, Object o) { if(containsVar(id)){ globals.put(id, o); return true; } return false; } public boolean containsVar(String id) { return globals.containsKey(id); } } // ClassEnv class MethodEnv { ClassEnv enclosingClass; Hashtable params; Hashtable locals; public MethodEnv(Method m, ClassEnv ce) { enclosingClass = ce; params = new Hashtable(); for (Enumeration e = m.params.elements(); e.hasMoreElements() ;) params.put(((Variable)(e.nextElement())).id, new Integer(0)); locals = new Hashtable(); for (Enumeration e = m.vars.keys(); e.hasMoreElements() ;) locals.put((String)(e.nextElement()), new Integer(0)); } public boolean setVarValue(String id, Object o) { if(locals.containsKey(id)) { locals.put(id, o); return true; } return false; } public boolean setParamValue(String id, Object o) { if(params.containsKey(id)) { params.put(id, o); return true; } return false; } public Object getVarValue(String id) { if(containsVar(id)) return locals.get(id); return null; } public Object getParamValue(String id) { if(containsParam(id)) return params.get(id); return null; } public boolean containsVar(String id) { return locals.containsKey(id); } public boolean containsParam(String id) { return params.containsKey(id); } } // MethodEnv