package edu.neu.ccs.demeterf.demfgen;

/**  */
public class Preamble{
    public static String header =
        "// ** This file was generated with DemFGen (vers:"+Diff.buildDate+")\n\n";
    
    public static String lexer = 
        "SKIP : { \" \" | \"\\t\" | \"\\n\" | \"\\r\" | \"\\r\\n\" }\n"+
        "SKIP : { < \"//\" (~[\"\\n\",\"\\r\"])* (\"\\n\"|\"\\r\\n\") >\n"+
        "       | < \"/*\" (~[\"*\"])* \"*\" (~[\"/\"] (~[\"*\"])* \"*\")* \"/\" > }\n"+
        "TOKEN: { < TRUE : \"true\" >\n"+
        "       | < FALSE : \"false\" > }\n"+
        "TOKEN: { < INT : (\"+\" | \"-\")? ( ([\"0\"-\"9\"])+ \n"+
        "                                  | (\"0\" [\"x\",\"X\"]) ([\"0\"-\"9\",\"a\"-\"f\",\"A\"-\"F\"])+ ) >\n"+
        "       | < DOUBLE : (\"-\")?([\"0\"-\"9\"])+ \".\" ([\"0\"-\"9\"])+ (<EXPON>)?\n"+
        "                            | \".\" ([\"0\"-\"9\"])+  (<EXPON>)? >\n"+
        "       | < #EXPON: [\"e\",\"E\"] ([\"+\",\"-\"])? ([\"0\"-\"9\"])+ > }\n"+ 
        "TOKEN: { < CHAR: \"\\'\" \n"+
        "              ( (~[\"\\'\",\"\\\\\",\"\\n\",\"\\r\"]) | \n"+
        "                (\"\\\\\" ( [\"n\",\"t\",\"b\",\"r\",\"f\",\"\\\\\",\"\\'\",\"\\\"\"] |\n"+
        "                            [\"0\"-\"7\"] ( [\"0\"-\"7\"] )? |\n"+
        "                            [\"0\"-\"3\"] [\"0\"-\"7\"] [\"0\"-\"7\"] ) ) )\n"+
        "              \"\\'\" >\n"+
        "       | < STRING :\n"+
        "              \"\\\"\"\n"+
        "              (   (~[\"\\\"\",\"\\\\\",\"\\n\",\"\\r\"])\n"+
        "                | (\"\\\\\"\n"+
        "                    ( [\"n\",\"t\",\"b\",\"r\",\"f\",\"\\\\\",\"'\",\"\\\"\"]\n"+
        "                    | [\"0\"-\"7\"] ( [\"0\"-\"7\"] )?\n"+
        "                    | [\"0\"-\"3\"] [\"0\"-\"7\"] [\"0\"-\"7\"]\n"+
        "                    )\n"+
        "                  )\n"+
        "              )*\n"+
        "              \"\\\"\" >\n"+
        "       | < TEXT : ( \"{{\" (~[\"}\"])* ( \"}\" ~[\"}\"] (~[\"}\"])* )* \"}}\" ) >\n"+
        "       | < IDENT : [\"a\"-\"z\",\"A\"-\"Z\",\"$\",\"_\"]\n"+
        "                   ([\"a\"-\"z\",\"A\"-\"Z\",\"0\"-\"9\",\"_\",\"$\"])* > }\n";

    public static String parserJava = 
        "byte parse_byte():{ int i; }{\n"+
        "    i = parse_int() { return (byte)i; }\n}\n"+
        "Byte parse_Byte():{ byte b; }{\n"+
        "    b = parse_byte() { return b; }\n}\n"+
        "short parse_short():{ int i; }{\n"+
        "    i = parse_int() { return (short)i; }\n}\n"+
        "Short parse_Short():{ short s; }{\n"+
        "    s = parse_short() { return s; }\n}\n"+
        "int parse_int():{ Token t; }{\n"+
        "    t = <INT>\n"+
        "    { if(t.image.length() > 1 && Character.toLowerCase(t.image.charAt(1)) == 'x')\n" +
        "          return Integer.parseInt(t.image.substring(2), 16);\n"+
        "      return Integer.parseInt(t.image); }\n}\n"+
        "Integer parse_Integer():{ int i; }{\n"+
        "    i = parse_int() { return i; }\n}\n"+
        "long parse_long():{ Token t; }{\n"+
        "    t = <INT>\n"+
        "    { if(t.image.length() > 1 && Character.toLowerCase(t.image.charAt(1)) == 'x')\n" +
        "          return Long.parseLong(t.image.substring(2), 16);\n"+
        "    return Long.parseLong(t.image); }\n}\n"+
        "Long parse_Long():{ long l; }{\n"+
        "    l = parse_long() { return l; }\n}\n"+
        "double parse_double():{ Token t; }{\n"+
        "    t = <DOUBLE>\n"+
        "    { return Double.parseDouble(t.image); }\n}\n"+
        "Double parse_Double():{ double d; }{\n"+
        "    d = parse_double() { return d; }\n}\n"+
        "float parse_float():{ Token t; }{\n"+
        "    t = <DOUBLE>\n"+
        "    { return Float.parseFloat(t.image); }\n}\n"+
        "Float parse_Float():{ float f; }{\n"+
        "    f = parse_float() { return f; }\n}\n"+
        "String parse_String():{ Token t; }{\n"+
        "    t = <STRING>\n"+
        "    { return unescape(t.image.substring(1,t.image.length()-1)); }\n}\n"+
        "boolean parse_boolean():{ Token t; }{\n"+
        "    t = <TRUE> { return true; } |\n"+
        "    t = <FALSE> { return false; }\n}\n"+
        "Boolean parse_Boolean():{ boolean b; }{\n"+
        "    b = parse_boolean() { return b; }\n}\n"+
        "char parse_char():{ Token t; }{\n"+
        "    t = <CHAR>\n"+
        "    { return unescape(t.image.substring(1,t.image.length()-1)).charAt(0); }\n}\n"+
        "Character parse_Character():{ char c; }{\n"+
        "    c = parse_char() { return c; }\n}\n"+
        
