diff --git a/.bzrignore b/.bzrignore index 9b23f913cd3a2cae9a85ca0a043292b8486e834b..fee425d2685296d46602374e7bbf2cfdd77779b5 100644 --- a/.bzrignore +++ b/.bzrignore @@ -5,3 +5,4 @@ x3d/GeneratedAspects.jrag x3d/Parser.java x3d/x3d.ast x3d/x3d.jjt +javadoc diff --git a/CompilerGeneration.jrag b/CompilerGeneration.jrag index 301db3260de3f2c35af91344e34e1c9bdd36dee3..a38e5e9da2e0a5e3945e462733d9a10342b44e28 100644 --- a/CompilerGeneration.jrag +++ b/CompilerGeneration.jrag @@ -67,6 +67,7 @@ aspect GenJavaCC { public void Start.genJavaCC(PrintStream pStream) { genJavaCCHeader(pStream); + genJavaCCTokens(pStream); genJavaCCLiterals(pStream); genJavaCCIdentifiers(pStream); genJavaCCSeparators(pStream); @@ -98,41 +99,176 @@ aspect GenJavaCC { pStream.println(" (Attribute())*"); pStream.println("}"); pStream.println(); + pStream.println("void AttValue() #AttValue : { Token t; }"); + pStream.println("{"); + pStream.println(" t = <STRING_LITERAL>"); + pStream.println(" {jjtThis.setSTRING_LITERAL(t.image);}"); + pStream.println("}"); pStream.println("void Element() : {}"); pStream.println("{"); - ListIterator<Element> iter = elementTypes().listIterator(); - while (iter.hasNext) { - pStream.println(" "+iter.next().name()+"()"); + pStream.println(" \"<\""); + Iterator iter = elementTypes().values().iterator(); + if (iter.hasNext()) { + pStream.println(" "+fixName(((XsElement) iter.next()).name())+"()"); + } + while (iter.hasNext()) { + pStream.println(" | "+fixName(((XsElement) iter.next()).name())+"()"); } pStream.println(" "); pStream.println("}"); pStream.println(); pStream.println("void Attribute() : {}"); pStream.println("{"); + iter = attributeTypes().values().iterator(); + if (iter.hasNext()) { + pStream.println(" "+fixName(((XsAttribute) iter.next()).name())+"()"); + } + while (iter.hasNext()) { + pStream.println(" | "+fixName(((XsAttribute) iter.next()).name())+"()"); + } pStream.println(" "); pStream.println("}"); - super.genJavaCC(pStream); + pStream.println(); + + // This is somewhat of a hack, but seems to work work as an + // easy way to eliminate duplicate attribute + // declarations. Anders Nilsson 070808. + Hashtable h = elementTypes(); + h.putAll(attributeTypes()); + iter = h.values().iterator(); + while (iter.hasNext()) { + ((ASTNode) iter.next()).genJavaCC(pStream); + } +// super.genJavaCC(pStream); } void XsElement.genJavaCC(PrintStream pStream) { - String name = getName(); - pStream.println("void "+name+"() #"+name+" : {}"); - pStream.println("{"); - pStream.println(" \"<\" <"+name.toUpperCase()+"> AttributeList() \">\""); - pStream.println(" ElementList()"); - pStream.println(" \"</\" <"+name.toUpperCase()+"> \">\""); - pStream.println("}"); + if (hasName()) { // If not, it's just a reference to an element declaration + String name = name(); + pStream.println("void "+name+"() #"+name+" : {}"); + pStream.println("{"); + + pStream.println(" <"+name+"> AttributeList() \">\""); +// pStream.println(" \"<\" <"+name+"> AttributeList() \">\""); + pStream.println(" ElementList()"); + pStream.println(" \"</\" <"+name+"> \">\""); +// pStream.println(" \"<\" <"+name.toUpperCase()+"> AttributeList() \">\""); +// pStream.println(" ElementList()"); +// pStream.println(" \"</\" <"+name.toUpperCase()+"> \">\""); + pStream.println("}"); + } + } + + void XsAttribute.genJavaCC(PrintStream pStream) { + if (hasName()) { // If not, it's just a reference to an attribute declaration + String name = fixName(name()); + pStream.println("void "+name+"() #"+name+" : {}"); + pStream.println("{"); + pStream.println(" <"+name+"> \"=\" AttValue()"); +// pStream.println(" <"+name.toUpperCase()+"> \"=\" AttValue()"); + pStream.println("}"); + } } + void Start.genJavaCCTokens(PrintStream pStream) { + pStream.println("<DEFAULT, BOUNDS> TOKEN : /* Reserved Words */"); + pStream.println("{"); + Hashtable h = elementTypes(); + h.putAll(attributeTypes()); + Iterator iter = h.values().iterator(); + pStream.println(" <XML\t\t: \"XML\">"); + while (iter.hasNext()) { + String name = ((ComplexElement) iter.next()).name(); + pStream.println(" | <"+fixName(name)+ +// pStream.println(" | <"+fixName(name).toUpperCase()+ + "\t\t: \""+name+"\" >"); + } +// iter = attributeTypes().iterator(); +// while (iter.hasNext()) { +// String name = ((ComplexElement) iter.next()).name(); +// pStream.println(" | <"+fixName(name).toUpperCase()+ +// "\t\t: \""+name+"\" >"); +// } + pStream.println("}// Reserved Words"); + pStream.println(); + } } aspect Types { - syn LinkedList<XsElement> Element.elementTypes() { - return l; + Hashtable Start.elementTypes() { + Hashtable h = new Hashtable(); + return elementTypes(h); + } + + syn Hashtable ASTNode.elementTypes(Hashtable h) { + for (int i=0; i<getNumChild(); i++) { + getChild(i).elementTypes(h); + } + return h; + } + + eq XsElement.elementTypes(Hashtable h) { + if (hasName()) { + h.put(name(),this); + } + super.elementTypes(h); + return h; + } + + Hashtable Start.attributeTypes() { + Hashtable h = new Hashtable(); + return attributeTypes(h); + } + + syn Hashtable ASTNode.attributeTypes(Hashtable h) { + for (int i=0; i<getNumChild(); i++) { + getChild(i).attributeTypes(h); + } + return h; + } + + eq XsAttribute.attributeTypes(Hashtable h) { + if (hasName()) { + h.put(name(),this); + } + super.attributeTypes(h); + return h; } } +aspect Misc { + syn String ComplexElement.name() { + for (int i=0; i<getNumAttribute(); i++) { + if (getAttribute(i) instanceof Name) { + return getAttribute(i).getAttValue().getSTRING_LITERAL(). + replace("\""," ").trim(); + } + } + // OK, no name found so let's report that + return "NoNameFound"; + } + + syn boolean ComplexElement.hasName() { + for (int i=0; i<getNumAttribute(); i++) { + if (getAttribute(i) instanceof Name) { + return true; + } + } + // OK, no name found so let's report that + return false; + } + + static String ASTNode.fixName(String s) { + if (s.equals("class")) { + return "clazz"; + } + s = s.replace("-","_"); + return s; + } +} + + // aspect GenAspects { // public void Start.genAspects(PrintStream pStream) { // pStream.println(); @@ -382,7 +518,7 @@ aspect ParserGen { pStream.println("import java.io.InputStreamReader;"); pStream.println("import java.io.Reader;"); pStream.println(""); - pStream.println("import AST.X3dParser;"); + pStream.println("import AST.XmlParser;"); pStream.println("import AST.ParseException;"); pStream.println("import AST.Start;"); pStream.println(""); @@ -392,7 +528,7 @@ aspect ParserGen { pStream.println(" Reader r = getReader(args);"); pStream.println(" Start ast = null;"); pStream.println(" try {"); - pStream.println(" SiarasParser parser = new SiarasParser(r);"); + pStream.println(" XmlParser parser = new XmlParser(r);"); pStream.println(); pStream.println(" ast = parser.Start();"); pStream.println(" } catch (ParseException e) {"); diff --git a/PrettyPrinter.jrag b/PrettyPrinter.jrag index 0951a535912c0364e7a2c575651114743f27b403..94b26a898056258b7d36941bc4423fbb03c42262 100644 --- a/PrettyPrinter.jrag +++ b/PrettyPrinter.jrag @@ -17,29 +17,8 @@ aspect PrettyPrinter { public void XsElement.prettyPrint(String ind, PrintStream pStream) { if (hasName()) { - pStream.println(ind+"Element: "+getName()); + pStream.println(ind+"Element: "+name()); } } } -aspect Misc { - syn String XsElement.getName() { - for (int i=0; i<getNumAttribute(); i++) { - if (getAttribute(i) instanceof Name) { - return getAttribute(i).getAttValue().getSTRING_LITERAL(); - } - } - // OK, no name found so let's report that - return "NoNameFound"; - } - - syn boolean XsElement.hasName() { - for (int i=0; i<getNumAttribute(); i++) { - if (getAttribute(i) instanceof Name) { - return true; - } - } - // OK, no name found so let's report that - return false; - } -} diff --git a/x3d/build.xml b/x3d/build.xml index 763f39333cb363d9f4dff067c3751bfad6634cdf..da1cd828ff607cc558276717aea6731b6bcacdea 100644 --- a/x3d/build.xml +++ b/x3d/build.xml @@ -16,7 +16,7 @@ <property name="javacc.home" value="../tools/javacc-4.0"/> - <property name="parser.name" value="Parser"/> + <property name="parser.name" value="XmlParser"/> <!-- "jflex" is an ant task class for the scanner generator in JFlex.jar --> <!-- <taskdef name="jflex" classname="JFlex.anttask.JFlexTask" classpath="tools/JFlex.jar"/> -->