core: import edu.neu.ccs.demeter.dj.*; import java.util.*; import edu.neu.ccs.demeter.*; add: 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 constructor Cd_graph() {{ super(); }} public constructor 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_); } }} }