View Javadoc
1   /* Generated By:JavaCC: Do not edit this line. DTDInitialParser.java */
2   package org.exolab.castor.xml.dtd.parser;
3   
4   import java.util.Hashtable;
5   
6   import org.exolab.castor.xml.dtd.DTDException;
7   
8   /**
9    * Initial XML DTD parser. Searches for <b>parameter entity</b> declarations and substitutes
10   * <b>parameter entity references</b> by corresponding <b>replacement text</b>.
11   * 
12   * @author <a href="mailto:totok@intalio.com">Alexander Totok</a>
13   * @version $Revision$ $Date: 2006-04-14 04:14:43 -0600 (Fri, 14 Apr 2006) $
14   */
15  public class DTDInitialParser implements DTDInitialParserConstants {
16  
17    /**
18     * Main method that starts parsing process.
19     * 
20     * @return result of the parsing process - document with parameter entity references expaned.
21     */
22    final public String Input() throws ParseException, DTDException {
23      Hashtable parameterEntities = new Hashtable();
24      String result = "";
25      Token token;
26      String peReference;
27      String key;
28      String value;
29      label_1: while (true) {
30        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
31          case TEXT_UNIT:
32          case BEGIN_PE_DECL:
33          case PE_REFERENCE_D:
34            break;
35          default:
36            jj_la1[0] = jj_gen;
37            break label_1;
38        }
39        switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
40          case TEXT_UNIT:
41            token = jj_consume_token(TEXT_UNIT);
42            result += token.image;
43            break;
44          case PE_REFERENCE_D:
45            token = jj_consume_token(PE_REFERENCE_D);
46            peReference = token.image;
47            key = peReference.substring(1, peReference.length() - 1);
48            value = (String) parameterEntities.get(key);
49            if (value == null) {
50              String err = "Initial Parser: parameter entity named \"" + key;
51              err += "\" has not been defined, while is tried to be referenced...";
52              {
53                if (true)
54                  throw new DTDException(err);
55              }
56            } else {
57              result += value;
58            }
59            break;
60          case BEGIN_PE_DECL:
61            PEdecl(parameterEntities);
62            break;
63          default:
64            jj_la1[1] = jj_gen;
65            jj_consume_token(-1);
66            throw new ParseException();
67        }
68      }
69      jj_consume_token(0);
70      {
71        if (true)
72          return result;
73      }
74      throw new Error("Missing return statement in function");
75    }
76  
77    /**
78     * Parsing procedure corresponding to the <b>Parameter Entity Declaration</b> nonterminal.
79     */
80    final public void PEdecl(Hashtable parameterEntities) throws ParseException, DTDException {
81      Token token;
82      String name;
83      String replacementText;
84      jj_consume_token(BEGIN_PE_DECL);
85      token = jj_consume_token(NAME_OF_PE);
86      name = token.image;
87      if (parameterEntities.containsKey(name)) {
88        String err = "Initial Parser: parameter entity named \"" + name;
89        err += "\" has been already defined, while is tried ";
90        err += "to be defined again...";
91        {
92          if (true)
93            throw new DTDException(err);
94        }
95      }
96      jj_consume_token(SPACE);
97      replacementText = EntityValue(parameterEntities);
98      parameterEntities.put(name, replacementText);
99      switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
100       case SPACE:
101         jj_consume_token(SPACE);
102         break;
103       default:
104         jj_la1[2] = jj_gen;
105     }
106     jj_consume_token(END_PE_DECL);
107   }
108 
109   /**
110    * Parsing procedure corresponding to the <b>Entity Value</b> nonterminal.
111    */
112   final public String EntityValue(Hashtable parameterEntities) throws ParseException, DTDException {
113     Token token;
114     String peReference;
115     String key;
116     String value;
117     String replacementText = "";
118     switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
119       case START_DQ:
120         jj_consume_token(START_DQ);
121         label_2: while (true) {
122           switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
123             case ENTITY_VALUE_TEXT_DQ:
124             case PE_REFERENCE_DQ:
125               break;
126             default:
127               jj_la1[3] = jj_gen;
128               break label_2;
129           }
130           switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
131             case ENTITY_VALUE_TEXT_DQ:
132               token = jj_consume_token(ENTITY_VALUE_TEXT_DQ);
133               replacementText += token.image;
134               break;
135             case PE_REFERENCE_DQ:
136               token = jj_consume_token(PE_REFERENCE_DQ);
137               peReference = token.image;
138               key = peReference.substring(1, peReference.length() - 1);
139               value = (String) parameterEntities.get(key);
140               if (value == null) {
141                 String err = "Initial Parser: parameter entity named \"" + key;
142                 err += "\" has not been defined, while is tried to be referenced...";
143                 {
144                   if (true)
145                     throw new DTDException(err);
146                 }
147               } else {
148                 replacementText += value;
149               }
150               break;
151             default:
152               jj_la1[4] = jj_gen;
153               jj_consume_token(-1);
154               throw new ParseException();
155           }
156         }
157         jj_consume_token(END_DQ);
158         break;
159       case START_SQ:
160         jj_consume_token(START_SQ);
161         label_3: while (true) {
162           switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
163             case ENTITY_VALUE_TEXT_SQ:
164             case PE_REFERENCE_SQ:
165               break;
166             default:
167               jj_la1[5] = jj_gen;
168               break label_3;
169           }
170           switch ((jj_ntk == -1) ? jj_ntk() : jj_ntk) {
171             case ENTITY_VALUE_TEXT_SQ:
172               token = jj_consume_token(ENTITY_VALUE_TEXT_SQ);
173               replacementText += token.image;
174               break;
175             case PE_REFERENCE_SQ:
176               token = jj_consume_token(PE_REFERENCE_SQ);
177               peReference = token.image;
178               key = peReference.substring(1, peReference.length() - 1);
179               value = (String) parameterEntities.get(key);
180               if (value == null) {
181                 String err = "Initial Parser: parameter entity named \"" + key;
182                 err += "\" has not been defined, while is tried to be referenced...";
183                 {
184                   if (true)
185                     throw new DTDException(err);
186                 }
187               } else {
188                 replacementText += value;
189               }
190               break;
191             default:
192               jj_la1[6] = jj_gen;
193               jj_consume_token(-1);
194               throw new ParseException();
195           }
196         }
197         jj_consume_token(END_SQ);
198         break;
199       default:
200         jj_la1[7] = jj_gen;
201         jj_consume_token(-1);
202         throw new ParseException();
203     }
204     {
205       if (true)
206         return replacementText;
207     }
208     throw new Error("Missing return statement in function");
209   }
210 
211   public DTDInitialParserTokenManager token_source;
212   public Token token, jj_nt;
213   private int jj_ntk;
214   private int jj_gen;
215   final private int[] jj_la1 = new int[8];
216   final private int[] jj_la1_0 =
217       {0x700, 0x700, 0x1000, 0x30000, 0x30000, 0x180000, 0x180000, 0x6000,};
218 
219   public DTDInitialParser(CharStream stream) {
220     token_source = new DTDInitialParserTokenManager(stream);
221     token = new Token();
222     jj_ntk = -1;
223     jj_gen = 0;
224     for (int i = 0; i < 8; i++)
225       jj_la1[i] = -1;
226   }
227 
228   public void ReInit(CharStream stream) {
229     token_source.ReInit(stream);
230     token = new Token();
231     jj_ntk = -1;
232     jj_gen = 0;
233     for (int i = 0; i < 8; i++)
234       jj_la1[i] = -1;
235   }
236 
237   public DTDInitialParser(DTDInitialParserTokenManager tm) {
238     token_source = tm;
239     token = new Token();
240     jj_ntk = -1;
241     jj_gen = 0;
242     for (int i = 0; i < 8; i++)
243       jj_la1[i] = -1;
244   }
245 
246   public void ReInit(DTDInitialParserTokenManager tm) {
247     token_source = tm;
248     token = new Token();
249     jj_ntk = -1;
250     jj_gen = 0;
251     for (int i = 0; i < 8; i++)
252       jj_la1[i] = -1;
253   }
254 
255   final private Token jj_consume_token(int kind) throws ParseException {
256     Token oldToken;
257     if ((oldToken = token).next != null)
258       token = token.next;
259     else
260       token = token.next = token_source.getNextToken();
261     jj_ntk = -1;
262     if (token.kind == kind) {
263       jj_gen++;
264       return token;
265     }
266     token = oldToken;
267     jj_kind = kind;
268     throw generateParseException();
269   }
270 
271   final public Token getNextToken() {
272     if (token.next != null)
273       token = token.next;
274     else
275       token = token.next = token_source.getNextToken();
276     jj_ntk = -1;
277     jj_gen++;
278     return token;
279   }
280 
281   final public Token getToken(int index) {
282     Token t = token;
283     for (int i = 0; i < index; i++) {
284       if (t.next != null)
285         t = t.next;
286       else
287         t = t.next = token_source.getNextToken();
288     }
289     return t;
290   }
291 
292   final private int jj_ntk() {
293     if ((jj_nt = token.next) == null) {
294       return (jj_ntk = (token.next = token_source.getNextToken()).kind);
295     }
296     return (jj_ntk = jj_nt.kind);
297   }
298 
299   private java.util.Vector jj_expentries = new java.util.Vector();
300   private int[] jj_expentry;
301   private int jj_kind = -1;
302 
303   final public ParseException generateParseException() {
304     jj_expentries.removeAllElements();
305     boolean[] la1tokens = new boolean[22];
306     for (int i = 0; i < 22; i++) {
307       la1tokens[i] = false;
308     }
309     if (jj_kind >= 0) {
310       la1tokens[jj_kind] = true;
311       jj_kind = -1;
312     }
313     for (int i = 0; i < 8; i++) {
314       if (jj_la1[i] == jj_gen) {
315         for (int j = 0; j < 32; j++) {
316           if ((jj_la1_0[i] & (1 << j)) != 0) {
317             la1tokens[j] = true;
318           }
319         }
320       }
321     }
322     for (int i = 0; i < 22; i++) {
323       if (la1tokens[i]) {
324         jj_expentry = new int[1];
325         jj_expentry[0] = i;
326         jj_expentries.addElement(jj_expentry);
327       }
328     }
329     int[][] exptokseq = new int[jj_expentries.size()][];
330     for (int i = 0; i < jj_expentries.size(); i++) {
331       exptokseq[i] = (int[]) jj_expentries.elementAt(i);
332     }
333     return new ParseException(token, exptokseq, tokenImage);
334   }
335 
336   final public void enable_tracing() {}
337 
338   final public void disable_tracing() {}
339 
340 }