ClassGraph { (@ void g_displayDemeterJava() { DemeterJavaVisitor djv = new DemeterJavaVisitor(); this.DJTraversal(djv); } @) traversal DJTraversal(DemeterJavaVisitor djv) { to {Part,RepetitionClass,Syntax}; } } Main { (@ static public void main(String args[]) throws Exception { ClassGraph cg = ClassGraph.parse(System.in); cg.g_displayDemeterJava(); System.exit(0); } @) } DemeterJavaVisitor { (@ int classNumber; int partNumber; boolean syntaxIsIn; boolean classIsAlt; @) (@ String IsClassTerminal(String className) { if (className.compareTo("Integer")==0) { return "Integer"; } else if (className.compareTo("Ident")==0) { return "Ident"; } else if (className.compareTo("String")==0) { return "String"; } else if (className.compareTo("Text")==0) { return "Text"; } else if (className.compareTo("Boolean")==0) { return "Boolean"; } else if (className.compareTo("Float")==0) { return "Float"; } else if (className.compareTo("Double")==0) { return "Double"; } else { return ""; } } @) after ClassGraph (@ System.out.println("}"); @) before ClassDef (@ this.set_classDefName(host.getName()); classNumber = classNumber + 1; partNumber = 0; syntaxIsIn = false; classIsAlt = false; if (classNumber == 1) { System.out.println(this.get_classDefName()+" {" ); System.out.println("("+"@"); System.out.println(" void g_displayAsTree() {"); System.out.println(" TreeDisplayVisitor tdv = new TreeDisplayVisitor(new Integer(0));" ); System.out.println(" this.t(tdv);"); System.out.println(" }"); System.out.println("@"+")"); System.out.println(""); System.out.println("traversal t(TreeDisplayVisitor tdv) {to *;}"); System.out.println("}"); System.out.println(""); System.out.println(""); System.out.println("Main {"); System.out.println("(" + "@"); System.out.println(" static public void main(String args[]) throws Exception {"); System.out.println(""); System.out.println(" " + this.get_classDefName() + " object = " + this.get_classDefName() + ".parse(System.in);"); System.out.println(""); System.out.println(" object.g_displayAsTree();"); System.out.println(" }"); System.out.println("@"+")"); System.out.println("}"); System.out.println(""); System.out.println(""); System.out.println("TreeDisplayVisitor {"); System.out.println("(" + "@"); System.out.println("void spaces() {"); System.out.println(" for(int i=0; i< indent.intValue(); i++)"); System.out.println(" System.out.print(\" \"); }"); System.out.println("@" + ")"); System.out.println(""); System.out.println("(" + "@"); System.out.println("void incr() {"); System.out.println(" this.set_indent(new Integer(this.get_indent().intValue()+3)); } "); System.out.println("@" + ")"); System.out.println(""); System.out.println("(" + "@"); System.out.println("void decr() {"); System.out.println(" this.set_indent(new Integer(this.get_indent().intValue()-3)); } "); System.out.println("@" + ")"); System.out.println(""); } @) before Part (@ partNumber = partNumber + 1; this.set_edgeName(host.getEdgeName()); this.set_edgeClass(host.getEdgeClass()); String startClass = this.get_classDefName().toString(); String edge = this.get_edgeName().toString(); String destClass = this.get_edgeClass().toString(); String termClass = IsClassTerminal(destClass); if(! (startClass.lastIndexOf("Visitor") > 0)) { if(termClass != "") { System.out.println("before " + startClass + " (@" + " spaces(); System.out.println(\": " + startClass + " ( \"); incr(); spaces(); System.out.println(\": " + destClass + " ( \\\"\" + host.get_" + edge + "() + \"\\\" ) )\"); decr(); @" + ")"); System.out.println(""); } else if(termClass == "" && partNumber == 1 && classIsAlt == false) { System.out.println("before " + startClass + " (@" + " spaces(); System.out.println(\": " + startClass + " ( \"); incr(); @" + ")"); System.out.println("after " + startClass + " (@" + " decr(); spaces(); System.out.println(\" ) \"); @" + ")"); System.out.println(""); } } @) before RepetitionClass (@ partNumber = 1; String repClass = this.get_classDefName().toString(); System.out.println("before " + repClass + " (@" + " spaces(); System.out.println(\": " + repClass + " { \"); incr(); @" + ")"); @) after RepetitionClass (@ String repClass = this.get_classDefName().toString(); System.out.println("after " + repClass + " (@" + " decr(); spaces(); System.out.println(\" } \" ); @" + ")"); System.out.println(""); @) before AlternationClass (@ classIsAlt = true; @) before Syntax (@ syntaxIsIn = true; @) after ClassDef (@ String syntaxClass = this.get_classDefName().toString(); if(syntaxIsIn == true && partNumber == 0) { System.out.println("before " + syntaxClass + " (@" + " spaces(); System.out.println(\": " + syntaxClass + " ( )\"); @" + ")"); System.out.println(""); } @) } ClassSpec { traversal ClassSpecTraversal(ClassSpecNameVisitor v) { to ClassName; } (@ Ident getName() { ClassSpecNameVisitor csv = new ClassSpecNameVisitor(); this.ClassSpecTraversal(csv); return csv.get_name(); } @) } ClassSpecNameVisitor { before ClassName (@ this.set_name(host.get_name()); @) } ClassDef { traversal ClassDefTraversal(ClassDefNameVisitor v) { bypassing { ClassParts, -> *,parameters,* } to ClassName; } (@ Ident getName() { ClassDefNameVisitor cdv = new ClassDefNameVisitor(); this.ClassDefTraversal(cdv); return cdv.get_name(); } @) } ClassDefNameVisitor { before ClassName (@ this.set_name(host.get_name()); @) } Part { traversal EdgeNameTraversal(EdgeNameVisitor v) { to EdgeName; } (@ Ident getName() { EdgeNameVisitor env = new EdgeNameVisitor(); this.EdgeNameTraversal(env); return env.get_name(); } @) (@ String getEdgeName() { String edgeName; if(this.getName() != null) { edgeName = this.getName().toString(); } else { edgeName = this.get_classspec().getName().toString().toLowerCase(); } return edgeName; } @) traversal EdgeClassTraversal(EdgeClassVisitor v) { to ClassName; } (@ Ident getEdgeClass() { EdgeClassVisitor ecv = new EdgeClassVisitor(); this.EdgeClassTraversal(ecv); return ecv.get_name(); } @) } EdgeNameVisitor { before EdgeName (@ this.set_name(host.get_name()); @) } EdgeClassVisitor { before ClassName (@ this.set_name(host.get_name()); @) }