KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > javacc > parser > ParseGen


1 /*
2  * Copyright © 2002 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
3  * California 95054, U.S.A. All rights reserved. Sun Microsystems, Inc. has
4  * intellectual property rights relating to technology embodied in the product
5  * that is described in this document. In particular, and without limitation,
6  * these intellectual property rights may include one or more of the U.S.
7  * patents listed at http://www.sun.com/patents and one or more additional
8  * patents or pending patent applications in the U.S. and in other countries.
9  * U.S. Government Rights - Commercial software. Government users are subject
10  * to the Sun Microsystems, Inc. standard license agreement and applicable
11  * provisions of the FAR and its supplements. Use is subject to license terms.
12  * Sun, Sun Microsystems, the Sun logo and Java are trademarks or registered
13  * trademarks of Sun Microsystems, Inc. in the U.S. and other countries. This
14  * product is covered and controlled by U.S. Export Control laws and may be
15  * subject to the export or import laws in other countries. Nuclear, missile,
16  * chemical biological weapons or nuclear maritime end uses or end users,
17  * whether direct or indirect, are strictly prohibited. Export or reexport
18  * to countries subject to U.S. embargo or to entities identified on U.S.
19  * export exclusion lists, including, but not limited to, the denied persons
20  * and specially designated nationals lists is strictly prohibited.
21  */

22
23 package org.javacc.parser;
24
25 import java.util.*;
26 import java.io.*;
27
28 public class ParseGen extends JavaCCGlobals implements JavaCCParserConstants {
29
30   static public void start() throws MetaParseException {
31
32     Token t = null;
33
34     if (JavaCCErrors.get_error_count() != 0) throw new MetaParseException();
35
36     if (Options.B("BUILD_PARSER")) {
37
38       try {
39         ostr = new PrintWriter(
40                   new BufferedWriter(
41                      new FileWriter(
42                        new File(outputDir, cu_name + ".java")
43                      ),
44                      8192
45                   )
46                );
47       } catch (IOException e) {
48         JavaCCErrors.semantic_error("Could not open file " + cu_name + ".java for writing.");
49         throw new Error();
50       }
51
52       Vector tn = (Vector)(toolNames.clone());
53       tn.addElement(toolName);
54       ostr.println("/* " + getIdString(tn, cu_name + ".java") + " */");
55
56       boolean implementsExists = false;
57
58       if (cu_to_insertion_point_1.size() != 0) {
59         printTokenSetup((Token)(cu_to_insertion_point_1.elementAt(0))); ccol = 1;
60         for (Enumeration enum = cu_to_insertion_point_1.elements(); enum.hasMoreElements();) {
61           t = (Token)enum.nextElement();
62           if (t.kind == IMPLEMENTS) {
63             implementsExists = true;
64           } else if (t.kind == CLASS) {
65             implementsExists = false;
66           }
67           printToken(t, ostr);
68         }
69       }
70       if (implementsExists) {
71         ostr.print(", ");
72       } else {
73         ostr.print(" implements ");
74       }
75       ostr.print(cu_name + "Constants ");
76       if (cu_to_insertion_point_2.size() != 0) {
77         printTokenSetup((Token)(cu_to_insertion_point_2.elementAt(0)));
78         for (Enumeration enum = cu_to_insertion_point_2.elements(); enum.hasMoreElements();) {
79           t = (Token)enum.nextElement();
80           printToken(t, ostr);
81         }
82       }
83
84       ostr.println("");
85       ostr.println("");
86
87       ParseEngine.build(ostr);
88
89       if (Options.B("STATIC")) {
90         ostr.println(" static private boolean jj_initialized_once = false;");
91       }
92       if (Options.B("USER_TOKEN_MANAGER")) {
93         ostr.println(" " + staticOpt() + "public TokenManager token_source;");
94       } else {
95         ostr.println(" " + staticOpt() + "public " + cu_name + "TokenManager token_source;");
96     if (!Options.B("USER_CHAR_STREAM")) {
97       if (Options.B("JAVA_UNICODE_ESCAPE")) {
98         ostr.println(" " + staticOpt() + "JavaCharStream jj_input_stream;");
99       } else {
100         ostr.println(" " + staticOpt() + "SimpleCharStream jj_input_stream;");
101       }
102     }
103       }
104       ostr.println(" " + staticOpt() + "public Token token, jj_nt;");
105       if (!Options.B("CACHE_TOKENS")) {
106     ostr.println(" " + staticOpt() + "private int jj_ntk;");
107       }
108       if (jj2index != 0) {
109         ostr.println(" " + staticOpt() + "private Token jj_scanpos, jj_lastpos;");
110         ostr.println(" " + staticOpt() + "private int jj_la;");
111         ostr.println(" " + staticOpt() + "public boolean lookingAhead = false;");
112         ostr.println(" " + staticOpt() + "private boolean jj_semLA;");
113       }
114       if (Options.B("ERROR_REPORTING")) {
115         ostr.println(" " + staticOpt() + "private int jj_gen;");
116         ostr.println(" " + staticOpt() + "final private int[] jj_la1 = new int[" + maskindex + "];");
117     int tokenMaskSize = (tokenCount-1)/32 + 1;
118     for (int i = 0; i < tokenMaskSize; i++)
119       ostr.println(" static private int[] jj_la1_" + i + ";");
120     ostr.println(" static {");
121     for (int i = 0; i < tokenMaskSize; i++)
122       ostr.println(" jj_la1_" + i + "();");
123     ostr.println(" }");
124     for (int i = 0; i < tokenMaskSize; i++) {
125       ostr.println(" private static void jj_la1_" + i + "() {");
126       ostr.print(" jj_la1_" + i + " = new int[] {");
127       for (Enumeration enum = maskVals.elements(); enum.hasMoreElements();) {
128         int[] tokenMask = (int[])(enum.nextElement());
129         ostr.print("0x" + Integer.toHexString(tokenMask[i]) + ",");
130       }
131       ostr.println("};");
132       ostr.println(" }");
133     }
134       }
135       if (jj2index != 0 && Options.B("ERROR_REPORTING")) {
136         ostr.println(" " + staticOpt() + "final private JJCalls[] jj_2_rtns = new JJCalls[" + jj2index + "];");
137         ostr.println(" " + staticOpt() + "private boolean jj_rescan = false;");
138         ostr.println(" " + staticOpt() + "private int jj_gc = 0;");
139       }
140       ostr.println("");
141
142       if (!Options.B("USER_TOKEN_MANAGER")) {
143         if (Options.B("USER_CHAR_STREAM")) {
144           ostr.println(" public " + cu_name + "(CharStream stream) {");
145           if (Options.B("STATIC")) {
146             ostr.println(" if (jj_initialized_once) {");
147             ostr.println(" System.out.println(\"ERROR: Second call to constructor of static parser. You must\");");
148             ostr.println(" System.out.println(\" either use ReInit() or set the JavaCC option STATIC to false\");");
149             ostr.println(" System.out.println(\" during parser generation.\");");
150             ostr.println(" throw new Error();");
151             ostr.println(" }");
152             ostr.println(" jj_initialized_once = true;");
153           }
154           ostr.println(" token_source = new " + cu_name + "TokenManager(stream);");
155           ostr.println(" token = new Token();");
156       if (Options.B("CACHE_TOKENS")) {
157         ostr.println(" token.next = jj_nt = token_source.getNextToken();");
158       } else {
159         ostr.println(" jj_ntk = -1;");
160       }
161           if (Options.B("ERROR_REPORTING")) {
162             ostr.println(" jj_gen = 0;");
163             ostr.println(" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
164             if (jj2index != 0) {
165               ostr.println(" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
166             }
167           }
168           ostr.println(" }");
169           ostr.println("");
170           ostr.println(" " + staticOpt() + "public void ReInit(CharStream stream) {");
171           ostr.println(" token_source.ReInit(stream);");
172           ostr.println(" token = new Token();");
173       if (Options.B("CACHE_TOKENS")) {
174         ostr.println(" token.next = jj_nt = token_source.getNextToken();");
175       } else {
176         ostr.println(" jj_ntk = -1;");
177       }
178           if (jjtreeGenerated) {
179             ostr.println(" jjtree.reset();");
180           }
181           if (Options.B("ERROR_REPORTING")) {
182             ostr.println(" jj_gen = 0;");
183             ostr.println(" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
184             if (jj2index != 0) {
185               ostr.println(" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
186             }
187           }
188           ostr.println(" }");
189         } else {
190           ostr.println(" public " + cu_name + "(java.io.InputStream stream) {");
191           if (Options.B("STATIC")) {
192             ostr.println(" if (jj_initialized_once) {");
193             ostr.println(" System.out.println(\"ERROR: Second call to constructor of static parser. You must\");");
194             ostr.println(" System.out.println(\" either use ReInit() or set the JavaCC option STATIC to false\");");
195             ostr.println(" System.out.println(\" during parser generation.\");");
196             ostr.println(" throw new Error();");
197             ostr.println(" }");
198             ostr.println(" jj_initialized_once = true;");
199           }
200           if (Options.B("JAVA_UNICODE_ESCAPE")) {
201             ostr.println(" jj_input_stream = new JavaCharStream(stream, 1, 1);");
202           } else {
203             ostr.println(" jj_input_stream = new SimpleCharStream(stream, 1, 1);");
204           }
205           ostr.println(" token_source = new " + cu_name + "TokenManager(jj_input_stream);");
206           ostr.println(" token = new Token();");
207       if (Options.B("CACHE_TOKENS")) {
208         ostr.println(" token.next = jj_nt = token_source.getNextToken();");
209       } else {
210         ostr.println(" jj_ntk = -1;");
211       }
212           if (Options.B("ERROR_REPORTING")) {
213             ostr.println(" jj_gen = 0;");
214             ostr.println(" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
215             if (jj2index != 0) {
216               ostr.println(" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
217             }
218           }
219           ostr.println(" }");
220           ostr.println("");
221           ostr.println(" " + staticOpt() + "public void ReInit(java.io.InputStream stream) {");
222           if (Options.B("JAVA_UNICODE_ESCAPE")) {
223             ostr.println(" jj_input_stream.ReInit(stream, 1, 1);");
224           } else {
225             ostr.println(" jj_input_stream.ReInit(stream, 1, 1);");
226           }
227           ostr.println(" token_source.ReInit(jj_input_stream);");
228           ostr.println(" token = new Token();");
229       if (Options.B("CACHE_TOKENS")) {
230         ostr.println(" token.next = jj_nt = token_source.getNextToken();");
231       } else {
232         ostr.println(" jj_ntk = -1;");
233       }
234           if (jjtreeGenerated) {
235             ostr.println(" jjtree.reset();");
236           }
237           if (Options.B("ERROR_REPORTING")) {
238             ostr.println(" jj_gen = 0;");
239             ostr.println(" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
240             if (jj2index != 0) {
241               ostr.println(" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
242             }
243           }
244           ostr.println(" }");
245       ostr.println("");
246           ostr.println(" public " + cu_name + "(java.io.Reader stream) {");
247           if (Options.B("STATIC")) {
248             ostr.println(" if (jj_initialized_once) {");
249             ostr.println(" System.out.println(\"ERROR: Second call to constructor of static parser. You must\");");
250             ostr.println(" System.out.println(\" either use ReInit() or set the JavaCC option STATIC to false\");");
251             ostr.println(" System.out.println(\" during parser generation.\");");
252             ostr.println(" throw new Error();");
253             ostr.println(" }");
254             ostr.println(" jj_initialized_once = true;");
255           }
256           if (Options.B("JAVA_UNICODE_ESCAPE")) {
257             ostr.println(" jj_input_stream = new JavaCharStream(stream, 1, 1);");
258           } else {
259             ostr.println(" jj_input_stream = new SimpleCharStream(stream, 1, 1);");
260           }
261           ostr.println(" token_source = new " + cu_name + "TokenManager(jj_input_stream);");
262           ostr.println(" token = new Token();");
263       if (Options.B("CACHE_TOKENS")) {
264         ostr.println(" token.next = jj_nt = token_source.getNextToken();");
265       } else {
266         ostr.println(" jj_ntk = -1;");
267       }
268           if (Options.B("ERROR_REPORTING")) {
269             ostr.println(" jj_gen = 0;");
270             ostr.println(" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
271             if (jj2index != 0) {
272               ostr.println(" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
273             }
274           }
275           ostr.println(" }");
276           ostr.println("");
277           ostr.println(" " + staticOpt() + "public void ReInit(java.io.Reader stream) {");
278           if (Options.B("JAVA_UNICODE_ESCAPE")) {
279             ostr.println(" jj_input_stream.ReInit(stream, 1, 1);");
280           } else {
281             ostr.println(" jj_input_stream.ReInit(stream, 1, 1);");
282           }
283           ostr.println(" token_source.ReInit(jj_input_stream);");
284           ostr.println(" token = new Token();");
285       if (Options.B("CACHE_TOKENS")) {
286         ostr.println(" token.next = jj_nt = token_source.getNextToken();");
287       } else {
288         ostr.println(" jj_ntk = -1;");
289       }
290           if (jjtreeGenerated) {
291             ostr.println(" jjtree.reset();");
292           }
293           if (Options.B("ERROR_REPORTING")) {
294             ostr.println(" jj_gen = 0;");
295             ostr.println(" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
296             if (jj2index != 0) {
297               ostr.println(" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
298             }
299           }
300           ostr.println(" }");
301         }
302       }
303       ostr.println("");
304       if (Options.B("USER_TOKEN_MANAGER")) {
305         ostr.println(" public " + cu_name + "(TokenManager tm) {");
306       } else {
307         ostr.println(" public " + cu_name + "(" + cu_name + "TokenManager tm) {");
308       }
309       if (Options.B("STATIC")) {
310         ostr.println(" if (jj_initialized_once) {");
311         ostr.println(" System.out.println(\"ERROR: Second call to constructor of static parser. You must\");");
312         ostr.println(" System.out.println(\" either use ReInit() or set the JavaCC option STATIC to false\");");
313         ostr.println(" System.out.println(\" during parser generation.\");");
314         ostr.println(" throw new Error();");
315         ostr.println(" }");
316         ostr.println(" jj_initialized_once = true;");
317       }
318       ostr.println(" token_source = tm;");
319       ostr.println(" token = new Token();");
320       if (Options.B("CACHE_TOKENS")) {
321     ostr.println(" token.next = jj_nt = token_source.getNextToken();");
322       } else {
323     ostr.println(" jj_ntk = -1;");
324       }
325       if (Options.B("ERROR_REPORTING")) {
326         ostr.println(" jj_gen = 0;");
327         ostr.println(" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
328         if (jj2index != 0) {
329           ostr.println(" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
330         }
331       }
332       ostr.println(" }");
333       ostr.println("");
334       if (Options.B("USER_TOKEN_MANAGER")) {
335         ostr.println(" public void ReInit(TokenManager tm) {");
336       } else {
337         ostr.println(" public void ReInit(" + cu_name + "TokenManager tm) {");
338       }
339       ostr.println(" token_source = tm;");
340       ostr.println(" token = new Token();");
341       if (Options.B("CACHE_TOKENS")) {
342     ostr.println(" token.next = jj_nt = token_source.getNextToken();");
343       } else {
344     ostr.println(" jj_ntk = -1;");
345       }
346       if (jjtreeGenerated) {
347         ostr.println(" jjtree.reset();");
348       }
349       if (Options.B("ERROR_REPORTING")) {
350         ostr.println(" jj_gen = 0;");
351         ostr.println(" for (int i = 0; i < " + maskindex + "; i++) jj_la1[i] = -1;");
352         if (jj2index != 0) {
353           ostr.println(" for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();");
354         }
355       }
356       ostr.println(" }");
357       ostr.println("");
358       ostr.println(" " + staticOpt() + "final private Token jj_consume_token(int kind) throws ParseException {");
359       if (Options.B("CACHE_TOKENS")) {
360     ostr.println(" Token oldToken = token;");
361     ostr.println(" if ((token = jj_nt).next != null) jj_nt = jj_nt.next;");
362     ostr.println(" else jj_nt = jj_nt.next = token_source.getNextToken();");
363       } else {
364     ostr.println(" Token oldToken;");
365     ostr.println(" if ((oldToken = token).next != null) token = token.next;");
366     ostr.println(" else token = token.next = token_source.getNextToken();");
367     ostr.println(" jj_ntk = -1;");
368       }
369       ostr.println(" if (token.kind == kind) {");
370       if (Options.B("ERROR_REPORTING")) {
371         ostr.println(" jj_gen++;");
372     if (jj2index != 0) {
373       ostr.println(" if (++jj_gc > 100) {");
374       ostr.println(" jj_gc = 0;");
375       ostr.println(" for (int i = 0; i < jj_2_rtns.length; i++) {");
376       ostr.println(" JJCalls c = jj_2_rtns[i];");
377       ostr.println(" while (c != null) {");
378       ostr.println(" if (c.gen < jj_gen) c.first = null;");
379       ostr.println(" c = c.next;");
380       ostr.println(" }");
381       ostr.println(" }");
382       ostr.println(" }");
383     }
384       }
385       if (Options.B("DEBUG_PARSER")) {
386         ostr.println(" trace_token(token, \"\");");
387       }
388       ostr.println(" return token;");
389       ostr.println(" }");
390       if (Options.B("CACHE_TOKENS")) {
391     ostr.println(" jj_nt = token;");
392       }
393       ostr.println(" token = oldToken;");
394       if (Options.B("ERROR_REPORTING")) {
395         ostr.println(" jj_kind = kind;");
396       }
397       ostr.println(" throw generateParseException();");
398       ostr.println(" }");
399       ostr.println("");
400       if (jj2index != 0) {
401         ostr.println(" static private final class LookaheadSuccess extends java.lang.Error { }");
402         ostr.println(" " + staticOpt() + "final private LookaheadSuccess jj_ls = new LookaheadSuccess();");
403         ostr.println(" " + staticOpt() + "final private boolean jj_scan_token(int kind) {");
404         ostr.println(" if (jj_scanpos == jj_lastpos) {");
405         ostr.println(" jj_la--;");
406         ostr.println(" if (jj_scanpos.next == null) {");
407         ostr.println(" jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();");
408         ostr.println(" } else {");
409         ostr.println(" jj_lastpos = jj_scanpos = jj_scanpos.next;");
410         ostr.println(" }");
411         ostr.println(" } else {");
412         ostr.println(" jj_scanpos = jj_scanpos.next;");
413         ostr.println(" }");
414         if (Options.B("ERROR_REPORTING")) {
415           ostr.println(" if (jj_rescan) {");
416           ostr.println(" int i = 0; Token tok = token;");
417           ostr.println(" while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }");
418           ostr.println(" if (tok != null) jj_add_error_token(kind, i);");
419           if (Options.B("DEBUG_LOOKAHEAD")) {
420             ostr.println(" } else {");
421             ostr.println(" trace_scan(jj_scanpos, kind);");
422           }
423           ostr.println(" }");
424         } else if (Options.B("DEBUG_LOOKAHEAD")) {
425           ostr.println(" trace_scan(jj_scanpos, kind);");
426         }
427         ostr.println(" if (jj_scanpos.kind != kind) return true;");
428         ostr.println(" if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;");
429         ostr.println(" return false;");
430         ostr.println(" }");
431         ostr.println("");
432       }
433       ostr.println(" " + staticOpt() + "final public Token getNextToken() {");
434       if (Options.B("CACHE_TOKENS")) {
435     ostr.println(" if ((token = jj_nt).next != null) jj_nt = jj_nt.next;");
436     ostr.println(" else jj_nt = jj_nt.next = token_source.getNextToken();");
437       } else {
438     ostr.println(" if (token.next != null) token = token.next;");
439     ostr.println(" else token = token.next = token_source.getNextToken();");
440     ostr.println(" jj_ntk = -1;");
441       }
442       if (Options.B("ERROR_REPORTING")) {
443         ostr.println(" jj_gen++;");
444       }
445       if (Options.B("DEBUG_PARSER")) {
446         ostr.println(" trace_token(token, \" (in getNextToken)\");");
447       }
448       ostr.println(" return token;");
449       ostr.println(" }");
450       ostr.println("");
451       ostr.println(" " + staticOpt() + "final public Token getToken(int index) {");
452       if (jj2index != 0) {
453         ostr.println(" Token t = lookingAhead ? jj_scanpos : token;");
454       } else {
455         ostr.println(" Token t = token;");
456       }
457       ostr.println(" for (int i = 0; i < index; i++) {");
458       ostr.println(" if (t.next != null) t = t.next;");
459       ostr.println(" else t = t.next = token_source.getNextToken();");
460       ostr.println(" }");
461       ostr.println(" return t;");
462       ostr.println(" }");
463       ostr.println("");
464       if (!Options.B("CACHE_TOKENS")) {
465     ostr.println(" " + staticOpt() + "final private int jj_ntk() {");
466     ostr.println(" if ((jj_nt=token.next) == null)");
467     ostr.println(" return (jj_ntk = (token.next=token_source.getNextToken()).kind);");
468     ostr.println(" else");
469     ostr.println(" return (jj_ntk = jj_nt.kind);");
470     ostr.println(" }");
471     ostr.println("");
472       }
473       if (Options.B("ERROR_REPORTING")) {
474         ostr.println(" " + staticOpt() + "private java.util.Vector jj_expentries = new java.util.Vector();");
475         ostr.println(" " + staticOpt() + "private int[] jj_expentry;");
476         ostr.println(" " + staticOpt() + "private int jj_kind = -1;");
477         if (jj2index != 0) {
478           ostr.println(" " + staticOpt() + "private int[] jj_lasttokens = new int[100];");
479           ostr.println(" " + staticOpt() + "private int jj_endpos;");
480           ostr.println("");
481           ostr.println(" " + staticOpt() + "private void jj_add_error_token(int kind, int pos) {");
482           ostr.println(" if (pos >= 100) return;");
483           ostr.println(" if (pos == jj_endpos + 1) {");
484           ostr.println(" jj_lasttokens[jj_endpos++] = kind;");
485           ostr.println(" } else if (jj_endpos != 0) {");
486           ostr.println(" jj_expentry = new int[jj_endpos];");
487           ostr.println(" for (int i = 0; i < jj_endpos; i++) {");
488           ostr.println(" jj_expentry[i] = jj_lasttokens[i];");
489           ostr.println(" }");
490           ostr.println(" boolean exists = false;");
491           ostr.println(" for (java.util.Enumeration e = jj_expentries.elements(); e.hasMoreElements();) {");
492           ostr.println(" int[] oldentry = (int[])(e.nextElement());");
493           ostr.println(" if (oldentry.length == jj_expentry.length) {");
494           ostr.println(" exists = true;");
495           ostr.println(" for (int i = 0; i < jj_expentry.length; i++) {");
496           ostr.println(" if (oldentry[i] != jj_expentry[i]) {");
497           ostr.println(" exists = false;");
498           ostr.println(" break;");
499           ostr.println(" }");
500           ostr.println(" }");
501           ostr.println(" if (exists) break;");
502           ostr.println(" }");
503           ostr.println(" }");
504           ostr.println(" if (!exists) jj_expentries.addElement(jj_expentry);");
505           ostr.println(" if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;");
506           ostr.println(" }");
507           ostr.println(" }");
508         }
509         ostr.println("");
510         ostr.println(" " + staticOpt() + "public ParseException generateParseException() {");
511         ostr.println(" jj_expentries.removeAllElements();");
512         ostr.println(" boolean[] la1tokens = new boolean[" + tokenCount + "];");
513         ostr.println(" for (int i = 0; i < " + tokenCount + "; i++) {");
514         ostr.println(" la1tokens[i] = false;");
515         ostr.println(" }");
516         ostr.println(" if (jj_kind >= 0) {");
517         ostr.println(" la1tokens[jj_kind] = true;");
518         ostr.println(" jj_kind = -1;");
519         ostr.println(" }");
520         ostr.println(" for (int i = 0; i < " + maskindex + "; i++) {");
521         ostr.println(" if (jj_la1[i] == jj_gen) {");
522         ostr.println(" for (int j = 0; j < 32; j++) {");
523     for (int i = 0; i < (tokenCount-1)/32 + 1; i++) {
524       ostr.println(" if ((jj_la1_" + i + "[i] & (1<<j)) != 0) {");
525       ostr.print(" la1tokens[");
526       if (i != 0) {
527         ostr.print((32*i) + "+");
528       }
529       ostr.println("j] = true;");
530       ostr.println(" }");
531     }
532         ostr.println(" }");
533         ostr.println(" }");
534         ostr.println(" }");
535         ostr.println(" for (int i = 0; i < " + tokenCount + "; i++) {");
536         ostr.println(" if (la1tokens[i]) {");
537         ostr.println(" jj_expentry = new int[1];");
538         ostr.println(" jj_expentry[0] = i;");
539         ostr.println(" jj_expentries.addElement(jj_expentry);");
540         ostr.println(" }");
541         ostr.println(" }");
542         if (jj2index != 0) {
543           ostr.println(" jj_endpos = 0;");
544           ostr.println(" jj_rescan_token();");
545           ostr.println(" jj_add_error_token(0, 0);");
546         }
547         ostr.println(" int[][] exptokseq = new int[jj_expentries.size()][];");
548         ostr.println(" for (int i = 0; i < jj_expentries.size(); i++) {");
549         ostr.println(" exptokseq[i] = (int[])jj_expentries.elementAt(i);");
550         ostr.println(" }");
551         ostr.println(" return new ParseException(token, exptokseq, tokenImage);");
552         ostr.println(" }");
553       } else {
554         ostr.println(" " + staticOpt() + "public ParseException generateParseException() {");
555         ostr.println(" Token errortok = token.next;");
556         if (Options.B("KEEP_LINE_COLUMN"))
557            ostr.println(" int line = errortok.beginLine, column = errortok.beginColumn;");
558         ostr.println(" String mess = (errortok.kind == 0) ? tokenImage[0] : errortok.image;");
559         if (Options.B("KEEP_LINE_COLUMN"))
560            ostr.println(" return new ParseException(\"Parse error at line \" + line + \", column \" + column + \". Encountered: \" + mess);");
561         else
562            ostr.println(" return new ParseException(\"Parse error at <unknown location>. Encountered: \" + mess);");
563         ostr.println(" }");
564       }
565       ostr.println("");
566
567       if (Options.B("DEBUG_PARSER")) {
568         ostr.println(" " + staticOpt() + "private int trace_indent = 0;");
569         ostr.println(" " + staticOpt() + "private boolean trace_enabled = true;");
570         ostr.println("");
571         ostr.println(" " + staticOpt() + "final public void enable_tracing() {");
572         ostr.println(" trace_enabled = true;");
573         ostr.println(" }");
574         ostr.println("");
575         ostr.println(" " + staticOpt() + "final public void disable_tracing() {");
576         ostr.println(" trace_enabled = false;");
577         ostr.println(" }");
578         ostr.println("");
579         ostr.println(" " + staticOpt() + "final private void trace_call(String s) {");
580         ostr.println(" if (trace_enabled) {");
581         ostr.println(" for (int i = 0; i < trace_indent; i++) { System.out.print(\" \"); }");
582         ostr.println(" System.out.println(\"Call: \" + s);");
583         ostr.println(" }");
584         ostr.println(" trace_indent = trace_indent + 2;");
585         ostr.println(" }");
586         ostr.println("");
587         ostr.println(" " + staticOpt() + "final private void trace_return(String s) {");
588         ostr.println(" trace_indent = trace_indent - 2;");
589         ostr.println(" if (trace_enabled) {");
590         ostr.println(" for (int i = 0; i < trace_indent; i++) { System.out.print(\" \"); }");
591         ostr.println(" System.out.println(\"Return: \" + s);");
592         ostr.println(" }");
593         ostr.println(" }");
594         ostr.println("");
595         ostr.println(" " + staticOpt() + "final private void trace_token(Token t, String where) {");
596         ostr.println(" if (trace_enabled) {");
597         ostr.println(" for (int i = 0; i < trace_indent; i++) { System.out.print(\" \"); }");
598         ostr.println(" System.out.print(\"Consumed token: <\" + tokenImage[t.kind]);");
599         ostr.println(" if (t.kind != 0 && !tokenImage[t.kind].equals(\"\\\"\" + t.image + \"\\\"\")) {");
600         ostr.println(" System.out.print(\": \\\"\" + t.image + \"\\\"\");");
601         ostr.println(" }");
602         ostr.println(" System.out.println(\">\" + where);");
603         ostr.println(" }");
604         ostr.println(" }");
605         ostr.println("");
606         ostr.println(" " + staticOpt() + "final private void trace_scan(Token t1, int t2) {");
607         ostr.println(" if (trace_enabled) {");
608         ostr.println(" for (int i = 0; i < trace_indent; i++) { System.out.print(\" \"); }");
609         ostr.println(" System.out.print(\"Visited token: <\" + tokenImage[t1.kind]);");
610         ostr.println(" if (t1.kind != 0 && !tokenImage[t1.kind].equals(\"\\\"\" + t1.image + \"\\\"\")) {");
611         ostr.println(" System.out.print(\": \\\"\" + t1.image + \"\\\"\");");
612         ostr.println(" }");
613         ostr.println(" System.out.println(\">; Expected token: <\" + tokenImage[t2] + \">\");");
614         ostr.println(" }");
615         ostr.println(" }");
616         ostr.println("");
617       } else {
618         ostr.println(" " + staticOpt() + "final public void enable_tracing() {");
619         ostr.println(" }");
620         ostr.println("");
621         ostr.println(" " + staticOpt() + "final public void disable_tracing() {");
622         ostr.println(" }");
623         ostr.println("");
624       }
625
626       if (jj2index != 0 && Options.B("ERROR_REPORTING")) {
627         ostr.println(" " + staticOpt() + "final private void jj_rescan_token() {");
628         ostr.println(" jj_rescan = true;");
629         ostr.println(" for (int i = 0; i < " + jj2index + "; i++) {");
630         ostr.println(" JJCalls p = jj_2_rtns[i];");
631         ostr.println(" do {");
632         ostr.println(" if (p.gen > jj_gen) {");
633         ostr.println(" jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;");
634         ostr.println(" switch (i) {");
635         for (int i = 0; i < jj2index; i++) {
636           ostr.println(" case " + i + ": jj_3_" + (i+1) + "(); break;");
637         }
638         ostr.println(" }");
639         ostr.println(" }");
640         ostr.println(" p = p.next;");
641         ostr.println(" } while (p != null);");
642         ostr.println(" }");
643         ostr.println(" jj_rescan = false;");
644         ostr.println(" }");
645         ostr.println("");
646         ostr.println(" " + staticOpt() + "final private void jj_save(int index, int xla) {");
647         ostr.println(" JJCalls p = jj_2_rtns[index];");
648         ostr.println(" while (p.gen > jj_gen) {");
649         ostr.println(" if (p.next == null) { p = p.next = new JJCalls(); break; }");
650         ostr.println(" p = p.next;");
651         ostr.println(" }");
652         ostr.println(" p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;");
653         ostr.println(" }");
654         ostr.println("");
655       }
656
657       if (jj2index != 0 && Options.B("ERROR_REPORTING")) {
658         ostr.println(" static final class JJCalls {");
659         ostr.println(" int gen;");
660         ostr.println(" Token first;");
661         ostr.println(" int arg;");
662         ostr.println(" JJCalls next;");
663         ostr.println(" }");
664         ostr.println("");
665       }
666
667       if (cu_from_insertion_point_2.size() != 0) {
668         printTokenSetup((Token)(cu_from_insertion_point_2.elementAt(0))); ccol = 1;
669         for (Enumeration enum = cu_from_insertion_point_2.elements(); enum.hasMoreElements();) {
670           t = (Token)enum.nextElement();
671           printToken(t, ostr);
672         }
673         printTrailingComments(t, ostr);
674       }
675       ostr.println("");
676
677       ostr.close();
678
679     } // matches "if (Options.B("BUILD_PARSER"))"
680

681   }
682
683   static private PrintWriter ostr;
684
685    public static void reInit()
686    {
687       ostr = null;
688    }
689
690 }
691
Popular Tags