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
Branches
No related tags found
No related merge requests found
......@@ -5,3 +5,4 @@ x3d/GeneratedAspects.jrag
x3d/Parser.java
x3d/x3d.ast
x3d/x3d.jjt
javadoc
......@@ -67,6 +67,7 @@ aspect GenJavaCC {
public void Start.genJavaCC(PrintStream pStream) {
genJavaCCHeader(pStream);
genJavaCCTokens(pStream);
genJavaCCLiterals(pStream);
genJavaCCIdentifiers(pStream);
genJavaCCSeparators(pStream);
......@@ -98,40 +99,175 @@ 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();
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.toUpperCase()+"> AttributeList() \">\"");
pStream.println(" <"+name+"> AttributeList() \">\"");
// pStream.println(" \"<\" <"+name+"> AttributeList() \">\"");
pStream.println(" ElementList()");
pStream.println(" \"</\" <"+name.toUpperCase()+"> \">\"");
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) {
......@@ -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) {");
......
......@@ -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;
}
}
......@@ -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"/> -->
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment