import edu.neu.ccs.demeter.dj.*; import java.util.*; import edu.neu.ccs.demeter.*; class Cd_graph { protected GlobalImports globalimports; public GlobalImports get_globalimports() { return globalimports; } public void set_globalimports(GlobalImports new_globalimports) { globalimports = new_globalimports; } protected AdjList adj1; public AdjList get_adj1() { return adj1; } public void set_adj1(AdjList new_adj1) { adj1 = new_adj1; } protected VisList visitor_list; public VisList get_visitor_list() { return visitor_list; } public void set_visitor_list(VisList new_visitor_list) { visitor_list = new_visitor_list; } protected AdjList adj2; public AdjList get_adj2() { return adj2; } public void set_adj2(AdjList new_adj2) { adj2 = new_adj2; } public Cd_graph() { super(); } public Cd_graph(GlobalImports globalimports, AdjList adj1, VisList visitor_list, AdjList adj2) { super(); set_globalimports(globalimports); set_adj1(adj1); set_visitor_list(visitor_list); set_adj2(adj2); } public static Cd_graph parse(java.io.Reader in) throws ParseException { return new Parser(in)._Cd_graph(); } public static Cd_graph parse(java.io.InputStream in) throws ParseException { return new Parser(in)._Cd_graph(); } public static Cd_graph parse(String s) { try { return parse(new java.io.StringReader(s)); } catch (ParseException e) { throw new RuntimeException(e.toString()); } } static ClassDefList delist,terminal,keylist; static TraversalGraph tg_adj; static TraversalGraph tg_list; static TraversalGraph tg_ded; static TraversalGraph tg_part; static TraversalGraph tg_sub; static TraversalGraph tg_parameter; static TraversalGraph tg_com; void findUndefinedClasses(TraversalGraph tg){ createTerminalList(); //System.out.println("11"); //find defined classes FindCVisitor fV= new FindCVisitor(); tg.traverse(this,fV); //System.out.println("22"); //find undefind classes FindAdjVisitor fdV = new FindAdjVisitor(); tg_adj.traverse(this,fdV); //System.out.println("33"); flattingClassGraph(); //System.out.println("44"); //find unique parts CheckUPartVisitor uV = new CheckUPartVisitor(); tg_list.traverse(delist,uV); //System.out.println("55"); //find inheritance circle CheckCircleVisitor iV = new CheckCircleVisitor(); tg_list.traverse(delist,iV); } void createTerminalList() { terminal = ClassDefList.parse("{}");; delist = ClassDefList.parse("{}"); keylist = ClassDefList.parse("{}");; ClassInfo ci = new ClassInfo(); ClassName name = new ClassName(); Ident ident = new Ident("Ident"); name.set_ident(ident); ci.set_name(name); terminal.get_classinfo_list().addElement(ci); ci = new ClassInfo(); name = new ClassName(); ident = new Ident("String"); name.set_ident(ident); ci.set_name(name); terminal.get_classinfo_list().addElement(ci); ci = new ClassInfo(); name = new ClassName(); ident = new Ident("Text"); name.set_ident(ident); ci.set_name(name); terminal.get_classinfo_list().addElement(ci); ci = new ClassInfo(); name = new ClassName(); ident = new Ident("Real"); name.set_ident(ident); ci.set_name(name); terminal.get_classinfo_list().addElement(ci); ci = new ClassInfo(); name = new ClassName(); ident = new Ident("Number"); name.set_ident(ident); ci.set_name(name); terminal.get_classinfo_list().addElement(ci); ci = new ClassInfo(); name = new ClassName(); ident = new Ident("Visitor"); name.set_ident(ident); ci.set_name(name); keylist.get_classinfo_list().addElement(ci); ci = new ClassInfo(); name = new ClassName(); ident = new Ident("Stack"); name.set_ident(ident); ci.set_name(name); keylist.get_classinfo_list().addElement(ci); ci = new ClassInfo(); name = new ClassName(); ident = new Ident("extends"); name.set_ident(ident); ci.set_name(name); keylist.get_classinfo_list().addElement(ci); ci = new ClassInfo(); name = new ClassName(); ident = new Ident("EOF"); name.set_ident(ident); ci.set_name(name); keylist.get_classinfo_list().addElement(ci); ci = new ClassInfo(); name = new ClassName(); ident = new Ident("int"); name.set_ident(ident); ci.set_name(name); keylist.get_classinfo_list().addElement(ci); ci = new ClassInfo(); name = new ClassName(); ident = new Ident("float"); name.set_ident(ident); ci.set_name(name); keylist.get_classinfo_list().addElement(ci); ci = new ClassInfo(); name = new ClassName(); ident = new Ident("Integer"); name.set_ident(ident); ci.set_name(name); terminal.get_classinfo_list().addElement(ci); ci = new ClassInfo(); name = new ClassName(); ident = new Ident("Float"); name.set_ident(ident); ci.set_name(name); keylist.get_classinfo_list().addElement(ci); ci = new ClassInfo(); name = new ClassName(); ident = new Ident("Boolean"); name.set_ident(ident); ci.set_name(name); keylist.get_classinfo_list().addElement(ci); ci = new ClassInfo(); name = new ClassName(); ident = new Ident("boolean"); name.set_ident(ident); ci.set_name(name); keylist.get_classinfo_list().addElement(ci); tg_list = new TraversalGraph("from ClassDefList bypassing {->*,partclass,*, ->*,tail,*, ->*,parent,*, ->*,subclass,*, ->*,parameter,*} to ClassInfo ",Main.cg); tg_ded = new TraversalGraph("from Adjacency bypassing {Neighbors, ->*,parameters,*,Vertext} to Vertex",Main.cg); tg_adj = new TraversalGraph("from Cd_graph to Adjacency",Main.cg); tg_com = new TraversalGraph("from Adjacency bypassing {Neighbors, ->*,source,*, ->*,tail,*} to Vertex",Main.cg); tg_part = new TraversalGraph("from Adjacency bypassing {-> *,source,*, ->*,parameters,*, Repetit_n, ->*,alternat_ns,*, ->*,actual_parameters,*} to {Vertex,Labeled}",Main.cg); tg_sub = new TraversalGraph("from Adjacency bypassing {-> *,source,*, ->*,parameters,*, Repetit_n, ->*,construct_ns,*} to Vertex",Main.cg); tg_parameter = new TraversalGraph("from Adjacency bypassing {-> *,source,*, ->*,parameters,*, Repetit_n, ->*,alternat_ns,*, ->*,vertex,*} to Vertex",Main.cg); } static ClassInfo check_undefined(Ident name){ FindUCVisitor fV = new FindUCVisitor(name); ClassInfo result = (ClassInfo)Cd_graph.tg_list.traverse(Cd_graph.delist,fV); if (result == null){ // searching in the list of defined classes fV = new FindUCVisitor(name); result = (ClassInfo) Cd_graph.tg_list.traverse(Cd_graph.terminal,fV); if (result == null){ //searching in the list of terminals result = (ClassInfo) Cd_graph.tg_list.traverse(Cd_graph.keylist,fV); if (result == null){ //searching in the list of key words System.out.println("Error: Class " + name + " is not defined in the cd"); Main.err_num++; result = new ClassInfo(); ClassName n = new ClassName(); n.set_ident(name); result.set_name(n); Cd_graph.delist.get_classinfo_list().addElement(result); return result; } else return null; } else return result; } else return result; } void flattingClassGraph(){ FlattingVisitor fV = new FlattingVisitor(); tg_list.traverse(delist,fV); } void universal_trv0_bef(UniversalVisitor _v_) { ((UniversalVisitor) _v_).before(this); } void universal_trv0_aft(UniversalVisitor _v_) { ((UniversalVisitor) _v_).after(this); } void universal_trv0(UniversalVisitor _v_) { universal_trv0_bef(_v_); ((UniversalVisitor) _v_).before_globalimports(this, globalimports); globalimports.universal_trv0(_v_); ((UniversalVisitor) _v_).after_globalimports(this, globalimports); ((UniversalVisitor) _v_).before_adj1(this, adj1); adj1.universal_trv0(_v_); ((UniversalVisitor) _v_).after_adj1(this, adj1); if (visitor_list != null) { ((UniversalVisitor) _v_).before_visitor_list(this, visitor_list); visitor_list.universal_trv0(_v_); ((UniversalVisitor) _v_).after_visitor_list(this, visitor_list); } if (adj2 != null) { ((UniversalVisitor) _v_).before_adj2(this, adj2); adj2.universal_trv0(_v_); ((UniversalVisitor) _v_).after_adj2(this, adj2); } universal_trv0_aft(_v_); } }