-
Anders Nilsson authoredAnders Nilsson authored
CompilerGeneration.jrag 35.85 KiB
/* -*-Java-*- */
/*
* Copyright (C) 2007-2011 Anders Nilsson <anders.nilsson@control.lth.se>
*
* This file is part of XMLSchemaCompiler.
*
* XMLSchemaCompiler is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* XMLSchemaCompiler is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with XMLSchemaCompiler. If not, see <http://www.gnu.org/licenses/>.
*/
import java.io.*;
import java.util.*;
aspect Misc {
private static String ASTNode.grammar = new String();
public static void ASTNode.setGrammar(String s) {
grammar = s;
}
public static String ASTNode.getGrammar() {
return grammar;
}
}
aspect Subclasses {
static int Element.superClassNum = 0;
inh String Element.superClass();
// eq ComplexElement.getElement().superClass();
eq Start.getSpecification().superClass() = "ComplexElement";
// eq XsChoice.getElement(int i).superClass() = "Choice_"+superClassNum;
// eq XsSequence.getElement(int i).superClass() = "Choice_"+superClassNum;
}
aspect AbsGrammarGeneration {
void ASTNode.genAbsGrammar(PrintStream pStream) {
for (int i=0; i<getNumChild(); i++) {
getChild(i).genAbsGrammar(pStream);
}
}
public void Start.genAbsGrammar(PrintStream pStream) {
pStream.println("// -*-Java-*- ");
pStream.println();
pStream.println("// Automatically generated JastAdd abstract grammar file ");
pStream.println("// Predefined types");
pStream.println("Start ::= Specification;");
pStream.println("Specification ::= XmlHeader [DocType] Element*;");
pStream.println("XmlHeader ::= Attribute*;");
pStream.println("DocType ::= <STRING>;");
pStream.println("abstract Thing : ComplexElement ::=;");
pStream.println("abstract Element;");
pStream.println("ComplexElement : Element ::= Attribute* Element*;");
pStream.println("ValueElement : ComplexElement;");
pStream.println("__DefaultElement__ : ComplexElement ::= <TAG>;");
pStream.println("abstract SimpleElement : Element;");
pStream.println("StringElement : SimpleElement ::= <LITERAL>;");
pStream.println("IntElement : SimpleElement ::= <LITERAL>;");
pStream.println("FloatElement : SimpleElement ::= <LITERAL>;");
pStream.println("Attribute ::= AttrValue;");
pStream.println("__DefaultAttribute__ : Attribute ::= <NAME>;");
pStream.println("AttrValue ::= <LITERAL>;");
pStream.println("Encoding : Attribute ::=;");
pStream.println("Version : Attribute ::=;");
pStream.println("XmlnsXsi : Attribute ::=;");
pStream.println("XsiNoNamespaceSchemaLocation : Attribute ::=;");
pStream.println();
pStream.println("// Generated types");
// 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 = fixName(name());
pStream.print(name + " : "+superClass()+" ::= ");
// for (Element e : getElements()) {
// e.genAbsGrammarNTA(pStream);
// }
pStream.println(";");
}
}
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 ::= ;");
}
}
}
aspect GenJavaCC {
void ASTNode.genJavaCC(PrintStream pStream) {
for (int i=0; i<getNumChild(); i++) {
getChild(i).genJavaCC(pStream);
}
}
public void Start.genJavaCC(PrintStream pStream) {
genJavaCCHeader(pStream);
genJavaCCTokens(pStream);
genJavaCCLiterals(pStream);
genJavaCCIdentifiers(pStream);
genJavaCCSeparators(pStream);
genJavaCCOperators(pStream);
pStream.println("Start Start() #Start : {}");
pStream.println("{");
pStream.println(" Specification()");
pStream.println(" { return jjtThis; }");
pStream.println("}");
pStream.println();
pStream.println("void Specification() #Specification : {}");
pStream.println("{");
pStream.println(" XmlHeader()");
pStream.println(" ( [DocType()] ) #Opt(true)");
pStream.println(" ElementList()");
pStream.println("}");
pStream.println();
pStream.println("void DocType() #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 != LTSLASH) {");
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(" s.append(\" \");");
pStream.println(" }");
pStream.println(" return s.toString();");
pStream.println("}");
pStream.println();
pStream.println("void XmlHeader() #XmlHeader : {}");
pStream.println("{");
pStream.println(" <LTQ> <XML> AttributeList() <QGT>");
pStream.println("}");
pStream.println();
pStream.println("void ElementList() #List : {}");
pStream.println("{");
pStream.println(" (Element())*");
pStream.println("}");
pStream.println();
pStream.println("void AttributeList() #List : {}");
pStream.println("{");
pStream.println(" (LOOKAHEAD(2) Attribute())*");
pStream.println("}");
pStream.println();
pStream.println("void AttrValue() #AttrValue : { Token t; }");
pStream.println("{");
pStream.println(" t = <STRING_LITERAL>");
pStream.println(" {jjtThis.setLITERAL(t.image);}");
pStream.println("}");
pStream.println();
pStream.println("void Encoding() #Encoding : {}");
pStream.println("{");
pStream.println(" <encoding> \"=\" AttrValue()");
pStream.println("}");
pStream.println();
pStream.println("void Version() #Version : {}");
pStream.println("{");
pStream.println(" <version> \"=\" AttrValue()");
pStream.println("}");
pStream.println();
pStream.println("void XsiNoNamespaceSchemaLocation() #XsiNoNamespaceSchemaLocation : {}");
pStream.println("{");
pStream.println(" <XsiNoNamespaceSchemaLocation> \"=\" AttrValue()");
pStream.println("}");
pStream.println();
pStream.println("void XmlnsXsi() #XmlnsXsi : {}");
pStream.println("{");
pStream.println(" <XmlnsXsi> \"=\" AttrValue()");
pStream.println("}");
pStream.println();
pStream.println("void Element() : {}");
pStream.println("{");
pStream.println(" ( <LT> (");
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(" | __DefaultElement__() ");
pStream.println(" )) ");
pStream.println(" | SimpleElement()");
pStream.println("}");
pStream.println();
pStream.println("void SimpleElement() : {}");
pStream.println("{");
pStream.println(" IntElement()");
pStream.println(" | FloatElement()");
pStream.println(" | StringElement()");
pStream.println("}");
pStream.println();
pStream.println("void IntElement() #IntElement : { Token t; }");
pStream.println("{");
pStream.println(" t = <INTEGER_LITERAL>");
pStream.println(" {jjtThis.setLITERAL(t.image);}");
pStream.println("}");
pStream.println();
pStream.println("void FloatElement() #FloatElement : { Token t; }");
pStream.println("{");
pStream.println(" t = <FLOAT_LITERAL>");
pStream.println(" {jjtThis.setLITERAL(t.image);}");
pStream.println("}");
pStream.println();
pStream.println("void StringElement() #StringElement : { Token t;String s; }");
pStream.println("{");
pStream.println(" t = <IDENTIFIER>");
pStream.println(" {");
pStream.println(" s = t.image;");
pStream.println(" if (getToken(1).kind != GT ) {");
pStream.println(" s += getData();");
pStream.println(" }");
pStream.println(" }");
pStream.println(" {jjtThis.setLITERAL(s);}");
pStream.println("}");
pStream.println("void __DefaultElement__() #__DefaultElement__ : { Token t; }");
pStream.println("{");
pStream.println(" t = <IDENTIFIER> AttributeList()");
pStream.println(" (\">\" ElementList() \"</\" <IDENTIFIER> \">\" | ElementList() \"/>\")");
pStream.println(" {jjtThis.setTAG(t.image);}");
pStream.println("}");
pStream.println("void Attribute() : {}");
pStream.println("{");
pStream.println(" Encoding()");
pStream.println(" | Version()");
pStream.println(" | XsiNoNamespaceSchemaLocation()");
pStream.println(" | XmlnsXsi()");
iter = attributeTypes().values().iterator();
while (iter.hasNext()) {
pStream.println(" | "+fixName(((XsAttribute) iter.next()).name())+"()");
}
pStream.println(" | __DefaultAttribute__() ");
pStream.println(" ");
pStream.println("}");
pStream.println();
pStream.println("void __DefaultAttribute__() # __DefaultAttribute__ : {Token t;}");
pStream.println("{");
pStream.println(" t=<IDENTIFIER> \"=\" AttrValue()");
pStream.println(" {jjtThis.setNAME(t.image);}");
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);
}
}
void XsElement.genJavaCC(PrintStream pStream) {
if (hasName()) { // If not, it's just a reference to an element declaration
String name = fixName(name());
pStream.println("void "+name+"() #"+name+" : {}");
pStream.println("{");
pStream.println(" <"+name+"> AttributeList()");
pStream.print(" ( <GT> ElementList()");
pStream.println(" \"</\" <"+name+"> \">\" | ElementList() \"/>\" )");
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+"> \"=\" AttrValue()");
pStream.println("}");
}
}
void Start.genJavaCCTokens(PrintStream pStream) {
pStream.println("<DEFAULT> TOKEN : /* Reserved Words */");
pStream.println("{");
Hashtable h = elementTypes();
h.putAll(attributeTypes());
Iterator iter = h.values().iterator();
pStream.println(" <XML\t\t: \"xml\">");
pStream.println(" | <DOCTYPE : \"DOCTYPE\">");
pStream.println(" | <PUBLIC : \"PUBLIC\">");
pStream.println(" | <encoding\t\t: \"encoding\">");
pStream.println(" | <version\t\t: \"version\">");
pStream.println(" | <XsiNoNamespaceSchemaLocation\t\t: \"xsi:noNamespaceSchemaLocation\">");
pStream.println(" | <XmlnsXsi\t\t: \"xmlns:xsi\">");
while (iter.hasNext()) {
String name = ((ComplexElement) iter.next()).name();
pStream.println(" | <"+fixName(name)+
"\t\t: \""+name+"\" >");
}
pStream.println("}// Reserved Words");
pStream.println();
}
}
aspect Types {
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() && !defaultAttr()) {
h.put(name(),this);
}
super.attributeTypes(h);
return h;
}
}
aspect Misc {
static String XsAttribute.defAttrs[] = {"version"};
syn boolean XsAttribute.defaultAttr() {
String name = name();
for (int i=0; i<defAttrs.length; i++) {
if (name.equals(defAttrs[i])) {
return true;
}
}
return false;
}
syn lazy String ComplexElement.name() {
for (int i=0; i<getNumAttribute(); i++) {
if (getAttribute(i) instanceof Name) {
return getAttribute(i).getAttValue().getSTRING_LITERAL().
replace("\""," ").trim();
}
}
// Ok, let's check for "ref" instead
for (int i=0; i<getNumAttribute(); i++) {
if (getAttribute(i) instanceof Ref) {
return getAttribute(i).getAttValue().getSTRING_LITERAL().
replace("\""," ").trim();
}
}
// OK, no name found so let's report that
return "NoNameFound";
}
syn lazy 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 final String[] ASTNode.forbiddenNames = {"Attribute",
"else",
"final",
"if",
"to"};
static ArrayList<String> ASTNode.problemNames = new ArrayList();
static HashSet<String> ASTNode.registeredNames = new HashSet();
static String ASTNode.fixName(String s) {
// if (s.equals("class")) {
// return "clazz";
// }
// if (problemNames.contains(s)) {
s = "_" + s;
// }
s = s.replace("-","_").replace(":","");
return s;
}
public void ASTNode.registerProblematicNames() {
for (ASTNode child : this) {
child.registerProblematicNames();
}
}
public void Start.registerProblematicNames() {
for (int i=0; i<forbiddenNames.length; i++) {
problemNames.add(forbiddenNames[i]);
}
super.registerProblematicNames();
}
public void XsElement.registerProblematicNames() {
if (!registeredNames.add(name().toLowerCase())) {
problemNames.add(name());
}
super.registerProblematicNames();
}
public void XsAttribute.registerProblematicNames() {
if (!registeredNames.add(name().toLowerCase())) {
problemNames.add(name());
}
}
}
aspect GenAspects {
public void Start.genAspects(PrintStream pStream) {
pStream.println("/* -*-Java-*- */");
pStream.println();
pStream.println("// Automatically generated JastAdd aspects file ");
pStream.println();
pStream.println("import java.io.PrintStream;");
pStream.println();
// genRewrites(pStream);
// genMisc(pStream);
genNTA(pStream);
genPrettyPrinter(pStream);
}
}
aspect NTA {
void ASTNode.genNTA(PrintStream pStream) {}
void Start.genNTA(PrintStream pStream) {
pStream.println("aspect NTA {");
getSpecification().getXsSchema().genNTA(pStream);
pStream.println("}");
}
void ComplexElement.genNTA(PrintStream pStream) {
for (Element e : getElements()) {
e.genNTA(pStream);
}
}
void XsElement.genNTA(PrintStream pStream) {
for (Element e : getElements()) {
e.genNTAAttribute(pStream,this);
}
}
void Element.genNTAAttribute(PrintStream pStream,ComplexElement elem) {}
void ComplexElement.genNTAAttribute(PrintStream pStream,ComplexElement elem) {
for (Element e : getElements()) {
e.genNTAAttribute(pStream,elem);
}
}
void XsAttribute.genNTAAttribute(PrintStream pStream,ComplexElement elem) {
pStream.println(" syn nta "+fixName(name())+" "+
fixName(elem.name())+".get"+name()+"() {");
pStream.println(" for (Attribute a : getAttributes()) {");
pStream.println(" if (a instanceof "+fixName(name())+") {");
pStream.println(" return ("+fixName(name())+") a;");
pStream.println(" }");
pStream.println(" }");
pStream.println(" return null;");
pStream.println(" }");
}
void XsElement.genNTAAttribute(PrintStream pStream,ComplexElement elem) {
pStream.println(" syn nta List<"+fixName(name())+"> "+
fixName(elem.name())+".get"+name()+"() {");
pStream.println(" List<"+fixName(name())+"> l = new List<"+
fixName(name())+">();");
pStream.println(" for (Element e : getElements()) {");
pStream.println(" if (e instanceof "+fixName(name())+") {");
pStream.println(" l.add(("+fixName(name())+")e);");
pStream.println(" }");
pStream.println(" }");
pStream.println(" return l;");
pStream.println(" }");
}
}
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(" 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(" 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 DocType.prettyPrint(String indent, PrintStream pStream) {");
pStream.println(" pStream.print(\"<!\");");
pStream.println(" pStream.print(getSTRING());");
pStream.println(" pStream.println();");
// Ugly as h*ll, but I don't have the time to fix it right now. AndersN 070914
// pStream.println(" pStream.println(\"> \");");
pStream.println(" }\n");
pStream.println(" public void AttrValue.prettyPrint(String indent, PrintStream pStream) {");
pStream.println(" pStream.print(getLITERAL());");
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");
pStream.println(" public void Version.prettyPrint(String indent, PrintStream pStream) {");
pStream.println(" pStream.print(\" version=\");");
pStream.println(" getAttrValue().prettyPrint(indent,pStream);");
pStream.println(" }\n");
pStream.println(" public void XmlnsXsi.prettyPrint(String indent, PrintStream pStream) {");
pStream.println(" pStream.print(\" xmlns:xsi=\");");
pStream.println(" getAttrValue().prettyPrint(indent,pStream);");
pStream.println(" }\n");
pStream.println(" public void XsiNoNamespaceSchemaLocation.prettyPrint(String indent, PrintStream pStream) {");
pStream.println(" pStream.print(\" xsi:NoNamespaceSchemaLocation=\");");
pStream.println(" getAttrValue().prettyPrint(indent,pStream);");
pStream.println(" }\n");
pStream.println(" public void __DefaultElement__.prettyPrint(String ind, PrintStream pStream) {");
pStream.println(" pStream.print(ind+\"<\"+getTAG()+\" \");");
pStream.println(" for (int i=0; i<getNumAttribute(); i++) {");
pStream.println(" getAttribute(i).prettyPrint(ind,pStream);");
pStream.println(" }");
pStream.println(" if (getNumElement() == 0) {");
pStream.println(" pStream.println(\"/> \");");
pStream.println(" } else {");
pStream.println(" pStream.println(\"> \");");
pStream.println(" String newInd = ind+\" \";");
pStream.println(" for (int i=0; i<getNumElement(); i++) {");
pStream.println(" getElement(i).prettyPrint(newInd,pStream);");
pStream.println(" }");
pStream.println(" pStream.println(ind+\"</\"+getTAG()+\"> \");");
pStream.println(" }");
pStream.println(" }\n");
pStream.println(" public void __DefaultAttribute__.prettyPrint(String indent, PrintStream pStream) {");
pStream.println(" pStream.print(\" \"+getNAME()+\"=\");");
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");
}
public void XsAttribute.genPrettyPrinter(PrintStream pStream) {
// String name = fixName(name());
String name = name();
pStream.println(" public void "+fixName(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());
String name = name();
pStream.println(" public void "+fixName(name)+".prettyPrint(String ind, PrintStream pStream) {");
pStream.println(" pStream.print(ind+\"<"+name+" \");");
pStream.println(" for (int i=0; i<getNumAttribute(); i++) {");
pStream.println(" getAttribute(i).prettyPrint(ind,pStream);");
pStream.println(" }");
pStream.println(" if (getNumElement() == 0) {");
pStream.println(" pStream.println(\"/> \");");
pStream.println(" } else {");
pStream.println(" pStream.println(\"> \");");
pStream.println(" String newInd = ind+\" \";");
pStream.println(" for (int i=0; i<getNumElement(); i++) {");
pStream.println(" getElement(i).prettyPrint(newInd,pStream);");
pStream.println(" }");
pStream.println(" pStream.println(ind+\"</"+name+"> \");");
pStream.println(" }");
pStream.println(" }\n");
}
}
// public void OwlClassDecl.genPrettyPrinter(PrintStream pStream) {
// // Generate prettyprinter for class declaration
// pStream.print(ind(1)+"public void "+name());
// pStream.println(".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("System.out.println(\">\");");
// pStream.println(ind(2)+"String childIndent = indent + \" \";");
// // Restrictions restr = getRestrictions();
// // for (int i=0; i<restr.getNumOwlRestriction(); i++) {
// // OwlRestriction r = restr.getOwlRestriction(i);
// // pStream.println(ind(2)+"System.out.println(childIndent+\"<has"+
// // r.name()+">\");");
// // pStream.println(ind(2)+"for (int i=0; i<getNum"+r.name()+"(); i++) {");
// // pStream.println(ind(3)+"get"+r.name()+
// // "(i).prettyPrint(childIndent+\" \",pStream);");
// // pStream.println(ind(2)+"}");
// // pStream.println(ind(2)+"System.out.println(childIndent+\"</has"+
// // r.name()+">\");");
// // }
// pStream.println(ind(2)+"for (int i=0; i<getNumElement(); i++) {");
// pStream.println(ind(3)+"getElement(i).prettyPrint(childIndent,pStream);");
// pStream.println(ind(2)+"}");
// pStream.println(ind(1)+"System.out.println(indent+\"</"+name()+">\");");
// pStream.println(ind(1)+"}\n");
// }
// }
// aspect GenRewrites {
// public void ASTNode.genRewrites(PrintStream pStream) {
// for (int i=0; i<getNumChild(); i++) {
// getChild(i).genRewrites(pStream);
// }
// }
// public void Start.genRewrites(PrintStream pStream) {
// pStream.println();
// pStream.println("aspect Rewrites {");
// pStream.println(ind(1)+"rewrite ComplexElement {");
// pStream.println(ind(2)+"when (!(this instanceof ClassUse) && getOwlIdentifier().getIDENTIFIER().equals(\"value\") && !(this instanceof ValueElement))");
// pStream.println(ind(3)+"to ValueElement {");
// pStream.println(ind(3)+"ValueElement node = new ValueElement();");
// pStream.println(ind(3)+"node.setOwlIdentifier(getOwlIdentifier());");
// pStream.println(ind(3)+"node.setAttributeList(getAttributeList());");
// pStream.println(ind(3)+"node.setElementList(getElementList());");
// pStream.println(ind(3)+"return node;");
// pStream.println(ind(2)+"}");
// pStream.println(ind(1)+"}");
// // TEMPORARY!!!!!
// // Rewrite isSkillOf/hasSkill/hasProperty/isPropertyOf to ClassUse
// pStream.println(ind(1)+"rewrite ComplexElement {");
// pStream.println(ind(2)+"when ((name().equals(\"hasSkill\")");
// pStream.println(ind(2)+"|| name().equals(\"isSkillOf\"))");
// pStream.println("&& getNumAttribute() > 0 && getAttribute(0) instanceof RdfResource)");
// pStream.println(ind(2)+"to ClassUse {");
// pStream.println(ind(3)+"ClassUse use = new ClassUse();");
// pStream.println(ind(3)+"String att = getAttribute(0).name();");
// pStream.println(ind(3)+"use.setOwlIdentifier(new OwlIdentifier(att.substring(att.indexOf('#')+1,att.indexOf('_'))));");
// pStream.println(ind(3)+"use.setAttributeList(getAttributeList());");
// pStream.println(ind(3)+"use.setElementList(new List());");
// pStream.println(ind(3)+"return use;");
// pStream.println(ind(2)+"}");
// pStream.println(ind(1)+"}");
// super.genRewrites(pStream);
// pStream.println("}");
// }
// public void OwlClassDecl.genRewrites(PrintStream pStream) {
// String ind = " ";
// int ix = 0;
// // Specialize ComplexElements to the actual class in the ontology
// pStream.println(ind(1)+"rewrite ComplexElement {");
// pStream.println(ind(2)+"when (!(this instanceof ClassUse) && getOwlIdentifier().getIDENTIFIER().equals(\""+
// name()+"\") && !(this instanceof Thing))");
// pStream.println(ind(3)+"to "+name()+" {");
// pStream.println(ind(3)+name()+" node = new "+name()+"();");
// pStream.println(ind(3)+"node.setOwlIdentifier(getOwlIdentifier());");
// pStream.println(ind(3)+"node.setAttributeList(getAttributeList());");
// pStream.println(ind(3)+"node.setElementList(getElementList());");
// // Restrictions restr = getRestrictions();
// // pStream.println(ind(3)+"List l, remain;");
// // pStream.println(ind(3)+"remain = new List();");
// // for (int i=0; i<restr.getNumOwlRestriction(); i++) {
// // OwlRestriction r = restr.getOwlRestriction(i);
// // pStream.println(ind(3)+"l = new List();");
// // pStream.println(ind(3)+"for (int i=0; i<getNumElement(); i++) {");
// // pStream.println(ind(4)+"ComplexElement e = (ComplexElement) getElement(i);");
// // pStream.println(ind(4)+"if (e.getNumElement() > 0 && e.getElement(0) instanceof "+r.name()+" ) {");
// // pStream.println(ind(5)+"l.add(e.getElement(0));");
// // pStream.println(ind(4)+"}");
// // pStream.println(ind(3)+"}");
// // if (r.allValuesFrom()) {
// // pStream.println(ind(3)+"node.set"+r.name()+"List(l);");
// // } else {
// // pStream.println(ind(3)+r.name()+" c"+ix+" = new "+r.name()+"();");
// // pStream.println(ind(3)+"node.set"+r.name()+"(c"+(ix++)+");");
// // }
// // }
// // pStream.println(ind(3)+"for (int i=0; i<getNumElement(); i++) {");
// // pStream.println(ind(4)+"if (getElement(i) instanceof ValueElement) {");
// // pStream.println(ind(5)+"remain.add(getElement(i));");
// // pStream.println(ind(4)+"}");
// // pStream.println(ind(3)+"}");
// // pStream.println(ind(3)+"node.setElementList(remain);");
// pStream.println(ind(3)+"return node;");
// pStream.println(ind(2)+"}");
// pStream.println(ind(1)+"}");
// pStream.println();
// // Rearrange device nodes on the AST to get away from the
// // current diagonal style from Protege
// pStream.println(ind(1)+"rewrite "+name()+" {");
// pStream.println(ind(2)+"when (!isTopElement())");
// pStream.println(ind(2)+"to ClassUse {");
// pStream.println(ind(3)+"ClassUse use = new ClassUse();");
// pStream.println(ind(3)+"use.setOwlIdentifier(new OwlIdentifier(\""+name()+"\"));");
// pStream.println(ind(3)+"use.setAttributeList(new List().add(new RdfResource(getAttribute(0).getValue())));");
// pStream.println(ind(3)+"use.setElementList(new List());");
// pStream.println(ind(3)+"getStart().addElement(this);");
// pStream.println(ind(3)+"return use;");
// pStream.println(ind(2)+"}");
// pStream.println(ind(1)+"}");
// }
// }
// aspect GenMisc {
// public void ASTNode.genMisc(PrintStream pStream) {
// for (int i=0; i<getNumChild(); i++) {
// getChild(i).genMisc(pStream);
// }
// }
// public void Start.genMisc(PrintStream pStream) {
// pStream.println();
// pStream.println("aspect Misc {");
// pStream.println();
// pStream.println(ind(1)+"String ValueElement.value() {");
// pStream.println(ind(2)+"StringBuffer b = new StringBuffer();");
// pStream.println(ind(2)+"for (int i=0; i<getNumElement(); i++) {");
// pStream.println(ind(3)+"b.append(((SimpleElement) getElement(i)).value());");
// pStream.println(ind(3)+"b.append(\" \");");
// pStream.println(ind(2)+"}");
// pStream.println(ind(2)+"return b.toString().trim();");
// pStream.println(ind(1)+"}");
// pStream.println();
// pStream.println(ind(1)+"syn String SimpleElement.value() = \"\";");
// pStream.println(ind(1)+"eq StringElement.value() = getIDENTIFIER();");
// pStream.println(ind(1)+"eq IntElement.value() = getINTEGER_LITERAL();");
// pStream.println(ind(1)+"eq FloatElement.value() = getFLOAT_LITERAL();");
// pStream.println(ind(1)+"boolean Thing.isTopElement() {");
// pStream.println(ind(2)+"return getParent().getParent() instanceof Start;");
// pStream.println(ind(1)+"}");
// pStream.println(ind(1)+"Start ASTNode.getStart() {");
// pStream.println(ind(2)+"return getParent().getStart();");
// pStream.println(ind(1)+"}");
// pStream.println(ind(1)+"Start Start.getStart() {");
// pStream.println(ind(2)+"return this;");
// pStream.println(ind(1)+"}");
// pStream.println(ind(1)+"String ComplexElement.name() {");
// pStream.println(ind(2)+"return getOwlIdentifier().getIDENTIFIER();");
// pStream.println(ind(1)+"}");
// pStream.println(ind(1)+"String Attribute.name() {");
// pStream.println(ind(2)+"return getValue().getSTRING_LITERAL();");
// pStream.println(ind(1)+"}");
// super.genMisc(pStream);
// pStream.println("}");
// }
// }
aspect ParserGen {
public void Start.genParser(PrintStream pStream) {
pStream.println("import java.io.FileNotFoundException;");
pStream.println("import java.io.FileReader;");
pStream.println("import java.io.InputStreamReader;");
pStream.println("import java.io.Reader;");
pStream.println("");
pStream.println("import "+getGrammar()+"AST.XmlParser;");
pStream.println("import "+getGrammar()+"AST.ParseException;");
pStream.println("import "+getGrammar()+"AST.Start;");
pStream.println("");
pStream.println("public class Parser {");
pStream.println();
pStream.println(" protected static Start parse(String args[]) {");
pStream.println(" Reader r = getReader(args);");
pStream.println(" Start ast = null;");
pStream.println(" try {");
pStream.println(" XmlParser parser = new XmlParser(r);");
pStream.println();
pStream.println(" ast = parser.Start();");
pStream.println(" } catch (ParseException e) {");
pStream.println(" System.out.println(e.getMessage());");
pStream.println(" }");
pStream.println(" return ast;");
pStream.println(" }");
pStream.println();
pStream.println(" private static Reader getReader(String[] args) {");
pStream.println(" Reader r = null;");
pStream.println(" if (args.length != 1) {");
pStream.println(" r = new InputStreamReader(System.in);");
pStream.println(" } else {");
pStream.println(" try {");
pStream.println(" r = new FileReader(args[0]);");
pStream.println(" } catch (FileNotFoundException e1) {");
pStream.println(" System.err.println(\"Dumper: file \" + args[0] + \" not found\");");
pStream.println(" }");
pStream.println(" }");
pStream.println(" return r;");
pStream.println(" }");
pStream.println("}");
}
public void Start.genPrettyPrint(PrintStream pStream) {
pStream.println("import "+getGrammar()+"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(" ast.dumpTree(\" \", System.out);");
pStream.println(" }");
pStream.println("}");
}
}