| 5772f61 by Jos van den Oever at 2009-08-16 |
1 |
package mso.generator; |
| 79224b0 by Jos van den Oever at 2009-08-16 |
2 |
|
|
3 |
import java.io.FileWriter; |
|
4 |
import java.io.IOException; |
|
5 |
import java.io.PrintWriter; |
|
6 |
import java.util.regex.Matcher; |
|
7 |
import java.util.regex.Pattern; |
|
8 |
|
| 1971b94 by Jos van den Oever at 2011-08-06 |
9 |
import mso.generator.utils.Choice; |
|
10 |
import mso.generator.utils.Limitation; |
|
11 |
import mso.generator.utils.MSO; |
|
12 |
import mso.generator.utils.Member; |
|
13 |
import mso.generator.utils.Stream; |
|
14 |
import mso.generator.utils.Struct; |
|
15 |
import mso.generator.utils.TypeRegistry; |
|
16 |
|
| 5772f61 by Jos van den Oever at 2009-08-16 |
17 |
public class JavaParserGenerator { |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
18 |
void generate(MSO mso, String dir, String packagename, String classname) |
| 79224b0 by Jos van den Oever at 2009-08-16 |
19 |
throws IOException { |
| 5772f61 by Jos van den Oever at 2009-08-16 |
20 |
FileWriter fout = new FileWriter(dir + "/" |
|
21 |
+ packagename.replace('.', '/') + "/" + classname + ".java"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
22 |
PrintWriter out = new PrintWriter(fout); |
|
23 |
out.println("package " + packagename + ";"); |
|
24 |
out.println("import java.io.IOException;"); |
|
25 |
out.println("public class " + classname + " {"); |
|
26 |
out |
| 6e4eb38 by Jos van den Oever at 2009-09-15 |
27 |
.println(" Object parse(String key, LEInputStream in) throws IOException {"); |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
28 |
boolean first = true; |
|
29 |
for (Stream s : mso.streams) { |
| 79224b0 by Jos van den Oever at 2009-08-16 |
30 |
out.print(" "); |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
31 |
if (first) { |
|
32 |
first = false; |
|
33 |
} else { |
| 79224b0 by Jos van den Oever at 2009-08-16 |
34 |
out.print("} else "); |
|
35 |
} |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
36 |
out.println("if (\"" + s.key + "\".equals(key)) {"); // TODO: fix |
|
37 |
// for |
| 79224b0 by Jos van den Oever at 2009-08-16 |
38 |
// \001 and \005 |
|
39 |
// prefix |
| 6e4eb38 by Jos van den Oever at 2009-09-15 |
40 |
out.println(" return parse" + s.type + "(in);"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
41 |
} |
| 42fca05 by Jos van den Oever at 2009-08-17 |
42 |
out.println(" } else {"); |
| 6e4eb38 by Jos van den Oever at 2009-09-15 |
43 |
out.println(" return parseTODOS(in);"); |
|
44 |
out.println(" }"); |
|
45 |
out.println(" }"); |
|
46 |
|
|
47 |
out |
|
48 |
.println(" void serialize(String key, Object o, LEOutputStream out) throws IOException {"); |
|
49 |
first = true; |
|
50 |
for (Stream s : mso.streams) { |
|
51 |
out.print(" "); |
|
52 |
if (first) { |
|
53 |
first = false; |
|
54 |
} else { |
|
55 |
out.print("} else "); |
|
56 |
} |
|
57 |
out.println("if (\"" + s.key + "\".equals(key)) {"); // TODO: fix |
|
58 |
// for |
|
59 |
// \001 and \005 |
|
60 |
// prefix |
|
61 |
out.println(" write((" + s.type + ")o, out);"); |
|
62 |
} |
|
63 |
out.println(" } else {"); |
|
64 |
out.println(" write((TODOS)o, out);"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
65 |
out.println(" }"); |
|
66 |
out.println(" }"); |
|
67 |
|
| 2c22c86 by Jos van den Oever at 2009-08-27 |
68 |
for (Struct s : mso.structs) { |
|
69 |
printStructureParser(out, s); |
| 6e4eb38 by Jos van den Oever at 2009-09-15 |
70 |
printStructureWriter(out, s); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
71 |
} |
|
72 |
|
|
73 |
out.println("}"); |
|
74 |
|
| 2c22c86 by Jos van den Oever at 2009-08-27 |
75 |
for (Struct s : mso.structs) { |
|
76 |
printStructureClass(out, s); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
77 |
} |
|
78 |
|
|
79 |
out.close(); |
|
80 |
fout.close(); |
|
81 |
} |
|
82 |
|
| 2c22c86 by Jos van den Oever at 2009-08-27 |
83 |
void printStructureParser(PrintWriter out, Struct s) { |
|
84 |
out.println(" " + s.name + " parse" + s.name |
| 79224b0 by Jos van den Oever at 2009-08-16 |
85 |
+ "(LEInputStream in) throws IOException {"); |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
86 |
out.println(" " + s.name + " _s = new " + s.name + "();"); |
| 6d9a57d by Jos van den Oever at 2009-09-12 |
87 |
if (s.containsKnownLengthArrayMember) { |
| 79224b0 by Jos van den Oever at 2009-08-16 |
88 |
out.println(" int _c;"); |
|
89 |
} |
| 812ed49 by Jos van den Oever at 2011-08-01 |
90 |
boolean variableArray = false; |
|
91 |
for (Member m : s.members) { |
|
92 |
if (m.isArray && m.count == null && m.size == null) { |
|
93 |
variableArray = s.containsUnknownLengthArrayMember; |
|
94 |
} |
|
95 |
} |
|
96 |
if (s.containsOptionalMember || variableArray |
| 9aad1f9 by Jos van den Oever at 2010-01-27 |
97 |
|| s.containsChoice) { |
| 7b75457 by Jos van den Oever at 2009-08-16 |
98 |
out.println(" Object _m;"); |
|
99 |
} |
| 812ed49 by Jos van den Oever at 2011-08-01 |
100 |
if (variableArray) { |
| 700ccda by Jos van den Oever at 2009-09-14 |
101 |
out.println(" boolean _atend;"); |
|
102 |
} |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
103 |
for (Member m : s.members) { |
|
104 |
printStructureMemberParser(out, m); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
105 |
} |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
106 |
if (s.name.contains("RecordHeader")) { |
| 14636bd by Jos van den Oever at 2009-08-20 |
107 |
out.println("System.out.println(in.getPosition()+\" \"+_s);"); |
| 84d4cfb by Jos van den Oever at 2009-08-17 |
108 |
} |
| 79224b0 by Jos van den Oever at 2009-08-16 |
109 |
out.println(" return _s;"); |
|
110 |
out.println(" }"); |
|
111 |
} |
|
112 |
|
| 6e4eb38 by Jos van den Oever at 2009-09-15 |
113 |
void printStructureWriter(PrintWriter out, Struct s) { |
|
114 |
out.println(" void write(" + s.name |
|
115 |
+ " _s, LEOutputStream out) throws IOException {"); |
|
116 |
for (Member m : s.members) { |
|
117 |
printStructureMemberWriter(out, m); |
|
118 |
} |
|
119 |
out.println(" }"); |
|
120 |
} |
|
121 |
|
|
122 |
void printStructureMemberWriter(PrintWriter out, Member m) { |
|
123 |
String s = " "; |
|
124 |
if (m.condition != null) { |
|
125 |
out.println(" if (" + getExpression("_s", m.condition) |
|
126 |
+ ") {"); |
|
127 |
s = s + " "; |
|
128 |
} |
| 45c451d by Jos van den Oever at 2010-01-27 |
129 |
if (m.isChoice) { |
| 6e4eb38 by Jos van den Oever at 2009-09-15 |
130 |
boolean first = true; |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
131 |
Choice c = (Choice) m.type(); |
|
132 |
for (String t : c.getChoiceNames()) { |
| 6e4eb38 by Jos van den Oever at 2009-09-15 |
133 |
out.print(s); |
|
134 |
if (!first) { |
|
135 |
out.print("} else "); |
|
136 |
} |
|
137 |
first = false; |
|
138 |
out.println("if (_s." + m.name + " instanceof " + t + ") {"); |
|
139 |
out |
|
140 |
.println(s + " write((" + t + ")_s." + m.name |
|
141 |
+ ", out);"); |
|
142 |
} |
|
143 |
out.println(s + "}"); |
|
144 |
} else if (m.isArray) { |
|
145 |
String t = getTypeName(m); |
|
146 |
out.println(s + "for (" + t + " _i: _s." + m.name + ") {"); |
| 45c451d by Jos van den Oever at 2010-01-27 |
147 |
if (m.isStruct) { |
| 6e4eb38 by Jos van den Oever at 2009-09-15 |
148 |
out.println(s + " write(_i, out);"); |
|
149 |
} else { |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
150 |
out.println(s + " out.write" + m.type().name + "(_i);"); |
| 6e4eb38 by Jos van den Oever at 2009-09-15 |
151 |
} |
|
152 |
out.println(s + "}"); |
| 45c451d by Jos van den Oever at 2010-01-27 |
153 |
} else if (m.isStruct) { |
| 6e4eb38 by Jos van den Oever at 2009-09-15 |
154 |
out.print(s); |
|
155 |
if (m.isOptional) { |
|
156 |
out.print("if (_s." + m.name + " != null) "); |
|
157 |
} |
|
158 |
out.println("write(_s." + m.name + ", out);"); |
|
159 |
} else { |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
160 |
out.println(s + "out.write" + m.type().name + "(_s." + m.name |
|
161 |
+ ");"); |
| 6e4eb38 by Jos van den Oever at 2009-09-15 |
162 |
} |
|
163 |
if (m.condition != null) { |
|
164 |
out.println(" }"); |
|
165 |
} |
|
166 |
} |
|
167 |
|
| 2c22c86 by Jos van den Oever at 2009-08-27 |
168 |
String getTypeName(Member m) { |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
169 |
final TypeRegistry.Type t = m.type(); |
| d2d3f42 by Jos van den Oever at 2010-01-30 |
170 |
final TypeRegistry r = m.registry; |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
171 |
if (t instanceof Struct) { |
|
172 |
return m.type().name; |
|
173 |
} else if (t instanceof Choice) { |
|
174 |
return "Object"; |
|
175 |
} else if (t == r.bit) { |
| 84d4cfb by Jos van den Oever at 2009-08-17 |
176 |
return "boolean"; |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
177 |
} else if (t == r.uint2 || t == r.uint3 || t == r.uint4 || t == r.uint5 |
|
178 |
|| t == r.uint6 || t == r.uint7 || t == r.uint8) { |
| 79224b0 by Jos van den Oever at 2009-08-16 |
179 |
return "byte"; |
| c1d8729 by Jos van den Oever at 2010-09-27 |
180 |
} else if (t == r.uint9 || t == r.uint12 || t == r.uint13 |
|
181 |
|| t == r.uint14 || t == r.uint15 |
|
182 |
|| t == r.int16) { |
| 79224b0 by Jos van den Oever at 2009-08-16 |
183 |
return "short"; |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
184 |
} else if (t == r.uint16 || t == r.uint20 || t == r.uint30 |
|
185 |
|| t == r.uint32 || t == r.int32) { |
| 79224b0 by Jos van den Oever at 2009-08-16 |
186 |
return "int"; |
|
187 |
} |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
188 |
return t.name; |
| 79224b0 by Jos van den Oever at 2009-08-16 |
189 |
} |
|
190 |
|
| 2c22c86 by Jos van den Oever at 2009-08-27 |
191 |
String getMemberDeclaration(Member m) { |
|
192 |
if (m.isArray) { |
|
193 |
if (m.count == null) { |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
194 |
return "final java.util.List<" + m.type().name + "> " + m.name |
|
195 |
+ " = new java.util.ArrayList<" + m.type().name + ">()"; |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
196 |
} else { |
|
197 |
return getTypeName(m) + "[] " + m.name; |
| 79224b0 by Jos van den Oever at 2009-08-16 |
198 |
} |
|
199 |
} else { |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
200 |
return getTypeName(m) + " " + m.name; |
| 79224b0 by Jos van den Oever at 2009-08-16 |
201 |
} |
|
202 |
} |
|
203 |
|
| 2c22c86 by Jos van den Oever at 2009-08-27 |
204 |
void printStructureClass(PrintWriter out, Struct s) { |
|
205 |
out.println("class " + s.name + " {"); |
|
206 |
for (Member m : s.members) { |
|
207 |
String d = getMemberDeclaration(m); |
|
208 |
out.println(" " + d + ";"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
209 |
} |
|
210 |
|
|
211 |
// function toString |
|
212 |
out.println(" public String toString() {"); |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
213 |
out.println(" String _s = \"" + s.name + ":\";"); |
|
214 |
for (Member m : s.members) { |
|
215 |
out.print(" _s = _s + \"" + m.name |
|
216 |
+ ": \" + String.valueOf(" + m.name + ") + \""); |
|
217 |
if (m.isInteger && !m.isArray) { |
|
218 |
out.print("(\" + Integer.toHexString(" + m.name |
|
219 |
+ ").toUpperCase() + \")"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
220 |
} |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
221 |
out.println(", \";"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
222 |
} |
|
223 |
out.println(" return _s;"); |
|
224 |
out.println(" }"); |
|
225 |
out.println("}"); |
|
226 |
|
|
227 |
} |
|
228 |
|
| e18fe86 by Jos van den Oever at 2009-08-16 |
229 |
String prependStructureToExpression(String expression, String structureName) { |
|
230 |
if (expression.length() > 0) { |
| 79224b0 by Jos van den Oever at 2009-08-16 |
231 |
Pattern p = Pattern.compile("([^.\\w])([.a-zA-Z])"); |
| e18fe86 by Jos van den Oever at 2009-08-16 |
232 |
Matcher m = p.matcher(expression); |
|
233 |
expression = m.replaceAll("$1" + structureName + ".$2"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
234 |
p = Pattern.compile("^([a-zA-Z])"); |
| e18fe86 by Jos van den Oever at 2009-08-16 |
235 |
m = p.matcher(expression); |
|
236 |
expression = m.replaceAll(structureName + ".$1"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
237 |
} |
| e18fe86 by Jos van den Oever at 2009-08-16 |
238 |
return expression; |
| 79224b0 by Jos van den Oever at 2009-08-16 |
239 |
} |
|
240 |
|
| 2c22c86 by Jos van den Oever at 2009-08-27 |
241 |
void printStructureMemberParser(PrintWriter out, Member m) { |
| 79224b0 by Jos van den Oever at 2009-08-16 |
242 |
String s = " "; |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
243 |
String condition = null; |
|
244 |
if (m.condition != null) { |
|
245 |
condition = prependStructureToExpression(m.condition, "_s"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
246 |
s = s + " "; |
|
247 |
out.println(" if (" + condition + ") {"); |
|
248 |
} |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
249 |
String count = null; |
|
250 |
if (m.count != null) { |
|
251 |
count = prependStructureToExpression(m.count, "_s"); |
|
252 |
} |
| 79224b0 by Jos van den Oever at 2009-08-16 |
253 |
String parse; |
| 45c451d by Jos van den Oever at 2010-01-27 |
254 |
if (m.isStruct) { |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
255 |
parse = "parse" + m.type().name + "(in);"; |
| 79224b0 by Jos van den Oever at 2009-08-16 |
256 |
} else { |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
257 |
parse = "in.read" + m.type().name + "();"; |
| 79224b0 by Jos van den Oever at 2009-08-16 |
258 |
} |
|
259 |
|
| 45c451d by Jos van den Oever at 2010-01-27 |
260 |
if (m.isChoice) { |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
261 |
printChoiceParser(out, s, m); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
262 |
return; |
|
263 |
} |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
264 |
if (m.isArray && m.count == null) { |
| 5edd5c0 by Jos van den Oever at 2009-09-16 |
265 |
if (m.size != null) { |
|
266 |
printFixedSizeArrayParser(out, s, m); |
|
267 |
} else { |
|
268 |
// array for which no size is given: parse items until one fails |
|
269 |
printVariableArrayParser(out, s, m); |
|
270 |
} |
| 79224b0 by Jos van den Oever at 2009-08-16 |
271 |
return; |
|
272 |
} |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
273 |
if (m.isOptional) { |
|
274 |
printOptionalMemberParser(out, s, m); |
| 7b75457 by Jos van den Oever at 2009-08-16 |
275 |
return; |
|
276 |
} |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
277 |
if (count != null) { |
| 79224b0 by Jos van den Oever at 2009-08-16 |
278 |
out.println(s + "_c = " + count + ";"); |
|
279 |
} |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
280 |
out.print(s + "_s." + m.name + " = "); |
|
281 |
if (count != null) { |
| d2d3f42 by Jos van den Oever at 2010-01-30 |
282 |
if (m.type() == m.registry.uint8) { |
| 1a51da9 by Jos van den Oever at 2009-10-20 |
283 |
out.println("in.readBytes(_c);"); |
|
284 |
} else { |
|
285 |
out.println("new " + getTypeName(m) + "[_c];"); |
| 6e8ee0e by Jos van den Oever at 2010-02-04 |
286 |
out.println(s + "for (int _j=0; _j<_c; ++_j) {"); |
|
287 |
out.println(s + " _s." + m.name + "[_j] = " + parse); |
| 1a51da9 by Jos van den Oever at 2009-10-20 |
288 |
printLimitationCheck(out, " ", "_s." + m.name |
| 6e8ee0e by Jos van den Oever at 2010-02-04 |
289 |
+ "[_j]", m); |
| 1a51da9 by Jos van den Oever at 2009-10-20 |
290 |
out.println(s + "}"); |
|
291 |
} |
| 79224b0 by Jos van den Oever at 2009-08-16 |
292 |
} else { |
|
293 |
out.println(parse); |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
294 |
printLimitationCheck(out, " ", "_s." + m.name, m); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
295 |
} |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
296 |
if (condition != null) { |
| 79224b0 by Jos van den Oever at 2009-08-16 |
297 |
out.println(" }"); |
|
298 |
} |
|
299 |
} |
|
300 |
|
| 2c22c86 by Jos van den Oever at 2009-08-27 |
301 |
void printChoiceParser(PrintWriter out, String s, Member m) { |
| 79224b0 by Jos van den Oever at 2009-08-16 |
302 |
String closing = ""; |
|
303 |
String exception = "_x"; |
| 267ecf8 by Jos van den Oever at 2009-09-29 |
304 |
out.println(s + "_m = in.setMark();"); |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
305 |
Choice c = (Choice) m.type(); |
|
306 |
String choices[] = c.getChoiceNames(); |
| 4c82fdb by Jos van den Oever at 2009-10-19 |
307 |
int length = (m.isOptional) ? choices.length : choices.length - 1; |
| 267ecf8 by Jos van den Oever at 2009-09-29 |
308 |
for (int i = 0; i < length; ++i) { |
| 79224b0 by Jos van den Oever at 2009-08-16 |
309 |
out.println(s + "try {"); |
| 4c82fdb by Jos van den Oever at 2009-10-19 |
310 |
out.println(s + " _s." + m.name + " = parse" + choices[i] |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
311 |
+ "(in);"); |
| 5edd5c0 by Jos van den Oever at 2009-09-16 |
312 |
out.println(s + "} catch (IOException " + exception + ") {"); |
|
313 |
out.println(s + " if (!(" + exception |
|
314 |
+ " instanceof IncorrectValueException) && !(" + exception |
|
315 |
+ " instanceof java.io.EOFException)) throw " + exception |
|
316 |
+ ";"); |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
317 |
// out |
|
318 |
// .println(s |
|
319 |
// + " if (in.distanceFromMark(_m) > 16) throw new IOException(" |
|
320 |
// + exception + ");//onlyfordebug"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
321 |
out.println(s + " in.rewind(_m);"); |
|
322 |
exception = exception + "x"; |
|
323 |
closing = closing + "}"; |
|
324 |
} |
| 267ecf8 by Jos van den Oever at 2009-09-29 |
325 |
if (!m.isOptional) { |
|
326 |
out.println(s + " _s." + m.name + " = parse" |
| 4c82fdb by Jos van den Oever at 2009-10-19 |
327 |
+ choices[choices.length - 1] + "(in);"); |
| 267ecf8 by Jos van den Oever at 2009-09-29 |
328 |
} |
| 79224b0 by Jos van den Oever at 2009-08-16 |
329 |
out.println(s + closing + " finally {"); |
|
330 |
out.println(s + " in.releaseMark(_m);"); |
|
331 |
out.println(s + "}"); |
|
332 |
} |
|
333 |
|
| 5edd5c0 by Jos van den Oever at 2009-09-16 |
334 |
void printFixedSizeArrayParser(PrintWriter out, String s, Member m) { |
|
335 |
out.println(s + "int _startPos = in.getPosition();"); |
|
336 |
out.println(s + "while (in.getPosition() - _startPos < " |
|
337 |
+ getExpression("_s", m.size) + ") {"); |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
338 |
out.println(s + " " + m.type().name + " _t = parse" + m.type().name |
|
339 |
+ "(in);"); |
| 5edd5c0 by Jos van den Oever at 2009-09-16 |
340 |
out.println(s + " _s." + m.name + ".add(_t);"); |
|
341 |
out.println(s + "}"); |
|
342 |
} |
|
343 |
|
| 2c22c86 by Jos van den Oever at 2009-08-27 |
344 |
void printVariableArrayParser(PrintWriter out, String s, Member m) { |
| 700ccda by Jos van den Oever at 2009-09-14 |
345 |
out.println(s + "_atend = false;"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
346 |
out.println(s + "while (!_atend) {"); |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
347 |
// out |
|
348 |
// .println(s |
|
349 |
// + |
|
350 |
// " System.out.println(\"round \"+(_i++) + \" \" + in.getPosition());"); |
| 14636bd by Jos van den Oever at 2009-08-20 |
351 |
out.println(s + " _m = in.setMark();"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
352 |
out.println(s + " try {"); |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
353 |
out.println(s + " " + m.type().name + " _t = parse" |
|
354 |
+ m.type().name + "(in);"); |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
355 |
out.println(s + " _s." + m.name + ".add(_t);"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
356 |
out.println(s + " } catch(IncorrectValueException _e) {"); |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
357 |
// out |
|
358 |
// .println(s |
|
359 |
// + |
|
360 |
// " if (in.distanceFromMark(_m) > 16) throw new IOException(_e);//onlyfordebug"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
361 |
out.println(s + " _atend = true;"); |
|
362 |
out.println(s + " in.rewind(_m);"); |
|
363 |
out.println(s + " } catch(java.io.EOFException _e) {"); |
|
364 |
out.println(s + " _atend = true;"); |
|
365 |
out.println(s + " in.rewind(_m);"); |
|
366 |
out.println(s + " } finally {"); |
|
367 |
out.println(s + " in.releaseMark(_m);"); |
| 243f1e5 by Jos van den Oever at 2009-09-10 |
368 |
out.println(s + " }"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
369 |
out.println(s + "}"); |
|
370 |
} |
|
371 |
|
| 2c22c86 by Jos van den Oever at 2009-08-27 |
372 |
void printOptionalMemberParser(PrintWriter out, String s, Member m) { |
| 7b75457 by Jos van den Oever at 2009-08-16 |
373 |
out.println(s + "_m = in.setMark();"); |
|
374 |
out.println(s + "try {"); |
| 2ff50d9 by Jos van den Oever at 2010-01-27 |
375 |
out.println(s + " _s." + m.name + " = parse" + m.type().name |
|
376 |
+ "(in);"); |
| 7b75457 by Jos van den Oever at 2009-08-16 |
377 |
out.println(s + "} catch(IncorrectValueException _e) {"); |
| 84d4cfb by Jos van den Oever at 2009-08-17 |
378 |
out |
|
379 |
.println(s |
|
380 |
+ " if (in.distanceFromMark(_m) > 16) throw new IOException(_e);//onlyfordebug"); |
| 7b75457 by Jos van den Oever at 2009-08-16 |
381 |
out.println(s + " in.rewind(_m);"); |
|
382 |
out.println(s + "} catch(java.io.EOFException _e) {"); |
|
383 |
out.println(s + " in.rewind(_m);"); |
|
384 |
out.println(s + "} finally {"); |
|
385 |
out.println(s + " in.releaseMark(_m);"); |
|
386 |
out.println(s + "}"); |
|
387 |
} |
|
388 |
|
| 2c22c86 by Jos van den Oever at 2009-08-27 |
389 |
void printLimitationCheck(PrintWriter out, String s, String name, Member m) { |
|
390 |
for (Limitation l : m.limitations) { |
|
391 |
String mname = l.name; |
| 7b75457 by Jos van den Oever at 2009-08-16 |
392 |
if (!"".equals(mname)) { |
|
393 |
mname = name + "." + mname; |
|
394 |
} else { |
|
395 |
mname = name; |
|
396 |
} |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
397 |
String condition; |
|
398 |
if (l.expression == null) { |
|
399 |
condition = getCondition(mname, l); |
| e18fe86 by Jos van den Oever at 2009-08-16 |
400 |
} else { |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
401 |
condition = getExpression(mname, l.expression); |
| e18fe86 by Jos van den Oever at 2009-08-16 |
402 |
} |
|
403 |
|
| 79224b0 by Jos van den Oever at 2009-08-16 |
404 |
out.println(s + "if (!(" + condition + ")) {"); |
| 84d4cfb by Jos van den Oever at 2009-08-17 |
405 |
String exceptionType = "IncorrectValueException"; |
|
406 |
// if (!condition.contains(".recType") |
|
407 |
// && !condition.contains(".recVer") |
|
408 |
// && !condition.contains(".recInstance")) { |
|
409 |
// // special value for debugging: we only have recoverable |
|
410 |
// // exceptions in record headers, remove this in final code |
|
411 |
// exceptionType = "IOException"; |
|
412 |
// } |
| 14636bd by Jos van den Oever at 2009-08-20 |
413 |
out.println(s + " throw new " + exceptionType |
|
414 |
+ "(in.getPosition() + \"" + condition |
|
415 |
+ " for value \" + String.valueOf(" + name + ") );"); |
| 79224b0 by Jos van den Oever at 2009-08-16 |
416 |
out.println(s + "}"); |
|
417 |
} |
|
418 |
} |
|
419 |
|
| 7b75457 by Jos van den Oever at 2009-08-16 |
420 |
String getExpression(String structure, String expression) { |
| e18fe86 by Jos van den Oever at 2009-08-16 |
421 |
if (Pattern.matches(".*[A-Za-z].*", expression)) { |
|
422 |
return prependStructureToExpression(expression, structure); |
|
423 |
} |
|
424 |
return structure + expression; |
|
425 |
} |
|
426 |
|
| 2c22c86 by Jos van den Oever at 2009-08-27 |
427 |
String getCondition(String name, Limitation l) { |
|
428 |
String value = l.value; |
| e18fe86 by Jos van den Oever at 2009-08-16 |
429 |
String cmp = " == "; |
|
430 |
String cmb = " || "; |
|
431 |
if (value.startsWith("!")) { |
|
432 |
value = value.substring(1); |
|
433 |
cmp = " != "; |
|
434 |
cmb = " && "; |
|
435 |
} |
| 79224b0 by Jos van den Oever at 2009-08-16 |
436 |
if (value.contains("|")) { |
|
437 |
String values[] = value.split("\\|"); |
| e18fe86 by Jos van den Oever at 2009-08-16 |
438 |
String c = name + cmp + values[0]; |
| 79224b0 by Jos van den Oever at 2009-08-16 |
439 |
for (int i = 1; i < values.length; ++i) { |
| e18fe86 by Jos van den Oever at 2009-08-16 |
440 |
c = c + cmb + name + cmp + values[i]; |
| 79224b0 by Jos van den Oever at 2009-08-16 |
441 |
} |
|
442 |
return c; |
|
443 |
} |
| 2c22c86 by Jos van den Oever at 2009-08-27 |
444 |
return name + cmp + value; |
| 79224b0 by Jos van den Oever at 2009-08-16 |
445 |
} |
|
446 |
} |