| 1 34 35 36 37 package com.micronova.util.cc.html; 38 39 48 public class ParseException extends Exception { 49 50 62 public ParseException(Token currentTokenVal, 63 int[][] expectedTokenSequencesVal, 64 String [] tokenImageVal 65 ) 66 { 67 super(""); 68 specialConstructor = true; 69 currentToken = currentTokenVal; 70 expectedTokenSequences = expectedTokenSequencesVal; 71 tokenImage = tokenImageVal; 72 } 73 74 83 84 public ParseException() { 85 super(); 86 specialConstructor = false; 87 } 88 89 public ParseException(String message) { 90 super(message); 91 specialConstructor = false; 92 } 93 94 99 protected boolean specialConstructor; 100 101 106 public Token currentToken; 107 108 113 public int[][] expectedTokenSequences; 114 115 120 public String [] tokenImage; 121 122 132 public String getMessage() { 133 if (!specialConstructor) { 134 return super.getMessage(); 135 } 136 String expected = ""; 137 int maxSize = 0; 138 for (int i = 0; i < expectedTokenSequences.length; i++) { 139 if (maxSize < expectedTokenSequences[i].length) { 140 maxSize = expectedTokenSequences[i].length; 141 } 142 for (int j = 0; j < expectedTokenSequences[i].length; j++) { 143 expected += tokenImage[expectedTokenSequences[i][j]] + " "; 144 } 145 if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { 146 expected += "..."; 147 } 148 expected += eol + " "; 149 } 150 String retval = "Encountered \""; 151 Token tok = currentToken.next; 152 for (int i = 0; i < maxSize; i++) { 153 if (i != 0) retval += " "; 154 if (tok.kind == 0) { 155 retval += tokenImage[0]; 156 break; 157 } 158 retval += add_escapes(tok.image); 159 tok = tok.next; 160 } 161 retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; 162 retval += "." + eol; 163 if (expectedTokenSequences.length == 1) { 164 retval += "Was expecting:" + eol + " "; 165 } else { 166 retval += "Was expecting one of:" + eol + " "; 167 } 168 retval += expected; 169 return retval; 170 } 171 172 175 protected String eol = System.getProperty("line.separator", "\n"); 176 177 182 protected String add_escapes(String str) { 183 StringBuffer retval = new StringBuffer (); 184 char ch; 185 for (int i = 0; i < str.length(); i++) { 186 switch (str.charAt(i)) 187 { 188 case 0 : 189 continue; 190 case '\b': 191 retval.append("\\b"); 192 continue; 193 case '\t': 194 retval.append("\\t"); 195 continue; 196 case '\n': 197 retval.append("\\n"); 198 continue; 199 case '\f': 200 retval.append("\\f"); 201 continue; 202 case '\r': 203 retval.append("\\r"); 204 continue; 205 case '\"': 206 retval.append("\\\""); 207 continue; 208 case '\'': 209 retval.append("\\\'"); 210 continue; 211 case '\\': 212 retval.append("\\\\"); 213 continue; 214 default: 215 if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { 216 String s = "0000" + Integer.toString(ch, 16); 217 retval.append("\\u" + s.substring(s.length() - 4, s.length())); 218 } else { 219 retval.append(ch); 220 } 221 continue; 222 } 223 } 224 return retval.toString(); 225 } 226 227 } 228 | Popular Tags |