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