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