1
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
10
11
12
13
14
15 public class DTDInitialParser implements DTDInitialParserConstants {
16
17
18
19
20
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
74
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
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 }