1/* Generated By:JJTree&JavaCC: Do not edit this line. AddressListParser.java */
2/*
3 *  Copyright 2004 the mime4j project
4 *
5 *  Licensed under the Apache License, Version 2.0 (the "License");
6 *  you may not use this file except in compliance with the License.
7 *  You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17package org.apache.james.mime4j.field.address.parser;
18
19public class AddressListParser/*@bgen(jjtree)*/implements AddressListParserTreeConstants, AddressListParserConstants {/*@bgen(jjtree)*/
20  protected JJTAddressListParserState jjtree = new JJTAddressListParserState();public static void main(String args[]) throws ParseException {
21                while (true) {
22                    try {
23                                AddressListParser parser = new AddressListParser(System.in);
24                        parser.parseLine();
25                        ((SimpleNode)parser.jjtree.rootNode()).dump("> ");
26                    } catch (Exception x) {
27                                x.printStackTrace();
28                                return;
29                    }
30                }
31    }
32
33    private static void log(String msg) {
34        System.out.print(msg);
35    }
36
37    public ASTaddress_list parse() throws ParseException {
38        try {
39            parseAll();
40            return (ASTaddress_list)jjtree.rootNode();
41        } catch (TokenMgrError tme) {
42            throw new ParseException(tme.getMessage());
43        }
44    }
45
46
47    void jjtreeOpenNodeScope(Node n) {
48        ((SimpleNode)n).firstToken = getToken(1);
49    }
50
51    void jjtreeCloseNodeScope(Node n) {
52        ((SimpleNode)n).lastToken = getToken(0);
53    }
54
55  final public void parseLine() throws ParseException {
56    address_list();
57    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
58    case 1:
59      jj_consume_token(1);
60      break;
61    default:
62      jj_la1[0] = jj_gen;
63      ;
64    }
65    jj_consume_token(2);
66  }
67
68  final public void parseAll() throws ParseException {
69    address_list();
70    jj_consume_token(0);
71  }
72
73  final public void address_list() throws ParseException {
74 /*@bgen(jjtree) address_list */
75  ASTaddress_list jjtn000 = new ASTaddress_list(JJTADDRESS_LIST);
76  boolean jjtc000 = true;
77  jjtree.openNodeScope(jjtn000);
78  jjtreeOpenNodeScope(jjtn000);
79    try {
80      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
81      case 6:
82      case DOTATOM:
83      case QUOTEDSTRING:
84        address();
85        break;
86      default:
87        jj_la1[1] = jj_gen;
88        ;
89      }
90      label_1:
91      while (true) {
92        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
93        case 3:
94          ;
95          break;
96        default:
97          jj_la1[2] = jj_gen;
98          break label_1;
99        }
100        jj_consume_token(3);
101        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
102        case 6:
103        case DOTATOM:
104        case QUOTEDSTRING:
105          address();
106          break;
107        default:
108          jj_la1[3] = jj_gen;
109          ;
110        }
111      }
112    } catch (Throwable jjte000) {
113          if (jjtc000) {
114            jjtree.clearNodeScope(jjtn000);
115            jjtc000 = false;
116          } else {
117            jjtree.popNode();
118          }
119          if (jjte000 instanceof RuntimeException) {
120            {if (true) throw (RuntimeException)jjte000;}
121          }
122          if (jjte000 instanceof ParseException) {
123            {if (true) throw (ParseException)jjte000;}
124          }
125          {if (true) throw (Error)jjte000;}
126    } finally {
127          if (jjtc000) {
128            jjtree.closeNodeScope(jjtn000, true);
129            jjtreeCloseNodeScope(jjtn000);
130          }
131    }
132  }
133
134  final public void address() throws ParseException {
135 /*@bgen(jjtree) address */
136  ASTaddress jjtn000 = new ASTaddress(JJTADDRESS);
137  boolean jjtc000 = true;
138  jjtree.openNodeScope(jjtn000);
139  jjtreeOpenNodeScope(jjtn000);
140    try {
141      if (jj_2_1(2147483647)) {
142        addr_spec();
143      } else {
144        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
145        case 6:
146          angle_addr();
147          break;
148        case DOTATOM:
149        case QUOTEDSTRING:
150          phrase();
151          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
152          case 4:
153            group_body();
154            break;
155          case 6:
156            angle_addr();
157            break;
158          default:
159            jj_la1[4] = jj_gen;
160            jj_consume_token(-1);
161            throw new ParseException();
162          }
163          break;
164        default:
165          jj_la1[5] = jj_gen;
166          jj_consume_token(-1);
167          throw new ParseException();
168        }
169      }
170    } catch (Throwable jjte000) {
171          if (jjtc000) {
172            jjtree.clearNodeScope(jjtn000);
173            jjtc000 = false;
174          } else {
175            jjtree.popNode();
176          }
177          if (jjte000 instanceof RuntimeException) {
178            {if (true) throw (RuntimeException)jjte000;}
179          }
180          if (jjte000 instanceof ParseException) {
181            {if (true) throw (ParseException)jjte000;}
182          }
183          {if (true) throw (Error)jjte000;}
184    } finally {
185          if (jjtc000) {
186            jjtree.closeNodeScope(jjtn000, true);
187            jjtreeCloseNodeScope(jjtn000);
188          }
189    }
190  }
191
192  final public void mailbox() throws ParseException {
193 /*@bgen(jjtree) mailbox */
194  ASTmailbox jjtn000 = new ASTmailbox(JJTMAILBOX);
195  boolean jjtc000 = true;
196  jjtree.openNodeScope(jjtn000);
197  jjtreeOpenNodeScope(jjtn000);
198    try {
199      if (jj_2_2(2147483647)) {
200        addr_spec();
201      } else {
202        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
203        case 6:
204          angle_addr();
205          break;
206        case DOTATOM:
207        case QUOTEDSTRING:
208          name_addr();
209          break;
210        default:
211          jj_la1[6] = jj_gen;
212          jj_consume_token(-1);
213          throw new ParseException();
214        }
215      }
216    } catch (Throwable jjte000) {
217          if (jjtc000) {
218            jjtree.clearNodeScope(jjtn000);
219            jjtc000 = false;
220          } else {
221            jjtree.popNode();
222          }
223          if (jjte000 instanceof RuntimeException) {
224            {if (true) throw (RuntimeException)jjte000;}
225          }
226          if (jjte000 instanceof ParseException) {
227            {if (true) throw (ParseException)jjte000;}
228          }
229          {if (true) throw (Error)jjte000;}
230    } finally {
231          if (jjtc000) {
232            jjtree.closeNodeScope(jjtn000, true);
233            jjtreeCloseNodeScope(jjtn000);
234          }
235    }
236  }
237
238  final public void name_addr() throws ParseException {
239 /*@bgen(jjtree) name_addr */
240  ASTname_addr jjtn000 = new ASTname_addr(JJTNAME_ADDR);
241  boolean jjtc000 = true;
242  jjtree.openNodeScope(jjtn000);
243  jjtreeOpenNodeScope(jjtn000);
244    try {
245      phrase();
246      angle_addr();
247    } catch (Throwable jjte000) {
248          if (jjtc000) {
249            jjtree.clearNodeScope(jjtn000);
250            jjtc000 = false;
251          } else {
252            jjtree.popNode();
253          }
254          if (jjte000 instanceof RuntimeException) {
255            {if (true) throw (RuntimeException)jjte000;}
256          }
257          if (jjte000 instanceof ParseException) {
258            {if (true) throw (ParseException)jjte000;}
259          }
260          {if (true) throw (Error)jjte000;}
261    } finally {
262          if (jjtc000) {
263            jjtree.closeNodeScope(jjtn000, true);
264            jjtreeCloseNodeScope(jjtn000);
265          }
266    }
267  }
268
269  final public void group_body() throws ParseException {
270 /*@bgen(jjtree) group_body */
271  ASTgroup_body jjtn000 = new ASTgroup_body(JJTGROUP_BODY);
272  boolean jjtc000 = true;
273  jjtree.openNodeScope(jjtn000);
274  jjtreeOpenNodeScope(jjtn000);
275    try {
276      jj_consume_token(4);
277      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
278      case 6:
279      case DOTATOM:
280      case QUOTEDSTRING:
281        mailbox();
282        break;
283      default:
284        jj_la1[7] = jj_gen;
285        ;
286      }
287      label_2:
288      while (true) {
289        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
290        case 3:
291          ;
292          break;
293        default:
294          jj_la1[8] = jj_gen;
295          break label_2;
296        }
297        jj_consume_token(3);
298        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
299        case 6:
300        case DOTATOM:
301        case QUOTEDSTRING:
302          mailbox();
303          break;
304        default:
305          jj_la1[9] = jj_gen;
306          ;
307        }
308      }
309      jj_consume_token(5);
310    } catch (Throwable jjte000) {
311          if (jjtc000) {
312            jjtree.clearNodeScope(jjtn000);
313            jjtc000 = false;
314          } else {
315            jjtree.popNode();
316          }
317          if (jjte000 instanceof RuntimeException) {
318            {if (true) throw (RuntimeException)jjte000;}
319          }
320          if (jjte000 instanceof ParseException) {
321            {if (true) throw (ParseException)jjte000;}
322          }
323          {if (true) throw (Error)jjte000;}
324    } finally {
325          if (jjtc000) {
326            jjtree.closeNodeScope(jjtn000, true);
327            jjtreeCloseNodeScope(jjtn000);
328          }
329    }
330  }
331
332  final public void angle_addr() throws ParseException {
333 /*@bgen(jjtree) angle_addr */
334  ASTangle_addr jjtn000 = new ASTangle_addr(JJTANGLE_ADDR);
335  boolean jjtc000 = true;
336  jjtree.openNodeScope(jjtn000);
337  jjtreeOpenNodeScope(jjtn000);
338    try {
339      jj_consume_token(6);
340      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
341      case 8:
342        route();
343        break;
344      default:
345        jj_la1[10] = jj_gen;
346        ;
347      }
348      addr_spec();
349      jj_consume_token(7);
350    } catch (Throwable jjte000) {
351          if (jjtc000) {
352            jjtree.clearNodeScope(jjtn000);
353            jjtc000 = false;
354          } else {
355            jjtree.popNode();
356          }
357          if (jjte000 instanceof RuntimeException) {
358            {if (true) throw (RuntimeException)jjte000;}
359          }
360          if (jjte000 instanceof ParseException) {
361            {if (true) throw (ParseException)jjte000;}
362          }
363          {if (true) throw (Error)jjte000;}
364    } finally {
365          if (jjtc000) {
366            jjtree.closeNodeScope(jjtn000, true);
367            jjtreeCloseNodeScope(jjtn000);
368          }
369    }
370  }
371
372  final public void route() throws ParseException {
373 /*@bgen(jjtree) route */
374  ASTroute jjtn000 = new ASTroute(JJTROUTE);
375  boolean jjtc000 = true;
376  jjtree.openNodeScope(jjtn000);
377  jjtreeOpenNodeScope(jjtn000);
378    try {
379      jj_consume_token(8);
380      domain();
381      label_3:
382      while (true) {
383        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
384        case 3:
385        case 8:
386          ;
387          break;
388        default:
389          jj_la1[11] = jj_gen;
390          break label_3;
391        }
392        label_4:
393        while (true) {
394          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
395          case 3:
396            ;
397            break;
398          default:
399            jj_la1[12] = jj_gen;
400            break label_4;
401          }
402          jj_consume_token(3);
403        }
404        jj_consume_token(8);
405        domain();
406      }
407      jj_consume_token(4);
408    } catch (Throwable jjte000) {
409          if (jjtc000) {
410            jjtree.clearNodeScope(jjtn000);
411            jjtc000 = false;
412          } else {
413            jjtree.popNode();
414          }
415          if (jjte000 instanceof RuntimeException) {
416            {if (true) throw (RuntimeException)jjte000;}
417          }
418          if (jjte000 instanceof ParseException) {
419            {if (true) throw (ParseException)jjte000;}
420          }
421          {if (true) throw (Error)jjte000;}
422    } finally {
423          if (jjtc000) {
424            jjtree.closeNodeScope(jjtn000, true);
425            jjtreeCloseNodeScope(jjtn000);
426          }
427    }
428  }
429
430  final public void phrase() throws ParseException {
431 /*@bgen(jjtree) phrase */
432  ASTphrase jjtn000 = new ASTphrase(JJTPHRASE);
433  boolean jjtc000 = true;
434  jjtree.openNodeScope(jjtn000);
435  jjtreeOpenNodeScope(jjtn000);
436    try {
437      label_5:
438      while (true) {
439        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
440        case DOTATOM:
441          jj_consume_token(DOTATOM);
442          break;
443        case QUOTEDSTRING:
444          jj_consume_token(QUOTEDSTRING);
445          break;
446        default:
447          jj_la1[13] = jj_gen;
448          jj_consume_token(-1);
449          throw new ParseException();
450        }
451        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
452        case DOTATOM:
453        case QUOTEDSTRING:
454          ;
455          break;
456        default:
457          jj_la1[14] = jj_gen;
458          break label_5;
459        }
460      }
461    } finally {
462  if (jjtc000) {
463    jjtree.closeNodeScope(jjtn000, true);
464    jjtreeCloseNodeScope(jjtn000);
465  }
466    }
467  }
468
469  final public void addr_spec() throws ParseException {
470 /*@bgen(jjtree) addr_spec */
471  ASTaddr_spec jjtn000 = new ASTaddr_spec(JJTADDR_SPEC);
472  boolean jjtc000 = true;
473  jjtree.openNodeScope(jjtn000);
474  jjtreeOpenNodeScope(jjtn000);
475    try {
476      local_part();
477      jj_consume_token(8);
478      domain();
479    } catch (Throwable jjte000) {
480          if (jjtc000) {
481            jjtree.clearNodeScope(jjtn000);
482            jjtc000 = false;
483          } else {
484            jjtree.popNode();
485          }
486          if (jjte000 instanceof RuntimeException) {
487            {if (true) throw (RuntimeException)jjte000;}
488          }
489          if (jjte000 instanceof ParseException) {
490            {if (true) throw (ParseException)jjte000;}
491          }
492          {if (true) throw (Error)jjte000;}
493    } finally {
494          if (jjtc000) {
495            jjtree.closeNodeScope(jjtn000, true);
496            jjtreeCloseNodeScope(jjtn000);
497          }
498    }
499  }
500
501  final public void local_part() throws ParseException {
502 /*@bgen(jjtree) local_part */
503  ASTlocal_part jjtn000 = new ASTlocal_part(JJTLOCAL_PART);
504  boolean jjtc000 = true;
505  jjtree.openNodeScope(jjtn000);
506  jjtreeOpenNodeScope(jjtn000);Token t;
507    try {
508      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
509      case DOTATOM:
510        t = jj_consume_token(DOTATOM);
511        break;
512      case QUOTEDSTRING:
513        t = jj_consume_token(QUOTEDSTRING);
514        break;
515      default:
516        jj_la1[15] = jj_gen;
517        jj_consume_token(-1);
518        throw new ParseException();
519      }
520      label_6:
521      while (true) {
522        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
523        case 9:
524        case DOTATOM:
525        case QUOTEDSTRING:
526          ;
527          break;
528        default:
529          jj_la1[16] = jj_gen;
530          break label_6;
531        }
532        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
533        case 9:
534          t = jj_consume_token(9);
535          break;
536        default:
537          jj_la1[17] = jj_gen;
538          ;
539        }
540                        if (t.image.charAt(t.image.length() - 1) != '.' || t.kind == AddressListParserConstants.QUOTEDSTRING)
541                                {if (true) throw new ParseException("Words in local part must be separated by '.'");}
542        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
543        case DOTATOM:
544          t = jj_consume_token(DOTATOM);
545          break;
546        case QUOTEDSTRING:
547          t = jj_consume_token(QUOTEDSTRING);
548          break;
549        default:
550          jj_la1[18] = jj_gen;
551          jj_consume_token(-1);
552          throw new ParseException();
553        }
554      }
555    } finally {
556          if (jjtc000) {
557            jjtree.closeNodeScope(jjtn000, true);
558            jjtreeCloseNodeScope(jjtn000);
559          }
560    }
561  }
562
563  final public void domain() throws ParseException {
564 /*@bgen(jjtree) domain */
565  ASTdomain jjtn000 = new ASTdomain(JJTDOMAIN);
566  boolean jjtc000 = true;
567  jjtree.openNodeScope(jjtn000);
568  jjtreeOpenNodeScope(jjtn000);Token t;
569    try {
570      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
571      case DOTATOM:
572        t = jj_consume_token(DOTATOM);
573        label_7:
574        while (true) {
575          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
576          case 9:
577          case DOTATOM:
578            ;
579            break;
580          default:
581            jj_la1[19] = jj_gen;
582            break label_7;
583          }
584          switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
585          case 9:
586            t = jj_consume_token(9);
587            break;
588          default:
589            jj_la1[20] = jj_gen;
590            ;
591          }
592                                if (t.image.charAt(t.image.length() - 1) != '.')
593                                        {if (true) throw new ParseException("Atoms in domain names must be separated by '.'");}
594          t = jj_consume_token(DOTATOM);
595        }
596        break;
597      case DOMAINLITERAL:
598        jj_consume_token(DOMAINLITERAL);
599        break;
600      default:
601        jj_la1[21] = jj_gen;
602        jj_consume_token(-1);
603        throw new ParseException();
604      }
605    } finally {
606          if (jjtc000) {
607            jjtree.closeNodeScope(jjtn000, true);
608            jjtreeCloseNodeScope(jjtn000);
609          }
610    }
611  }
612
613  final private boolean jj_2_1(int xla) {
614    jj_la = xla; jj_lastpos = jj_scanpos = token;
615    try { return !jj_3_1(); }
616    catch(LookaheadSuccess ls) { return true; }
617    finally { jj_save(0, xla); }
618  }
619
620  final private boolean jj_2_2(int xla) {
621    jj_la = xla; jj_lastpos = jj_scanpos = token;
622    try { return !jj_3_2(); }
623    catch(LookaheadSuccess ls) { return true; }
624    finally { jj_save(1, xla); }
625  }
626
627  final private boolean jj_3R_11() {
628    Token xsp;
629    xsp = jj_scanpos;
630    if (jj_scan_token(9)) jj_scanpos = xsp;
631    xsp = jj_scanpos;
632    if (jj_scan_token(14)) {
633    jj_scanpos = xsp;
634    if (jj_scan_token(31)) return true;
635    }
636    return false;
637  }
638
639  final private boolean jj_3R_13() {
640    Token xsp;
641    xsp = jj_scanpos;
642    if (jj_scan_token(9)) jj_scanpos = xsp;
643    if (jj_scan_token(DOTATOM)) return true;
644    return false;
645  }
646
647  final private boolean jj_3R_8() {
648    if (jj_3R_9()) return true;
649    if (jj_scan_token(8)) return true;
650    if (jj_3R_10()) return true;
651    return false;
652  }
653
654  final private boolean jj_3_1() {
655    if (jj_3R_8()) return true;
656    return false;
657  }
658
659  final private boolean jj_3R_12() {
660    if (jj_scan_token(DOTATOM)) return true;
661    Token xsp;
662    while (true) {
663      xsp = jj_scanpos;
664      if (jj_3R_13()) { jj_scanpos = xsp; break; }
665    }
666    return false;
667  }
668
669  final private boolean jj_3R_10() {
670    Token xsp;
671    xsp = jj_scanpos;
672    if (jj_3R_12()) {
673    jj_scanpos = xsp;
674    if (jj_scan_token(18)) return true;
675    }
676    return false;
677  }
678
679  final private boolean jj_3_2() {
680    if (jj_3R_8()) return true;
681    return false;
682  }
683
684  final private boolean jj_3R_9() {
685    Token xsp;
686    xsp = jj_scanpos;
687    if (jj_scan_token(14)) {
688    jj_scanpos = xsp;
689    if (jj_scan_token(31)) return true;
690    }
691    while (true) {
692      xsp = jj_scanpos;
693      if (jj_3R_11()) { jj_scanpos = xsp; break; }
694    }
695    return false;
696  }
697
698  public AddressListParserTokenManager token_source;
699  SimpleCharStream jj_input_stream;
700  public Token token, jj_nt;
701  private int jj_ntk;
702  private Token jj_scanpos, jj_lastpos;
703  private int jj_la;
704  public boolean lookingAhead = false;
705  private boolean jj_semLA;
706  private int jj_gen;
707  final private int[] jj_la1 = new int[22];
708  static private int[] jj_la1_0;
709  static private int[] jj_la1_1;
710  static {
711      jj_la1_0();
712      jj_la1_1();
713   }
714   private static void jj_la1_0() {
715      jj_la1_0 = new int[] {0x2,0x80004040,0x8,0x80004040,0x50,0x80004040,0x80004040,0x80004040,0x8,0x80004040,0x100,0x108,0x8,0x80004000,0x80004000,0x80004000,0x80004200,0x200,0x80004000,0x4200,0x200,0x44000,};
716   }
717   private static void jj_la1_1() {
718      jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
719   }
720  final private JJCalls[] jj_2_rtns = new JJCalls[2];
721  private boolean jj_rescan = false;
722  private int jj_gc = 0;
723
724  public AddressListParser(java.io.InputStream stream) {
725     this(stream, null);
726  }
727  public AddressListParser(java.io.InputStream stream, String encoding) {
728    try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
729    token_source = new AddressListParserTokenManager(jj_input_stream);
730    token = new Token();
731    jj_ntk = -1;
732    jj_gen = 0;
733    for (int i = 0; i < 22; i++) jj_la1[i] = -1;
734    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
735  }
736
737  public void ReInit(java.io.InputStream stream) {
738     ReInit(stream, null);
739  }
740  public void ReInit(java.io.InputStream stream, String encoding) {
741    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
742    token_source.ReInit(jj_input_stream);
743    token = new Token();
744    jj_ntk = -1;
745    jjtree.reset();
746    jj_gen = 0;
747    for (int i = 0; i < 22; i++) jj_la1[i] = -1;
748    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
749  }
750
751  public AddressListParser(java.io.Reader stream) {
752    jj_input_stream = new SimpleCharStream(stream, 1, 1);
753    token_source = new AddressListParserTokenManager(jj_input_stream);
754    token = new Token();
755    jj_ntk = -1;
756    jj_gen = 0;
757    for (int i = 0; i < 22; i++) jj_la1[i] = -1;
758    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
759  }
760
761  public void ReInit(java.io.Reader stream) {
762    jj_input_stream.ReInit(stream, 1, 1);
763    token_source.ReInit(jj_input_stream);
764    token = new Token();
765    jj_ntk = -1;
766    jjtree.reset();
767    jj_gen = 0;
768    for (int i = 0; i < 22; i++) jj_la1[i] = -1;
769    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
770  }
771
772  public AddressListParser(AddressListParserTokenManager tm) {
773    token_source = tm;
774    token = new Token();
775    jj_ntk = -1;
776    jj_gen = 0;
777    for (int i = 0; i < 22; i++) jj_la1[i] = -1;
778    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
779  }
780
781  public void ReInit(AddressListParserTokenManager tm) {
782    token_source = tm;
783    token = new Token();
784    jj_ntk = -1;
785    jjtree.reset();
786    jj_gen = 0;
787    for (int i = 0; i < 22; i++) jj_la1[i] = -1;
788    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
789  }
790
791  final private Token jj_consume_token(int kind) throws ParseException {
792    Token oldToken;
793    if ((oldToken = token).next != null) token = token.next;
794    else token = token.next = token_source.getNextToken();
795    jj_ntk = -1;
796    if (token.kind == kind) {
797      jj_gen++;
798      if (++jj_gc > 100) {
799        jj_gc = 0;
800        for (int i = 0; i < jj_2_rtns.length; i++) {
801          JJCalls c = jj_2_rtns[i];
802          while (c != null) {
803            if (c.gen < jj_gen) c.first = null;
804            c = c.next;
805          }
806        }
807      }
808      return token;
809    }
810    token = oldToken;
811    jj_kind = kind;
812    throw generateParseException();
813  }
814
815  static private final class LookaheadSuccess extends java.lang.Error { }
816  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
817  final private boolean jj_scan_token(int kind) {
818    if (jj_scanpos == jj_lastpos) {
819      jj_la--;
820      if (jj_scanpos.next == null) {
821        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
822      } else {
823        jj_lastpos = jj_scanpos = jj_scanpos.next;
824      }
825    } else {
826      jj_scanpos = jj_scanpos.next;
827    }
828    if (jj_rescan) {
829      int i = 0; Token tok = token;
830      while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
831      if (tok != null) jj_add_error_token(kind, i);
832    }
833    if (jj_scanpos.kind != kind) return true;
834    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
835    return false;
836  }
837
838  final public Token getNextToken() {
839    if (token.next != null) token = token.next;
840    else token = token.next = token_source.getNextToken();
841    jj_ntk = -1;
842    jj_gen++;
843    return token;
844  }
845
846  final public Token getToken(int index) {
847    Token t = lookingAhead ? jj_scanpos : token;
848    for (int i = 0; i < index; i++) {
849      if (t.next != null) t = t.next;
850      else t = t.next = token_source.getNextToken();
851    }
852    return t;
853  }
854
855  final private int jj_ntk() {
856    if ((jj_nt=token.next) == null)
857      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
858    else
859      return (jj_ntk = jj_nt.kind);
860  }
861
862  private java.util.Vector<int[]> jj_expentries = new java.util.Vector<int[]>();
863  private int[] jj_expentry;
864  private int jj_kind = -1;
865  private int[] jj_lasttokens = new int[100];
866  private int jj_endpos;
867
868  private void jj_add_error_token(int kind, int pos) {
869    if (pos >= 100) return;
870    if (pos == jj_endpos + 1) {
871      jj_lasttokens[jj_endpos++] = kind;
872    } else if (jj_endpos != 0) {
873      jj_expentry = new int[jj_endpos];
874      for (int i = 0; i < jj_endpos; i++) {
875        jj_expentry[i] = jj_lasttokens[i];
876      }
877      boolean exists = false;
878      for (java.util.Enumeration<int[]> e = jj_expentries.elements(); e.hasMoreElements();) {
879        int[] oldentry = e.nextElement();
880        if (oldentry.length == jj_expentry.length) {
881          exists = true;
882          for (int i = 0; i < jj_expentry.length; i++) {
883            if (oldentry[i] != jj_expentry[i]) {
884              exists = false;
885              break;
886            }
887          }
888          if (exists) break;
889        }
890      }
891      if (!exists) jj_expentries.addElement(jj_expentry);
892      if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
893    }
894  }
895
896  public ParseException generateParseException() {
897    jj_expentries.removeAllElements();
898    boolean[] la1tokens = new boolean[34];
899    for (int i = 0; i < 34; i++) {
900      la1tokens[i] = false;
901    }
902    if (jj_kind >= 0) {
903      la1tokens[jj_kind] = true;
904      jj_kind = -1;
905    }
906    for (int i = 0; i < 22; i++) {
907      if (jj_la1[i] == jj_gen) {
908        for (int j = 0; j < 32; j++) {
909          if ((jj_la1_0[i] & (1<<j)) != 0) {
910            la1tokens[j] = true;
911          }
912          if ((jj_la1_1[i] & (1<<j)) != 0) {
913            la1tokens[32+j] = true;
914          }
915        }
916      }
917    }
918    for (int i = 0; i < 34; i++) {
919      if (la1tokens[i]) {
920        jj_expentry = new int[1];
921        jj_expentry[0] = i;
922        jj_expentries.addElement(jj_expentry);
923      }
924    }
925    jj_endpos = 0;
926    jj_rescan_token();
927    jj_add_error_token(0, 0);
928    int[][] exptokseq = new int[jj_expentries.size()][];
929    for (int i = 0; i < jj_expentries.size(); i++) {
930      exptokseq[i] = jj_expentries.elementAt(i);
931    }
932    return new ParseException(token, exptokseq, tokenImage);
933  }
934
935  final public void enable_tracing() {
936  }
937
938  final public void disable_tracing() {
939  }
940
941  final private void jj_rescan_token() {
942    jj_rescan = true;
943    for (int i = 0; i < 2; i++) {
944    try {
945      JJCalls p = jj_2_rtns[i];
946      do {
947        if (p.gen > jj_gen) {
948          jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
949          switch (i) {
950            case 0: jj_3_1(); break;
951            case 1: jj_3_2(); break;
952          }
953        }
954        p = p.next;
955      } while (p != null);
956      } catch(LookaheadSuccess ls) { }
957    }
958    jj_rescan = false;
959  }
960
961  final private void jj_save(int index, int xla) {
962    JJCalls p = jj_2_rtns[index];
963    while (p.gen > jj_gen) {
964      if (p.next == null) { p = p.next = new JJCalls(); break; }
965      p = p.next;
966    }
967    p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
968  }
969
970  static final class JJCalls {
971    int gen;
972    Token first;
973    int arg;
974    JJCalls next;
975  }
976
977}
978