        // DemeterF (demfgen.lib) Specific Classes...
        "ident parse_ident():{ Token t; }{\n"+
        "    t = <IDENT>\n"+
        "    { return new ident(t.image); }\n}\n"+
        "verbatim parse_verbatim():{ Token t; }{\n"+
        "    t = <TEXT>\n"+
        "    { return new verbatim(t.image.substring(2,t.image.length()-2)); }\n}\n";
        
    public static String parserCS =
        "byte parse_byte():{ int i; }{\n"+
        "    i = parse_int() { return (byte)i; }\n}\n"+
        "Byte parse_Byte():{ byte b; }{\n"+
        "    b = parse_byte() { return b; }\n}\n"+
        "short parse_short():{ Token t; }{\n"+
        "    t = <INT>\n"+
        "    { return Int16.Parse(t.image); }\n}\n"+
        "Int16 parse_Int16():{ short i; }{\n"+
        "    i = parse_short() { return i; }\n}\n"+
        "int parse_int():{ Token t; }{\n"+
        "    t = <INT>\n"+
        "    { return Int32.Parse(t.image); }\n}\n"+
        "Int32 parse_Int32():{ int i; }{\n"+
        "    i = parse_int() { return i; }\n}\n"+
        "long parse_long():{ Token t; }{\n"+
        "    t = <INT>\n"+
        "    { return Int64.Parse(t.image); }\n}\n"+
        "Int64 parse_Int64():{ long l; }{\n"+
        "    l = parse_long() { return l; }\n}\n"+
        "double parse_double():{ Token t; }{\n"+
        "    t = <DOUBLE>\n"+
        "    { return Double.Parse(t.image); }\n}\n"+
        "Double parse_Double():{ double d; }{\n"+
        "    d = parse_double() { return d; }\n}\n"+
        "float parse_float():{ Token t; }{\n"+
        "    t = <DOUBLE>\n"+
        "    { return Single.Parse(t.image); }\n}\n"+
        "Single parse_Single():{ Single s; }{\n"+
        "    s = parse_float() { return s; }\n}\n"+
        "String parse_string():{ Token t; }{\n"+
        "    t = <STRING>\n"+
        "    { return t.image.Substring(1,t.image.Length-2); }\n}\n"+
        "String parse_String():{ string s; }{\n"+
        "    s = parse_string() { return s; }\n}\n"+
        "bool parse_bool():{ Token t; }{\n"+
        "    t = <TRUE> { return true; } |\n"+
        "    t = <FALSE> { return false; }\n}\n"+
        "Boolean parse_Boolean():{ bool b; }{\n"+
        "    b = parse_bool() { return b; }\n}\n"+
        "char parse_char():{ Token t; }{\n"+
        "    t = <CHAR>\n"+
        "    { return unescapeChar(t.image); }\n}\n"+
        "Char parse_Char():{ char c; }{\n"+
        "    c = parse_char() { return c; }\n}\n"+
        
        // DemeterF (demfgen.lib) Specific Classes...
        "ident parse_ident():{ Token t; }{\n"+
        "    t = <IDENT>\n"+
        "    { return new ident(t.image); }\n}\n"+
        "verbatim parse_verbatim():{ Token t; }{\n"+
        "    t = <TEXT>\n"+
        "    { return new verbatim(t.image.Substring(2,t.image.Length-2)); }\n}\n";
    
