001    
002    package railo.runtime.sql.old;
003    
004    public final class ParseException extends Exception
005    {
006    
007     public ParseException(Token token, int ai[][], String as[])
008     {
009         super("");
010         eol = System.getProperty("line.separator", "\n");
011         specialConstructor = true;
012         currentToken = token;
013         expectedTokenSequences = ai;
014         tokenImage = as;
015     }
016    
017     public ParseException()
018     {
019         eol = System.getProperty("line.separator", "\n");
020         specialConstructor = false;
021     }
022    
023     public ParseException(String s)
024     {
025         super(s);
026         eol = System.getProperty("line.separator", "\n");
027         specialConstructor = false;
028     }
029    
030     public String getMessage()
031     {
032         if(!specialConstructor)
033             return super.getMessage();
034         String s = "";
035         int i = 0;
036         for(int j = 0; j < expectedTokenSequences.length; j++)
037         {
038             if(i < expectedTokenSequences[j].length)
039                 i = expectedTokenSequences[j].length;
040             for(int k = 0; k < expectedTokenSequences[j].length; k++)
041                 s = s + tokenImage[expectedTokenSequences[j][k]] + " ";
042    
043             if(expectedTokenSequences[j][expectedTokenSequences[j].length - 1] != 0)
044                 s = s + "...";
045             s = s + eol + "    ";
046         }
047    
048         String s1 = "Encountered \"";
049         Token token = currentToken.next;
050         for(int l = 0; l < i; l++)
051         {
052             if(l != 0)
053                 s1 = s1 + " ";
054             if(token.kind == 0)
055             {
056                 s1 = s1 + tokenImage[0];
057                 break;
058             }
059             s1 = s1 + add_escapes(token.image);
060             token = token.next;
061         }
062    
063         s1 = s1 + "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
064         s1 = s1 + "." + eol;
065         if(expectedTokenSequences.length == 1)
066             s1 = s1 + "Was expecting:" + eol + "    ";
067         else
068             s1 = s1 + "Was expecting one of:" + eol + "    ";
069         s1 = s1 + s;
070         return s1;
071     }
072    
073     protected String add_escapes(String s)
074     {
075         StringBuffer stringbuffer = new StringBuffer();
076         for(int i = 0; i < s.length(); i++)
077         {
078             char c;
079             switch(s.charAt(i))
080             {
081             case 0: // '\0'
082                 break;
083    
084             case 8: // '\b'
085                 stringbuffer.append("\\b");
086                 break;
087    
088             case 9: // '\t'
089                 stringbuffer.append("\\t");
090                 break;
091    
092             case 10: // '\n'
093                 stringbuffer.append("\\n");
094                 break;
095    
096             case 12: // '\f'
097                 stringbuffer.append("\\f");
098                 break;
099    
100             case 13: // '\r'
101                 stringbuffer.append("\\r");
102                 break;
103    
104             case 34: // '"'
105                 stringbuffer.append("\\\"");
106                 break;
107    
108             case 39: // '\''
109                 stringbuffer.append("\\'");
110                 break;
111    
112             case 92: // '\\'
113                 stringbuffer.append("\\\\");
114                 break;
115    
116             default:
117                 if((c = s.charAt(i)) < ' ' || c > '~')
118                 {
119                     String s1 = "0000" + Integer.toString(c, 16);
120                     stringbuffer.append("\\u" + s1.substring(s1.length() - 4, s1.length()));
121                 } else
122                 {
123                     stringbuffer.append(c);
124                 }
125                 break;
126             }
127         }
128    
129         return stringbuffer.toString();
130     }
131    
132     protected boolean specialConstructor;
133     public Token currentToken;
134     public int expectedTokenSequences[][];
135     public String tokenImage[];
136     protected String eol;
137    }