Skip to content
Snippets Groups Projects
CompilerGeneration.jrag 30.10 KiB
/* -*-Java-*- */

/* 
 * Copyright (C) 2007  Anders Nilsson <anders.nilsson@cs.lth.se>
 *
 * This file is part of XmlSchemaCompiler.
 */

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 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("abstract SimpleElement : Element;");
		pStream.println("StringElement : SimpleElement ::= <LITERAL>;");
		pStream.println("IntElement : SimpleElement ::= <LITERAL>;");
		pStream.println("FloatElement : SimpleElement ::= <LITERAL>;");
		pStream.println("Attribute ::= AttrValue;");
		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.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 ::= ;");
        }
    }


}

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("  (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(" )) ");
        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 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("  ");
        pStream.println("}");
        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) {
        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.println("   <"+name+"> AttributeList() \">\"");
//             pStream.println("  \"<\" <"+name+"> AttributeList() \">\"");
//             pStream.println("  ElementList()");
            pStream.print("  ( <GT> ElementList()");
            pStream.println("  \"</\" <"+name+">  \">\" | ElementList() \"/>\" )");
//             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+"> \"=\" 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, 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",
													"to"};

    static String ASTNode.fixName(String s) {
        if (s.equals("class")) {
            return "clazz";
        }
		if (Arrays.binarySearch(forbiddenNames,s) > -1) {
			s = "_" + s;
		}
        s = s.replace("-","_");
        return s;
    }
}

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);
		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("    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");        

        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());
		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 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 AST.XmlParser;");
		pStream.println("import AST.ParseException;");
		pStream.println("import 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 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("}");

    }
}