    public static String escapeChar =
        "   public static String escape(char c){\n"+
        "      switch(c){\n"+
        "      case '\\n':return \"\\\\n\";  case '\\t':return \"\\\\t\";\n"+
        "      case '\\b':return \"\\\\b\";  case '\\r':return \"\\\\r\";\n"+
        "      case '\\f':return \"\\\\f\";  case '\\\\':return \"\\\\\\\\\";\n"+
        "      case '\\'':return \"\\\\'\"; case '\\\"':return \"\\\\\\\"\";\n"+
        "      default: return \"\"+c;\n"+
        "      }\n"+
        "   }\n";
    
    public static String escapeMethodsJava =
        "   public static String escape(String s){\n"+
        "      char str[] = s.toCharArray();\n"+
        "      StringBuffer ret = new StringBuffer(\"\");\n"+
        "      for(char c:str)ret.append(escape(c));\n"+
        "      return ret.toString();\n"+
        "   }\n"+escapeChar;
    
    public static String escapeMethodsCS =
        "   public static string escape(string s){\n"+
        "       string ret = \"\";\n"+
        "       foreach(char c in s)ret += escape(c);\n"+
        "       return ret;\n"+
        "   }\n"+escapeChar;
    
    // Unescaping strings is gross...
    public static String unescapeMethodJava = 
        "   public static String unescape(String str){\n"+
        "      String retval = \"\";\n"+
        "      int index = 0;\n"+
        "      char ch, ch1;\n"+
        "      int ordinal = 0;\n"+
        "      while (index < str.length()) {\n"+
        "         if(str.charAt(index) != '\\\\') { retval += str.charAt(index++); continue; }\n"+
        "         ch = str.charAt(++index);\n"+
        "         if(ch == 'b') { retval += '\\b'; index++; continue; }\n"+
        "         if(ch == 't') { retval += '\\t'; index++; continue; }\n"+
        "         if(ch == 'n') { retval += '\\n'; index++; continue; }\n"+
        "         if(ch == 'f') { retval += '\\f'; index++; continue; }\n"+
        "         if(ch == 'r') { retval += '\\r'; index++; continue; }\n"+
        "         if(ch == '\"') { retval += '\\\"'; index++; continue; }\n"+
        "         if(ch == '\\'') { retval += '\\''; index++; continue; }\n"+
        "         if(ch == '\\\\') { retval += '\\\\'; index++; continue; }\n"+
        "         if(ch >= '0' && ch <= '7'){\n"+
        "            ordinal = ((int)ch) - ((int)'0'); index++;\n"+
        "            ch1 = str.charAt(index);\n"+
        "            if(ch1 >= '0' && ch1 <= '7'){\n"+
        "               ordinal = ordinal*8 + ((int)ch1) - ((int)'0'); index++;\n"+
        "               ch1 = str.charAt(index);\n"+
        "               if(ch <= '3' && ch1 >= '0' && ch1 <= '7'){\n"+
        "                  ordinal = ordinal*8 + ((int)ch1) - ((int)'0'); index++;\n"+
        "               }\n"+
        "            }\n"+
        "            retval += (char)ordinal;\n"+
        "            continue;\n"+
        "         }\n"+
        "         if(ch == 'u'){\n"+
        "            ordinal = 0;\n"+
        "            for(int i = 0; i < 4; i++){\n"+
        "               index++; ch = str.charAt(index);\n"+
        "               ordinal = ordinal*16+hexval(ch);\n"+
        "            }\n"+
        "            index++;\n"+
        "            retval += (char)ordinal;\n"+
        "            continue;\n"+
        "         }\n"+
        "      }\n"+
        "      return retval;\n"+
        "   }\n"+
        "   static int hexval(char c){\n"+
        "      int r = \"0123456789ABCDEF\".indexOf(Character.toUpperCase(c));\n"+
        "      if(r >= 0)return r;\n"+
        "      throw new RuntimeException(\" ** Bad Escaped Character\");\n"+
        "   }\n";
    
    public static String parserBodyCS =
        "\n    static char unescapeChar(String s){\n"+
        "        s = s.Substring(1,s.Length-1);"+
        "        char c = s[0];\n"+
        "        if (c == '\\\\'){\n"+
        "            switch (s[1]) {\n"+
        "            case 'n': return '\\n';  case 't': return '\\t';\n"+
        "            case 'b': return '\\b';  case 'r': return '\\r';\n"+
        "            case 'f': return '\\f';  case '\\\\': return '\\\\';\n"+
        "            case '\\'': return '\\''; case '\\\"': return '\\\"';\n"+
        "            default: return (char)(Convert.ToInt32(s.Substring(1, s.Length), 8));\n"+
        "            }\n"+
        "        }\n"+
        "        return c;\n"+
        "    }\n";
    
    public static String parserBodyJava =
        "\n"+unescapeMethodJava;
}