1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package org.jdtaus.core.container.ri.client.versioning;
26
27
28
29
30
31
32
33
34
35
36 public class ParseException extends Exception {
37
38
39
40
41
42
43 private static final long serialVersionUID = 1L;
44
45
46
47
48
49
50
51 public ParseException(Token currentTokenVal,
52 int[][] expectedTokenSequencesVal,
53 String[] tokenImageVal
54 )
55 {
56 super(initialise(currentTokenVal, expectedTokenSequencesVal, tokenImageVal));
57 currentToken = currentTokenVal;
58 expectedTokenSequences = expectedTokenSequencesVal;
59 tokenImage = tokenImageVal;
60 }
61
62
63
64
65
66
67
68
69
70
71
72 public ParseException() {
73 super();
74 }
75
76
77 public ParseException(String message) {
78 super(message);
79 }
80
81
82
83
84
85
86
87 public Token currentToken;
88
89
90
91
92
93
94 public int[][] expectedTokenSequences;
95
96
97
98
99
100
101 public String[] tokenImage;
102
103
104
105
106
107
108
109
110 private static String initialise(Token currentToken,
111 int[][] expectedTokenSequences,
112 String[] tokenImage) {
113 String eol = System.getProperty("line.separator", "\n");
114 StringBuffer expected = new StringBuffer();
115 int maxSize = 0;
116 for (int i = 0; i < expectedTokenSequences.length; i++) {
117 if (maxSize < expectedTokenSequences[i].length) {
118 maxSize = expectedTokenSequences[i].length;
119 }
120 for (int j = 0; j < expectedTokenSequences[i].length; j++) {
121 expected.append(tokenImage[expectedTokenSequences[i][j]]).append(' ');
122 }
123 if (expectedTokenSequences[i][expectedTokenSequences[i].length - 1] != 0) {
124 expected.append("...");
125 }
126 expected.append(eol).append(" ");
127 }
128 String retval = "Encountered \"";
129 Token tok = currentToken.next;
130 for (int i = 0; i < maxSize; i++) {
131 if (i != 0) retval += " ";
132 if (tok.kind == 0) {
133 retval += tokenImage[0];
134 break;
135 }
136 retval += " " + tokenImage[tok.kind];
137 retval += " \"";
138 retval += add_escapes(tok.image);
139 retval += " \"";
140 tok = tok.next;
141 }
142 retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn;
143 retval += "." + eol;
144 if (expectedTokenSequences.length == 1) {
145 retval += "Was expecting:" + eol + " ";
146 } else {
147 retval += "Was expecting one of:" + eol + " ";
148 }
149 retval += expected.toString();
150 return retval;
151 }
152
153
154
155
156 protected String eol = System.getProperty("line.separator", "\n");
157
158
159
160
161
162
163 static String add_escapes(String str) {
164 StringBuffer retval = new StringBuffer();
165 char ch;
166 for (int i = 0; i < str.length(); i++) {
167 switch (str.charAt(i))
168 {
169 case 0 :
170 continue;
171 case '\b':
172 retval.append("\\b");
173 continue;
174 case '\t':
175 retval.append("\\t");
176 continue;
177 case '\n':
178 retval.append("\\n");
179 continue;
180 case '\f':
181 retval.append("\\f");
182 continue;
183 case '\r':
184 retval.append("\\r");
185 continue;
186 case '\"':
187 retval.append("\\\"");
188 continue;
189 case '\'':
190 retval.append("\\\'");
191 continue;
192 case '\\':
193 retval.append("\\\\");
194 continue;
195 default:
196 if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
197 String s = "0000" + Integer.toString(ch, 16);
198 retval.append("\\u" + s.substring(s.length() - 4, s.length()));
199 } else {
200 retval.append(ch);
201 }
202 continue;
203 }
204 }
205 return retval.toString();
206 }
207
208 }
209