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