/* -*-Java-*- */

aspect JavaCCChunks {
	void Start.genJavaCCHeader(PrintStream pStream) {
		pStream.println("options {");
		pStream.println("    MULTI                       = true;");
		pStream.println("    VISITOR                     = true;");
		pStream.println("    NODE_DEFAULT_VOID           = true;");
		pStream.println("    NODE_SCOPE_HOOK             = false;");
		pStream.println("    NODE_PREFIX                 = \"\";");
		pStream.println("    JAVA_UNICODE_ESCAPE         = true;");
		pStream.println("    STATIC                      = false;");
		pStream.println("} ");
		pStream.println();
		pStream.println("PARSER_BEGIN(SiarasParser)");
		pStream.println("    package AST;");
		pStream.println("    public class SiarasParser {");
		pStream.println("}");
		pStream.println("PARSER_END(SiarasParser)");
		pStream.println();
		pStream.println("//----------------------------------------------//");
		pStream.println("//                LEXICAL TOKENS                //");
		pStream.println("//----------------------------------------------//");
		pStream.println("<DEFAULT, BOUNDS> SKIP : /* WHITE SPACE */");
		pStream.println("{");
		pStream.println("    \" \"");
		pStream.println("    |");
		pStream.println("    \"\\t\"");
		pStream.println("    |");
		pStream.println("    \"\\n\"");
		pStream.println("    |");
		pStream.println("    \"\\r\"");
		pStream.println("    |");
		pStream.println("    \"\\f\"");
		pStream.println("}// WHITE SPACE");
		pStream.println();
		pStream.println("SPECIAL_TOKEN : /* COMMENTS */ ");
		pStream.println("{");
		pStream.println("    < \"<!--\" ( ~[\"-\"] | ( \"-\" ~[\"-\"] ) )* \"-->\">");
		pStream.println("  | < \"<rdfs:comment\" ( ~[\"<\"] | ( \"<\" ~[\"/\"] ) )* \"</rdfs:comment>\" >");
		pStream.println("}// COMMENTS");
		pStream.println();
	}

	void Start.genJavaCCLiterals(PrintStream pStream) {
		pStream.println("<DEFAULT, BOUNDS> TOKEN : /* LITERALS */");
		pStream.println("{");
		pStream.println("    < INTEGER_LITERAL:");
		pStream.println("        <DECIMAL_LITERAL> ([\"l\",\"L\"])?");
		pStream.println("        |");
		pStream.println("        <HEX_LITERAL> ([\"l\",\"L\"])?");
		pStream.println("        |");
		pStream.println("        <OCTAL_LITERAL> ([\"l\",\"L\"])?");
		pStream.println("    >");
		pStream.println("    |");
		pStream.println("    < #DECIMAL_LITERAL: [\"1\"-\"9\"] ([\"0\"-\"9\"])* >");
		pStream.println("    |");
		pStream.println("    < #HEX_LITERAL: \"0\" [\"x\",\"X\"] ([\"0\"-\"9\",\"a\"-\"f\",\"A\"-\"F\"])+ >");
		pStream.println("    |");
		pStream.println("    < #OCTAL_LITERAL: \"0\" ([\"0\"-\"7\"])* >");
		pStream.println("    |");
		pStream.println("    < FLOAT_LITERAL:");
		pStream.println("        ([\"0\"-\"9\"])+ \".\" ([\"0\"-\"9\"])* (<EXPONENT>)? ([\"f\",\"F\",\"d\",\"D\"])?");
		pStream.println("        |");
		pStream.println("        \".\" ([\"0\"-\"9\"])+ (<EXPONENT>)? ([\"f\",\"F\",\"d\",\"D\"])?");
		pStream.println("        |");
		pStream.println("        ([\"0\"-\"9\"])+ <EXPONENT> ([\"f\",\"F\",\"d\",\"D\"])?");
		pStream.println("        |");
		pStream.println("        ([\"0\"-\"9\"])+ (<EXPONENT>)? [\"f\",\"F\",\"d\",\"D\"]");
		pStream.println("    >");
		pStream.println("    |");
		pStream.println("    < #EXPONENT: [\"e\",\"E\"] ([\"+\",\"-\"])? ([\"0\"-\"9\"])+ >");
		pStream.println("    |");
		pStream.println("    < CHARACTER_LITERAL:");
		pStream.println("        \"\'\"");
		pStream.println("        (   (~[\"\'\",\"\\\\\",\"\\n\",\"\\r\"])");
		pStream.println("            |");
		pStream.println("            (\"\\\\\"");
		pStream.println("                (   [\"n\",\"t\",\"b\",\"r\",\"f\",\"\\\\\",\"'\",\"\\\"\"]");
		pStream.println("                    |");
		pStream.println("                    [\"0\"-\"7\"] ( [\"0\"-\"7\"] )?");
		pStream.println("                    |");
		pStream.println("                    [\"0\"-\"3\"] [\"0\"-\"7\"] [\"0\"-\"7\"]");
		pStream.println("                )");
		pStream.println("            )");
		pStream.println("        )");
		pStream.println("        \"'\"");
		pStream.println("    >");
		pStream.println("    |");
		pStream.println("    < STRING_LITERAL:");
		pStream.println("        \"\\\"\"");
		pStream.println("        (   (~[\"\\\"\",\"\\\\\",\"\\n\",\"\\r\"])");
		pStream.println("            |");
		pStream.println("            (\"\\\\\"");
		pStream.println("                (    [\"n\",\"t\",\"b\",\"r\",\"f\",\"\\\\\",\"'\",\"\\\"\"]");
		pStream.println("                     |");
		pStream.println("                     [\"0\"-\"7\"] ( [\"0\"-\"7\"] )?");
		pStream.println("                     |");
		pStream.println("                     [\"0\"-\"3\"] [\"0\"-\"7\"] [\"0\"-\"7\"]");
		pStream.println("                )");
		pStream.println("            )");
		pStream.println("        )*");
		pStream.println("        \"\\\"\"");
		pStream.println("    >");
		pStream.println("}// LITERALS");
	}

	void Start.genJavaCCIdentifiers(PrintStream pStream) {
		pStream.println("<DEFAULT, BOUNDS> TOKEN : /* IDENTIFIERS */");
		pStream.println("{");
		pStream.println("    < IDENTIFIER: <LETTER> (<LETTER>|<DIGIT>|\"-\")* >");
		pStream.println("    |");
		pStream.println("    < #LETTER:");
		pStream.println("        [");
		pStream.println("        \"\\u0024\",");
		pStream.println("        \"\\u0041\"-\"\\u005a\",");
		pStream.println("        \"\\u005f\",");
		pStream.println("        \"\\u0061\"-\"\\u007a\",");
		pStream.println("        \"\\u00c0\"-\"\\u00d6\",");
		pStream.println("        \"\\u00d8\"-\"\\u00f6\",");
		pStream.println("        \"\\u00f8\"-\"\\u00ff\",");
		pStream.println("        \"\\u0100\"-\"\\u1fff\",");
		pStream.println("        \"\\u3040\"-\"\\u318f\",");
		pStream.println("        \"\\u3300\"-\"\\u337f\",");
		pStream.println("        \"\\u3400\"-\"\\u3d2d\",");
		pStream.println("        \"\\u4e00\"-\"\\u9fff\",");
		pStream.println("        \"\\uf900\"-\"\\ufaff\"");
		pStream.println("        ]");
		pStream.println("    >");
		pStream.println("    |");
		pStream.println("    < #DIGIT:");
		pStream.println("        [");
		pStream.println("        \"\\u0030\"-\"\\u0039\",");
		pStream.println("        \"\\u0660\"-\"\\u0669\",");
		pStream.println("        \"\\u06f0\"-\"\\u06f9\",");
		pStream.println("        \"\\u0966\"-\"\\u096f\",");
		pStream.println("        \"\\u09e6\"-\"\\u09ef\",");
		pStream.println("        \"\\u0a66\"-\"\\u0a6f\",");
		pStream.println("        \"\\u0ae6\"-\"\\u0aef\",");
		pStream.println("        \"\\u0b66\"-\"\\u0b6f\",");
		pStream.println("        \"\\u0be7\"-\"\\u0bef\",");
		pStream.println("        \"\\u0c66\"-\"\\u0c6f\",");
		pStream.println("        \"\\u0ce6\"-\"\\u0cef\",");
		pStream.println("        \"\\u0d66\"-\"\\u0d6f\",");
		pStream.println("        \"\\u0e50\"-\"\\u0e59\",");
		pStream.println("        \"\\u0ed0\"-\"\\u0ed9\",");
		pStream.println("        \"\\u1040\"-\"\\u1049\"");
		pStream.println("        ]");
		pStream.println("    >");
		pStream.println("}// IDENTIFIERS");
	}

	void Start.genJavaCCSeparators(PrintStream pStream) {
		pStream.println("<DEFAULT,BOUNDS> TOKEN : /* SEPARATORS */");
		pStream.println("{");
		pStream.println("     < LBRACE               : \"{\"    >");
		pStream.println("    | < RBRACE               : \"}\"    >");
		pStream.println("    | < LBRACKET             : \"[\"    >");
		pStream.println("    | < RBRACKET             : \"]\"    >");
		pStream.println("    | < SEMICOLON            : \";\"    >");
		pStream.println("}// SEPARATORS");
	}

	void Start.genJavaCCOperators(PrintStream pStream) {
		pStream.println("<DEFAULT,BOUNDS> TOKEN : /* OPERATORS */");
		pStream.println("{");
		pStream.println("      < ASSIGN               : \"=\"    >");
		pStream.println("}// OPERATORS");
	}
}