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

Can now generate a running X3D parser. Pity it doesn't work yet, the prettyprinter at least.

parent 6ce01a12
No related branches found
No related tags found
No related merge requests found
......@@ -6,3 +6,4 @@ x3d/Parser.java
x3d/x3d.ast
x3d/x3d.jjt
javadoc
x3d/PrettyPrint.java
......@@ -19,18 +19,21 @@ aspect AbsGrammarGeneration {
public void Start.genAbsGrammar(PrintStream pStream) {
pStream.println("// Predefined types");
pStream.println("Start ::= Specification;");
// pStream.println("Specification ::= XmlHeader [DocType] Element*;");
pStream.println("Specification ::= XmlHeader Element*;");
pStream.println("XmlHeader ::=;");
pStream.println("XmlHeader ::= Attribute*;");
pStream.println("DocType ::= ;");
pStream.println("abstract Thing : ComplexElement ::=;");
pStream.println("abstract Element;");
pStream.println("ComplexElement : Element ::= OwlIdentifier Attribute* Element*;");
// pStream.println("ComplexElement : Element ::= OwlIdentifier Attribute* Element*;");
pStream.println("ComplexElement : Element ::= Attribute* Element*;");
pStream.println("ValueElement : ComplexElement;");
pStream.println("abstract SimpleElement : Element;");
pStream.println("StringElement : SimpleElement ::= <IDENTIFIER>;");
pStream.println("IntElement : SimpleElement ::= <INTEGER_LITERAL>;");
pStream.println("FloatElement : SimpleElement ::= <FLOAT_LITERAL>;");
// pStream.println("ClassUse : Thing ::= /decl:Thing/;");
pStream.println("Attribute ::= Value;");
pStream.println("Attribute ::= AttrValue;");
// pStream.println("RdfDatatype : Attribute ::= ;");
// pStream.println("RdfId : Attribute ::= ;");
// pStream.println("Xmlns : Attribute ::= ;");
......@@ -47,12 +50,37 @@ aspect AbsGrammarGeneration {
// pStream.println("RdfAbout : Attribute ::= ;");
// pStream.println("RdfParseType : Attribute ::= ;");
// pStream.println("Version : Attribute ::= ;");
pStream.println("Value ::= <STRING_LITERAL>;");
pStream.println("OwlIdentifier ::= <IDENTIFIER>;");
// pStream.println("Value ::= <STRING_LITERAL>;");
// pStream.println("OwlIdentifier ::= <IDENTIFIER>;");
pStream.println("AttrValue ::= <STRING_LITERAL>;");
pStream.println("Encoding : Attribute ::=;");
pStream.println();
pStream.println("// Generated types");
super.genAbsGrammar(pStream);
// This is somewhat of a hack, but seems to work work as an
// easy way to eliminate duplicate attribute
// declarations. Anders Nilsson 070809.
Hashtable h = elementTypes();
h.putAll(attributeTypes());
Iterator iter = h.values().iterator();
while (iter.hasNext()) {
((ASTNode) iter.next()).genAbsGrammar(pStream);
}
// super.genAbsGrammar(pStream);
}
void XsElement.genAbsGrammar(PrintStream pStream) {
if (hasName()) { // If not, it's just a reference to an element declaration
String name = name();
pStream.println(name + " : ComplexElement ::= ;");
}
}
void XsAttribute.genAbsGrammar(PrintStream pStream) {
if (hasName()) { // If not, it's just a reference to an attribute declaration
String name = fixName(name());
pStream.println(name + " : Attribute ::= ;");
}
}
......@@ -75,18 +103,52 @@ aspect GenJavaCC {
pStream.println("Start Start() #Start : {}");
pStream.println("{");
pStream.println(" Specification()");
pStream.println(" { return jjThis; }");
pStream.println(" { return jjtThis; }");
pStream.println("}");
pStream.println();
pStream.println("void Specification() #Specification : {}");
pStream.println("{");
pStream.println(" XmlHeader()");
pStream.println("// [DocType()]");
pStream.println(" ElementList()");
pStream.println("}");
pStream.println();
pStream.println("void DocType() : {String s;}");
pStream.println("{");
pStream.println(" <LTBANG>");
pStream.println(" {");
pStream.println(" s = new String();");
pStream.println(" if (getToken(1).kind != GT ) {");
pStream.println(" s += getData();");
pStream.println(" } ");
pStream.println(" } ");
pStream.println("// {jjtThis.setSTRING(s);}");
pStream.println("}");
pStream.println();
pStream.println("JAVACODE");
pStream.println("String getData() {");
pStream.println(" StringBuffer s = new StringBuffer();");
pStream.println("// jjtThis.someData = true;");
pStream.println(" while ((getToken(1)).kind != LT && (getToken(1)).kind != GT) {");
pStream.println(" Token t = getNextToken();");
pStream.println(" if (t.specialToken != null) {");
pStream.println(" Token tmp_t = t.specialToken;");
pStream.println(" while (tmp_t.specialToken != null) {");
pStream.println(" tmp_t = tmp_t.specialToken;");
pStream.println(" }");
pStream.println(" while (tmp_t != null) {");
pStream.println(" s.append(tmp_t.image);");
pStream.println(" tmp_t = tmp_t.next;");
pStream.println(" }");
pStream.println(" }");
pStream.println(" s.append(t.image);");
pStream.println(" }");
pStream.println(" return s.toString();");
pStream.println("}");
pStream.println();
pStream.println("void XmlHeader() #XmlHeader : {}");
pStream.println("{");
pStream.println(" \"<?\" <XML> AttributeList() \"?>\"");
pStream.println(" <LTQ> <XML> AttributeList() <QGT>");
pStream.println("}");
pStream.println();
pStream.println("void ElementList() #List : {}");
......@@ -99,11 +161,17 @@ aspect GenJavaCC {
pStream.println(" (Attribute())*");
pStream.println("}");
pStream.println();
pStream.println("void AttValue() #AttValue : { Token t; }");
pStream.println("void AttrValue() #AttrValue : { Token t; }");
pStream.println("{");
pStream.println(" t = <STRING_LITERAL>");
pStream.println(" {jjtThis.setSTRING_LITERAL(t.image);}");
pStream.println("}");
pStream.println();
pStream.println("void Encoding() #Encoding : {}");
pStream.println("{");
pStream.println(" <encoding> \"=\" AttrValue()");
pStream.println("}");
pStream.println();
pStream.println("void Element() : {}");
pStream.println("{");
pStream.println(" \"<\"");
......@@ -119,10 +187,8 @@ aspect GenJavaCC {
pStream.println();
pStream.println("void Attribute() : {}");
pStream.println("{");
pStream.println(" Encoding()");
iter = attributeTypes().values().iterator();
if (iter.hasNext()) {
pStream.println(" "+fixName(((XsAttribute) iter.next()).name())+"()");
}
while (iter.hasNext()) {
pStream.println(" | "+fixName(((XsAttribute) iter.next()).name())+"()");
}
......@@ -164,8 +230,8 @@ aspect GenJavaCC {
String name = fixName(name());
pStream.println("void "+name+"() #"+name+" : {}");
pStream.println("{");
pStream.println(" <"+name+"> \"=\" AttValue()");
// pStream.println(" <"+name.toUpperCase()+"> \"=\" AttValue()");
pStream.println(" <"+name+"> \"=\" AttrValue()");
// pStream.println(" <"+name.toUpperCase()+"> \"=\" AttrValue()");
pStream.println("}");
}
}
......@@ -176,7 +242,10 @@ aspect GenJavaCC {
Hashtable h = elementTypes();
h.putAll(attributeTypes());
Iterator iter = h.values().iterator();
pStream.println(" <XML\t\t: \"XML\">");
pStream.println(" <XML\t\t: \"xml\">");
pStream.println(" | <DOCTYPE : \"DOCTYPE\">");
pStream.println(" | <PUBLIC : \"PUBLIC\">");
pStream.println(" | <encoding\t\t: \"encoding\">");
while (iter.hasNext()) {
String name = ((ComplexElement) iter.next()).name();
pStream.println(" | <"+fixName(name)+
......@@ -269,64 +338,88 @@ aspect Misc {
}
// aspect GenAspects {
// public void Start.genAspects(PrintStream pStream) {
// pStream.println();
// pStream.println("import java.io.PrintStream;");
// pStream.println();
aspect GenAspects {
public void Start.genAspects(PrintStream pStream) {
pStream.println();
pStream.println("import java.io.PrintStream;");
pStream.println();
// genRewrites(pStream);
// genMisc(pStream);
// genPrettyPrinter(pStream);
// }
// }
genPrettyPrinter(pStream);
}
}
// aspect GenPrettyPrinter {
// public void ASTNode.genPrettyPrinter(PrintStream pStream) {
// for (int i=0; i<getNumChild(); i++) {
// getChild(i).genPrettyPrinter(pStream);
// }
// }
aspect GenPrettyPrinter {
public void ASTNode.genPrettyPrinter(PrintStream pStream) {
for (int i=0; i<getNumChild(); i++) {
getChild(i).genPrettyPrinter(pStream);
}
}
// public void Start.genPrettyPrinter(PrintStream pStream) {
// pStream.println();
// pStream.println("aspect PrettyPrinter {");
// pStream.println(" public void ASTNode.prettyPrint(String indent, PrintStream pStream) {");
// pStream.println(" for (int i=0; i<getNumChild(); i++) {");
// pStream.println(" getChild(i).prettyPrint(indent,pStream);");
// pStream.println(" }");
// pStream.println(" }\n");
// pStream.println(" public void Start.prettyPrint(String indent, PrintStream pStream) {");
public void Start.genPrettyPrinter(PrintStream pStream) {
pStream.println();
pStream.println("aspect PrettyPrinter {");
pStream.println(" public void ASTNode.prettyPrint(String indent, PrintStream pStream) {");
pStream.println(" pStream.print(getNumChild());");
pStream.println(" for (int i=0; i<getNumChild(); i++) {");
pStream.println(" pStream.print(getChild(i).getClass());");
pStream.println(" getChild(i).prettyPrint(indent,pStream);");
pStream.println(" }");
pStream.println(" }\n");
// pStream.println(" public void Specification.prettyPrint(String indent, PrintStream pStream) {");
// pStream.println(" getXmlHeader().prettyPrint(indent,pStream);");
// pStream.println(" for (int i=0; i<getNumElement(); i++) {");
// pStream.println(" getElement(i).prettyPrint(indent,pStream);");
// pStream.println(" }");
// pStream.println(" }\n");
// pStream.println(" syn String Attribute.id() = \"\";");
// pStream.println(" eq RdfId.id() = \"Rdf:ID\";");
// pStream.println(" eq RdfDatatype.id() = \"Rdf:datatype\";");
// pStream.println(" eq RdfResource.id() = \"Rdf:resource\";");
// pStream.println(" public void Attribute.prettyPrint(String indent, PrintStream pStream) {");
// pStream.println(" System.out.print(\" \"+id()+\"=\"+getValue().getSTRING_LITERAL());");
// pStream.println(" }\n");
// pStream.println(ind(1)+"public void ValueElement.prettyPrint(String indent, PrintStream pStream) {");
// pStream.println(ind(2)+"System.out.print(indent+\"<value \");");
// pStream.println(ind(2)+"for (int i=0; i<getNumAttribute(); i++) {");
// pStream.println(ind(3)+"getAttribute(i).prettyPrint(indent,pStream);");
// pStream.println(ind(2)+"}");
// pStream.println(ind(2)+"System.out.println(\">\");");
// pStream.println(ind(2)+"System.out.println(indent+\" \"+value());");
// pStream.println(ind(2)+"System.out.println(indent+\"</value>\");");
// pStream.println(ind(1)+"}\n");
// // Generate prettyprinter for ClassUse
// pStream.println(ind(1)+"public void ClassUse.prettyPrint(String indent, PrintStream pStream) {");
// pStream.println(ind(2)+"System.out.print(indent+\"<\"+name());");
// pStream.println(ind(2)+"for (int i=0; i<getNumAttribute(); i++) {");
// pStream.println(ind(3)+"getAttribute(i).prettyPrint(indent,pStream);");
// pStream.println(ind(2)+"}");
// pStream.println(ind(2)+"System.out.println(\"/>\");");
// pStream.println(ind(1)+"}\n");
pStream.println(" public void XmlHeader.prettyPrint(String indent, PrintStream pStream) {");
pStream.println(" pStream.print(\"<?xml \");");
pStream.println(" for (int i=0; i<getNumAttribute(); i++) {");
pStream.println(" getAttribute(i).prettyPrint(indent,pStream);");
pStream.println(" }");
pStream.println(" pStream.println(\"?> \");");
pStream.println(" }\n");
pStream.println(" public void AttrValue.prettyPrint(String indent, PrintStream pStream) {");
pStream.println(" pStream.print(getSTRING_LITERAL());");
pStream.println(" }\n");
pStream.println(" public void Encoding.prettyPrint(String indent, PrintStream pStream) {");
pStream.println(" pStream.print(\" encoding=\");");
pStream.println(" getAttrValue().prettyPrint(indent,pStream);");
pStream.println(" }\n");
Hashtable h = elementTypes();
h.putAll(attributeTypes());
Iterator iter = h.values().iterator();
while (iter.hasNext()) {
((ASTNode) iter.next()).genPrettyPrinter(pStream);
}
// super.genPrettyPrinter(pStream);
// pStream.println("}\n");
// }
pStream.println("}\n");
}
public void XsAttribute.genPrettyPrinter(PrintStream pStream) {
String name = fixName(name());
pStream.println(" public void "+name+".prettyPrint(String indent, PrintStream pStream) {");
pStream.println(" pStream.print(\" "+name()+"=\");");
pStream.println(" getAttrValue().prettyPrint(indent,pStream);");
pStream.println(" }\n");
}
public void XsElement.genPrettyPrinter(PrintStream pStream) {
String name = fixName(name());
pStream.println(" public void "+name+".prettyPrint(String indent, PrintStream pStream) {");
pStream.println(" pStream.print(\"<"+name+" \");");
pStream.println(" for (int i=0; i<getNumAttribute(); i++) {");
pStream.println(" getAttribute(i).prettyPrint(indent,pStream);");
pStream.println(" }");
pStream.println(" pStream.println(\"> \");");
pStream.println(" }\n");
}
}
// public void OwlClassDecl.genPrettyPrinter(PrintStream pStream) {
// // Generate prettyprinter for class declaration
......@@ -552,4 +645,18 @@ aspect ParserGen {
pStream.println(" }");
pStream.println("}");
}
public void Start.genPrettyPrint(PrintStream pStream) {
pStream.println("import AST.Start;");
pStream.println();
pStream.println("public class PrettyPrint extends Parser {");
pStream.println(" public static void main(String args[]) {");
pStream.println(" Start ast = parse(args);");
pStream.println();
pStream.println(" // Dump the AST");
pStream.println(" ast.prettyPrint(\" \", System.out);");
pStream.println(" }");
pStream.println("}");
}
}
......@@ -36,10 +36,15 @@ public class GenCompiler extends Parser {
pStream = new PrintStream(new File(fileName));
ast.genParser(pStream);
// // Generate aspects
// fileName = "x3d/GeneratedAspects.jrag";
// pStream = new PrintStream(new File(fileName));
// ast.genAspects(pStream);
// Generate PrettyPrint.java
fileName = "x3d/PrettyPrint.java";
pStream = new PrintStream(new File(fileName));
ast.genPrettyPrint(pStream);
// Generate aspects
fileName = "x3d/GeneratedAspects.jrag";
pStream = new PrintStream(new File(fileName));
ast.genAspects(pStream);
} catch (java.io.FileNotFoundException e) {
System.out.println("Could not create file: "+fileName);
......
......@@ -163,6 +163,11 @@ aspect JavaCCChunks {
pStream.println(" | < LBRACKET : \"[\" >");
pStream.println(" | < RBRACKET : \"]\" >");
pStream.println(" | < SEMICOLON : \";\" >");
pStream.println(" | < LTBANG : \"<!\" >");
pStream.println(" | < LT : \"<\" >");
pStream.println(" | < LTQ : \"<?\" >");
pStream.println(" | < GT : \">\" >");
pStream.println(" | < QGT : \"?>\" >");
pStream.println("}// SEPARATORS");
}
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment