
package railo.runtime.sql.old;

public final class ParseException extends Exception
{

 public ParseException(Token token, int ai[][], String as[])
 {
     super("");
     eol = System.getProperty("line.separator", "\n");
     specialConstructor = true;
     currentToken = token;
     expectedTokenSequences = ai;
     tokenImage = as;
 }

 public ParseException()
 {
     eol = System.getProperty("line.separator", "\n");
     specialConstructor = false;
 }

 public ParseException(String s)
 {
     super(s);
     eol = System.getProperty("line.separator", "\n");
     specialConstructor = false;
 }

 public String getMessage()
 {
     if(!specialConstructor)
         return super.getMessage();
     String s = "";
     int i = 0;
     for(int j = 0; j < expectedTokenSequences.length; j++)
     {
         if(i < expectedTokenSequences[j].length)
             i = expectedTokenSequences[j].length;
         for(int k = 0; k < expectedTokenSequences[j].length; k++)
             s = s + tokenImage[expectedTokenSequences[j][k]] + " ";

         if(expectedTokenSequences[j][expectedTokenSequences[j].length - 1] != 0)
             s = s + "...";
         s = s + eol + "    ";
     }

     String s1 = "Encountered \"";
     Token token = currentToken.next;
     for(int l = 0; l < i; l++)
     {
         if(l != 0)
             s1 = s1 + " ";
         if(token.kind == 0)
         {
             s1 = s1 + tokenImage[0];
             break;
         }
         s1 = s1 + add_escapes(token.image);
         token = token.next;
     }

     s1 = s1 + "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
     s1 = s1 + "." + eol;
     if(expectedTokenSequences.length == 1)
         s1 = s1 + "Was expecting:" + eol + "    ";
     else
         s1 = s1 + "Was expecting one of:" + eol + "    ";
     s1 = s1 + s;
     return s1;
 }

 protected String add_escapes(String s)
 {
     StringBuffer stringbuffer = new StringBuffer();
     for(int i = 0; i < s.length(); i++)
     {
         char c;
         switch(s.charAt(i))
         {
         case 0: // '\0'
             break;

         case 8: // '\b'
             stringbuffer.append("\\b");
             break;

         case 9: // '\t'
             stringbuffer.append("\\t");
             break;

         case 10: // '\n'
             stringbuffer.append("\\n");
             break;

         case 12: // '\f'
             stringbuffer.append("\\f");
             break;

         case 13: // '\r'
             stringbuffer.append("\\r");
             break;

         case 34: // '"'
             stringbuffer.append("\\\"");
             break;

         case 39: // '\''
             stringbuffer.append("\\'");
             break;

         case 92: // '\\'
             stringbuffer.append("\\\\");
             break;

         default:
             if((c = s.charAt(i)) < ' ' || c > '~')
             {
                 String s1 = "0000" + Integer.toString(c, 16);
                 stringbuffer.append("\\u" + s1.substring(s1.length() - 4, s1.length()));
             } else
             {
                 stringbuffer.append(c);
             }
             break;
         }
     }

     return stringbuffer.toString();
 }

 protected boolean specialConstructor;
 public Token currentToken;
 public int expectedTokenSequences[][];
 public String tokenImage[];
 protected String eol;
}