1 2 package net.sourceforge.pmd.ast; 3 4 13 public class ParseException extends RuntimeException { 14 15 27 public ParseException(Token currentTokenVal, 28 int[][] expectedTokenSequencesVal, 29 String [] tokenImageVal) { 30 super(""); 31 specialConstructor = true; 32 currentToken = currentTokenVal; 33 expectedTokenSequences = expectedTokenSequencesVal; 34 tokenImage = tokenImageVal; 35 } 36 37 46 47 public ParseException() { 48 super(); 49 specialConstructor = false; 50 } 51 52 public ParseException(String message) { 53 super(message); 54 specialConstructor = false; 55 } 56 57 62 protected boolean specialConstructor; 63 64 69 public Token currentToken; 70 71 76 public int[][] expectedTokenSequences; 77 78 83 public String [] tokenImage; 84 85 95 public String getMessage() { 96 if (!specialConstructor) { 97 return super.getMessage(); 98 } 99 StringBuffer expected = new StringBuffer (); 100 int maxSize = 0; 101 for (int i = 0; i < expectedTokenSequences.length; i++) { 102 if (maxSize < expectedTokenSequences[i].length) { 103 maxSize = expectedTokenSequences[i].length; 104 } 105 for (int j = 0; j < expectedTokenSequences[i].length; j++) { 106 expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' '); 107 } 108 if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) { 109 expected.append("..."); 110 } 111 expected.append(eol).append(" "); 112 } 113 String retval = "Encountered \""; 114 Token tok = currentToken.next; 115 for (int i = 0; i < maxSize; i++) { 116 if (i != 0) retval += " "; 117 if (tok.kind == 0) { 118 retval += tokenImage[0]; 119 break; 120 } 121 retval += add_escapes(tok.image); 122 tok = tok.next; 123 } 124 retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn; 125 retval += "." + eol; 126 if (expectedTokenSequences.length == 1) { 127 retval += "Was expecting:" + eol + " "; 128 } else { 129 retval += "Was expecting one of:" + eol + " "; 130 } 131 retval += expected.toString(); 132 return retval; 133 } 134 135 138 protected String eol = System.getProperty("line.separator", "\n"); 139 140 145 protected String add_escapes(String str) { 146 StringBuffer retval = new StringBuffer (); 147 char ch; 148 for (int i = 0; i < str.length(); i++) { 149 switch (str.charAt(i)) { 150 case 0: 151 continue; 152 case '\b': 153 retval.append("\\b"); 154 continue; 155 case '\t': 156 retval.append("\\t"); 157 continue; 158 case '\n': 159 retval.append("\\n"); 160 continue; 161 case '\f': 162 retval.append("\\f"); 163 continue; 164 case '\r': 165 retval.append("\\r"); 166 continue; 167 case '\"': 168 retval.append("\\\""); 169 continue; 170 case '\'': 171 retval.append("\\\'"); 172 continue; 173 case '\\': 174 retval.append("\\\\"); 175 continue; 176 default: 177 if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) { 178 String s = "0000" + Integer.toString(ch, 16); 179 retval.append("\\u" + s.substring(s.length() - 4, s.length())); 180 } else { 181 retval.append(ch); 182 } 183 continue; 184 } 185 } 186 return retval.toString(); 187 } 188 189 } 190 | Popular Tags |