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