Skip to content
Snippets Groups Projects
Commit 6ce01a12 authored by Anders Nilsson's avatar Anders Nilsson
Browse files

Generation of JavaCC grammar maybe soon works. Must fix abstract

grammar generation before it can be tested though.
parent 01e91f86
No related branches found
No related tags found
No related merge requests found
...@@ -5,3 +5,4 @@ x3d/GeneratedAspects.jrag ...@@ -5,3 +5,4 @@ x3d/GeneratedAspects.jrag
x3d/Parser.java x3d/Parser.java
x3d/x3d.ast x3d/x3d.ast
x3d/x3d.jjt x3d/x3d.jjt
javadoc
...@@ -67,6 +67,7 @@ aspect GenJavaCC { ...@@ -67,6 +67,7 @@ aspect GenJavaCC {
public void Start.genJavaCC(PrintStream pStream) { public void Start.genJavaCC(PrintStream pStream) {
genJavaCCHeader(pStream); genJavaCCHeader(pStream);
genJavaCCTokens(pStream);
genJavaCCLiterals(pStream); genJavaCCLiterals(pStream);
genJavaCCIdentifiers(pStream); genJavaCCIdentifiers(pStream);
genJavaCCSeparators(pStream); genJavaCCSeparators(pStream);
...@@ -98,41 +99,176 @@ aspect GenJavaCC { ...@@ -98,41 +99,176 @@ aspect GenJavaCC {
pStream.println(" (Attribute())*"); pStream.println(" (Attribute())*");
pStream.println("}"); pStream.println("}");
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("void Element() : {}");
pStream.println("{"); pStream.println("{");
ListIterator<Element> iter = elementTypes().listIterator(); pStream.println(" \"<\"");
while (iter.hasNext) { Iterator iter = elementTypes().values().iterator();
pStream.println(" "+iter.next().name()+"()"); 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("}");
pStream.println(); pStream.println();
pStream.println("void Attribute() : {}"); pStream.println("void Attribute() : {}");
pStream.println("{"); 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(" ");
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) { void XsElement.genJavaCC(PrintStream pStream) {
String name = getName(); if (hasName()) { // If not, it's just a reference to an element declaration
pStream.println("void "+name+"() #"+name+" : {}"); String name = name();
pStream.println("{"); pStream.println("void "+name+"() #"+name+" : {}");
pStream.println(" \"<\" <"+name.toUpperCase()+"> AttributeList() \">\""); pStream.println("{");
pStream.println(" ElementList()");
pStream.println(" \"</\" <"+name.toUpperCase()+"> \">\""); pStream.println(" <"+name+"> AttributeList() \">\"");
pStream.println("}"); // 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 { aspect Types {
syn LinkedList<XsElement> Element.elementTypes() { Hashtable Start.elementTypes() {
return l; 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 { // aspect GenAspects {
// public void Start.genAspects(PrintStream pStream) { // public void Start.genAspects(PrintStream pStream) {
// pStream.println(); // pStream.println();
...@@ -382,7 +518,7 @@ aspect ParserGen { ...@@ -382,7 +518,7 @@ aspect ParserGen {
pStream.println("import java.io.InputStreamReader;"); pStream.println("import java.io.InputStreamReader;");
pStream.println("import java.io.Reader;"); pStream.println("import java.io.Reader;");
pStream.println(""); pStream.println("");
pStream.println("import AST.X3dParser;"); pStream.println("import AST.XmlParser;");
pStream.println("import AST.ParseException;"); pStream.println("import AST.ParseException;");
pStream.println("import AST.Start;"); pStream.println("import AST.Start;");
pStream.println(""); pStream.println("");
...@@ -392,7 +528,7 @@ aspect ParserGen { ...@@ -392,7 +528,7 @@ aspect ParserGen {
pStream.println(" Reader r = getReader(args);"); pStream.println(" Reader r = getReader(args);");
pStream.println(" Start ast = null;"); pStream.println(" Start ast = null;");
pStream.println(" try {"); pStream.println(" try {");
pStream.println(" SiarasParser parser = new SiarasParser(r);"); pStream.println(" XmlParser parser = new XmlParser(r);");
pStream.println(); pStream.println();
pStream.println(" ast = parser.Start();"); pStream.println(" ast = parser.Start();");
pStream.println(" } catch (ParseException e) {"); pStream.println(" } catch (ParseException e) {");
......
...@@ -17,29 +17,8 @@ aspect PrettyPrinter { ...@@ -17,29 +17,8 @@ aspect PrettyPrinter {
public void XsElement.prettyPrint(String ind, PrintStream pStream) { public void XsElement.prettyPrint(String ind, PrintStream pStream) {
if (hasName()) { 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;
}
}
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
<property name="javacc.home" value="../tools/javacc-4.0"/> <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 --> <!-- "jflex" is an ant task class for the scanner generator in JFlex.jar -->
<!-- <taskdef name="jflex" classname="JFlex.anttask.JFlexTask" classpath="tools/JFlex.jar"/> --> <!-- <taskdef name="jflex" classname="JFlex.anttask.JFlexTask" classpath="tools/JFlex.jar"/> -->
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment