001/**
002 * Copyright (C) 2007 - 2016, Jens Lehmann
003 *
004 * This file is part of DL-Learner.
005 *
006 * DL-Learner is free software; you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published by
008 * the Free Software Foundation; either version 3 of the License, or
009 * (at your option) any later version.
010 *
011 * DL-Learner is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014 * GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
018 */
019/* Generated By:JavaCC: Do not edit this line. PrologParser.java */
020package org.dllearner.parser;
021
022@SuppressWarnings("all")
023public class PrologParser implements PrologParserConstants {
024    public PrologParser() {
025        this(new java.io.StringReader(""));
026    }
027
028    public org.dllearner.prolog.Term parseTerm(String src) throws ParseException {
029        reinitToString(src);
030        return term();
031    }
032
033    public java.util.ArrayList parseTermList(String src) throws ParseException {
034        reinitToString(src);
035        return termList();
036    }
037
038    public org.dllearner.prolog.Atom parseAtom(String src) throws ParseException {
039        reinitToString(src);
040        return atom();
041    }
042
043    public org.dllearner.prolog.Clause parseClause(String src) throws ParseException {
044        reinitToString(src);
045        return clause();
046    }
047
048    public org.dllearner.prolog.Program parseProgram(String src) throws ParseException {
049        reinitToString(src);
050        return program();
051    }
052
053    private void reinitToString(String src) {
054        ReInit(new java.io.StringReader(src));
055    }
056
057//////////////////////////////////////////////////////////////////////////////////////////
058  final public org.dllearner.prolog.Program program() throws ParseException {
059    org.dllearner.prolog.Program p = new org.dllearner.prolog.Program();
060    org.dllearner.prolog.Clause c;
061    label_1:
062    while (true) {
063      c = clause();
064                     p.addClause(c);
065      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
066      case IDENTIFIER:
067        ;
068        break;
069      default:
070        jj_la1[0] = jj_gen;
071        break label_1;
072      }
073    }
074    jj_consume_token(0);
075                                                  {if (true) return p;}
076    throw new Error("Missing return statement in function");
077  }
078
079  final public org.dllearner.prolog.Clause clause() throws ParseException {
080    org.dllearner.prolog.Atom head;
081    org.dllearner.prolog.Body body = null;
082    head = atom();
083    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
084    case 19:
085      jj_consume_token(19);
086      body = body();
087      break;
088    default:
089      jj_la1[1] = jj_gen;
090      ;
091    }
092    jj_consume_token(20);
093                                                   {if (true) return new org.dllearner.prolog.Clause(head, body);}
094    throw new Error("Missing return statement in function");
095  }
096
097  final public org.dllearner.prolog.Body body() throws ParseException {
098    org.dllearner.prolog.Literal l;
099    org.dllearner.prolog.Body b = new org.dllearner.prolog.Body();
100    l = literal();
101                    b.addLiteral(l);
102    label_2:
103    while (true) {
104      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
105      case 21:
106        ;
107        break;
108      default:
109        jj_la1[2] = jj_gen;
110        break label_2;
111      }
112      jj_consume_token(21);
113      l = literal();
114                          b.addLiteral(l);
115    }
116      {if (true) return b;}
117    throw new Error("Missing return statement in function");
118  }
119
120  final public org.dllearner.prolog.Atom atom() throws ParseException {
121    Token atom;
122    java.util.ArrayList arguments = new java.util.ArrayList() ;
123    atom = jj_consume_token(IDENTIFIER);
124    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
125    case 22:
126      jj_consume_token(22);
127      arguments = termList();
128      jj_consume_token(23);
129      break;
130    default:
131      jj_la1[3] = jj_gen;
132      ;
133    }
134                                                             {if (true) return new org.dllearner.prolog.Atom(atom.image, arguments);}
135    throw new Error("Missing return statement in function");
136  }
137
138  final public org.dllearner.prolog.Literal literal() throws ParseException {
139    org.dllearner.prolog.Atom a;
140    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
141    case IDENTIFIER:
142      a = atom();
143                 {if (true) return new org.dllearner.prolog.Literal(a, true);}
144      break;
145    case NOT:
146      jj_consume_token(NOT);
147      a = atom();
148                         {if (true) return new org.dllearner.prolog.Literal(a, false);}
149      break;
150    default:
151      jj_la1[4] = jj_gen;
152      jj_consume_token(-1);
153      throw new ParseException();
154    }
155    throw new Error("Missing return statement in function");
156  }
157
158  final public org.dllearner.prolog.Term term() throws ParseException {
159    Token v;
160    String o;
161    Token f;
162    java.util.ArrayList arguments = null;
163    org.dllearner.prolog.Term t1, t2;
164    if (jj_2_1(2147483647)) {
165      o = prefixOp();
166      t2 = simpleTerm();
167                                                             {if (true) return new org.dllearner.prolog.Function(o, t2);}
168    } else if (jj_2_2(2147483647)) {
169      t1 = simpleTerm();
170      o = infixOp();
171      t2 = simpleTerm();
172                                                                                {if (true) return new org.dllearner.prolog.Function(t1, o, t2);}
173    } else if (jj_2_3(2147483647)) {
174      t1 = simpleTerm();
175      o = postfixOp();
176                                                                {if (true) return new org.dllearner.prolog.Function(t1, o);}
177    } else if (jj_2_4(2147483647)) {
178      t1 = simpleTerm();
179                                                {if (true) return t1;}
180    } else {
181      jj_consume_token(-1);
182      throw new ParseException();
183    }
184    throw new Error("Missing return statement in function");
185  }
186
187  final public org.dllearner.prolog.Term simpleTerm() throws ParseException {
188    Token v;
189    String o;
190    Token f;
191    java.util.ArrayList arguments = null;
192    org.dllearner.prolog.Term l;
193    org.dllearner.prolog.Number n;
194    if (jj_2_5(2)) {
195      f = jj_consume_token(IDENTIFIER);
196      jj_consume_token(22);
197      arguments = termList();
198      jj_consume_token(23);
199                                                                   {if (true) return new org.dllearner.prolog.Function(f.image, arguments);}
200    } else if (jj_2_6(2)) {
201      f = jj_consume_token(IDENTIFIER);
202                                      {if (true) return new org.dllearner.prolog.PrologConstant(f.image);}
203    } else {
204      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
205      case VAR:
206        v = jj_consume_token(VAR);
207                  {if (true) return new org.dllearner.prolog.Variable(v.image);}
208        break;
209      case DOUBLE:
210        v = jj_consume_token(DOUBLE);
211                     {if (true) return new org.dllearner.prolog.Number(v.image);}
212        break;
213      case STRINGCONSTANT:
214        v = jj_consume_token(STRINGCONSTANT);
215                             {if (true) return new org.dllearner.prolog.StringConstant(v.image);}
216        break;
217      case 24:
218      case 25:
219        l = list();
220                   {if (true) return l;}
221        break;
222      default:
223        jj_la1[5] = jj_gen;
224        jj_consume_token(-1);
225        throw new ParseException();
226      }
227    }
228    throw new Error("Missing return statement in function");
229  }
230
231  final public String prefixOp() throws ParseException {
232    Token f;
233    f = jj_consume_token(OPERATOR);
234                     {if (true) return f.image;}
235    throw new Error("Missing return statement in function");
236  }
237
238  final public String infixOp() throws ParseException {
239    Token f;
240    f = jj_consume_token(OPERATOR);
241                     {if (true) return f.image;}
242    throw new Error("Missing return statement in function");
243  }
244
245  final public String postfixOp() throws ParseException {
246    Token f;
247    f = jj_consume_token(OPERATOR);
248                     {if (true) return f.image;}
249    throw new Error("Missing return statement in function");
250  }
251
252  final public java.util.ArrayList termList() throws ParseException {
253    org.dllearner.prolog.Term t;
254    java.util.ArrayList l = new java.util.ArrayList();
255    t = term();
256                       l.add(t);
257    label_3:
258    while (true) {
259      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
260      case 21:
261        ;
262        break;
263      default:
264        jj_la1[6] = jj_gen;
265        break label_3;
266      }
267      jj_consume_token(21);
268      t = term();
269                       l.add(t);
270    }
271      {if (true) return l;}
272    throw new Error("Missing return statement in function");
273  }
274
275  final public org.dllearner.prolog.List list() throws ParseException {
276    java.util.ArrayList content = null;
277    org.dllearner.prolog.Term head, tmp;
278    org.dllearner.prolog.List l;
279    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
280    case 24:
281      jj_consume_token(24);
282           {if (true) return new org.dllearner.prolog.List();}
283      break;
284    default:
285      jj_la1[7] = jj_gen;
286      if (jj_2_8(3)) {
287        jj_consume_token(25);
288        head = term();
289        jj_consume_token(26);
290                                           {if (true) return new org.dllearner.prolog.List(head, null);}
291      } else if (jj_2_9(3)) {
292        jj_consume_token(25);
293        head = term();
294        jj_consume_token(27);
295        l = list();
296        jj_consume_token(26);
297                                                          {if (true) return new org.dllearner.prolog.List(head, l);}
298      } else {
299        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
300        case 25:
301       content = new java.util.ArrayList();
302          jj_consume_token(25);
303          label_4:
304          while (true) {
305            if (jj_2_7(2)) {
306              ;
307            } else {
308              break label_4;
309            }
310            tmp = term();
311                                     content.add(tmp);
312            jj_consume_token(21);
313          }
314          tmp = term();
315                                                                          content.add(tmp);
316          jj_consume_token(26);
317        {if (true) return org.dllearner.prolog.List.compose(content);}
318          break;
319        default:
320          jj_la1[8] = jj_gen;
321          jj_consume_token(-1);
322          throw new ParseException();
323        }
324      }
325    }
326    throw new Error("Missing return statement in function");
327  }
328
329  private boolean jj_2_1(int xla) {
330    jj_la = xla; jj_lastpos = jj_scanpos = token;
331    try { return !jj_3_1(); }
332    catch(LookaheadSuccess ls) { return true; }
333    finally { jj_save(0, xla); }
334  }
335
336  private boolean jj_2_2(int xla) {
337    jj_la = xla; jj_lastpos = jj_scanpos = token;
338    try { return !jj_3_2(); }
339    catch(LookaheadSuccess ls) { return true; }
340    finally { jj_save(1, xla); }
341  }
342
343  private boolean jj_2_3(int xla) {
344    jj_la = xla; jj_lastpos = jj_scanpos = token;
345    try { return !jj_3_3(); }
346    catch(LookaheadSuccess ls) { return true; }
347    finally { jj_save(2, xla); }
348  }
349
350  private boolean jj_2_4(int xla) {
351    jj_la = xla; jj_lastpos = jj_scanpos = token;
352    try { return !jj_3_4(); }
353    catch(LookaheadSuccess ls) { return true; }
354    finally { jj_save(3, xla); }
355  }
356
357  private boolean jj_2_5(int xla) {
358    jj_la = xla; jj_lastpos = jj_scanpos = token;
359    try { return !jj_3_5(); }
360    catch(LookaheadSuccess ls) { return true; }
361    finally { jj_save(4, xla); }
362  }
363
364  private boolean jj_2_6(int xla) {
365    jj_la = xla; jj_lastpos = jj_scanpos = token;
366    try { return !jj_3_6(); }
367    catch(LookaheadSuccess ls) { return true; }
368    finally { jj_save(5, xla); }
369  }
370
371  private boolean jj_2_7(int xla) {
372    jj_la = xla; jj_lastpos = jj_scanpos = token;
373    try { return !jj_3_7(); }
374    catch(LookaheadSuccess ls) { return true; }
375    finally { jj_save(6, xla); }
376  }
377
378  private boolean jj_2_8(int xla) {
379    jj_la = xla; jj_lastpos = jj_scanpos = token;
380    try { return !jj_3_8(); }
381    catch(LookaheadSuccess ls) { return true; }
382    finally { jj_save(7, xla); }
383  }
384
385  private boolean jj_2_9(int xla) {
386    jj_la = xla; jj_lastpos = jj_scanpos = token;
387    try { return !jj_3_9(); }
388    catch(LookaheadSuccess ls) { return true; }
389    finally { jj_save(8, xla); }
390  }
391
392  private boolean jj_3R_5() {
393    if (jj_scan_token(OPERATOR)) return true;
394    return false;
395  }
396
397  private boolean jj_3_7() {
398    if (jj_3R_9()) return true;
399    if (jj_scan_token(21)) return true;
400    return false;
401  }
402
403  private boolean jj_3R_13() {
404    if (jj_3R_15()) return true;
405    return false;
406  }
407
408  private boolean jj_3R_12() {
409    if (jj_scan_token(STRINGCONSTANT)) return true;
410    return false;
411  }
412
413  private boolean jj_3R_11() {
414    if (jj_scan_token(DOUBLE)) return true;
415    return false;
416  }
417
418  private boolean jj_3R_10() {
419    if (jj_scan_token(VAR)) return true;
420    return false;
421  }
422
423  private boolean jj_3_6() {
424    if (jj_scan_token(IDENTIFIER)) return true;
425    return false;
426  }
427
428  private boolean jj_3R_18() {
429    if (jj_scan_token(25)) return true;
430    Token xsp;
431    while (true) {
432      xsp = jj_scanpos;
433      if (jj_3_7()) { jj_scanpos = xsp; break; }
434    }
435    if (jj_3R_9()) return true;
436    if (jj_scan_token(26)) return true;
437    return false;
438  }
439
440  private boolean jj_3_5() {
441    if (jj_scan_token(IDENTIFIER)) return true;
442    if (jj_scan_token(22)) return true;
443    if (jj_3R_14()) return true;
444    if (jj_scan_token(23)) return true;
445    return false;
446  }
447
448  private boolean jj_3R_6() {
449    Token xsp;
450    xsp = jj_scanpos;
451    if (jj_3_5()) {
452    jj_scanpos = xsp;
453    if (jj_3_6()) {
454    jj_scanpos = xsp;
455    if (jj_3R_10()) {
456    jj_scanpos = xsp;
457    if (jj_3R_11()) {
458    jj_scanpos = xsp;
459    if (jj_3R_12()) {
460    jj_scanpos = xsp;
461    if (jj_3R_13()) return true;
462    }
463    }
464    }
465    }
466    }
467    return false;
468  }
469
470  private boolean jj_3_9() {
471    if (jj_scan_token(25)) return true;
472    if (jj_3R_9()) return true;
473    if (jj_scan_token(27)) return true;
474    if (jj_3R_15()) return true;
475    if (jj_scan_token(26)) return true;
476    return false;
477  }
478
479  private boolean jj_3_8() {
480    if (jj_scan_token(25)) return true;
481    if (jj_3R_9()) return true;
482    if (jj_scan_token(26)) return true;
483    return false;
484  }
485
486  private boolean jj_3R_17() {
487    if (jj_scan_token(24)) return true;
488    return false;
489  }
490
491  private boolean jj_3R_15() {
492    Token xsp;
493    xsp = jj_scanpos;
494    if (jj_3R_17()) {
495    jj_scanpos = xsp;
496    if (jj_3_8()) {
497    jj_scanpos = xsp;
498    if (jj_3_9()) {
499    jj_scanpos = xsp;
500    if (jj_3R_18()) return true;
501    }
502    }
503    }
504    return false;
505  }
506
507  private boolean jj_3_4() {
508    if (jj_3R_6()) return true;
509    return false;
510  }
511
512  private boolean jj_3R_16() {
513    if (jj_scan_token(21)) return true;
514    if (jj_3R_9()) return true;
515    return false;
516  }
517
518  private boolean jj_3_3() {
519    if (jj_3R_6()) return true;
520    if (jj_3R_8()) return true;
521    return false;
522  }
523
524  private boolean jj_3_2() {
525    if (jj_3R_6()) return true;
526    if (jj_3R_7()) return true;
527    if (jj_3R_6()) return true;
528    return false;
529  }
530
531  private boolean jj_3R_14() {
532    if (jj_3R_9()) return true;
533    Token xsp;
534    while (true) {
535      xsp = jj_scanpos;
536      if (jj_3R_16()) { jj_scanpos = xsp; break; }
537    }
538    return false;
539  }
540
541  private boolean jj_3_1() {
542    if (jj_3R_5()) return true;
543    if (jj_3R_6()) return true;
544    return false;
545  }
546
547  private boolean jj_3R_9() {
548    Token xsp;
549    xsp = jj_scanpos;
550    if (jj_3_1()) {
551    jj_scanpos = xsp;
552    if (jj_3_2()) {
553    jj_scanpos = xsp;
554    if (jj_3_3()) {
555    jj_scanpos = xsp;
556    if (jj_3_4()) return true;
557    }
558    }
559    }
560    return false;
561  }
562
563  private boolean jj_3R_8() {
564    if (jj_scan_token(OPERATOR)) return true;
565    return false;
566  }
567
568  private boolean jj_3R_7() {
569    if (jj_scan_token(OPERATOR)) return true;
570    return false;
571  }
572
573  /** Generated Token Manager. */
574  public PrologParserTokenManager token_source;
575  SimpleCharStream jj_input_stream;
576  /** Current token. */
577  public Token token;
578  /** Next token. */
579  public Token jj_nt;
580  private int jj_ntk;
581  private Token jj_scanpos, jj_lastpos;
582  private int jj_la;
583  private int jj_gen;
584  final private int[] jj_la1 = new int[9];
585  static private int[] jj_la1_0;
586  static {
587      jj_la1_init_0();
588   }
589   private static void jj_la1_init_0() {
590      jj_la1_0 = new int[] {0x2000,0x80000,0x200000,0x400000,0x2080,0x3001900,0x200000,0x1000000,0x2000000,};
591   }
592  final private JJCalls[] jj_2_rtns = new JJCalls[9];
593  private boolean jj_rescan = false;
594  private int jj_gc = 0;
595
596  /** Constructor with InputStream. */
597  public PrologParser(java.io.InputStream stream) {
598     this(stream, null);
599  }
600  /** Constructor with InputStream and supplied encoding */
601  public PrologParser(java.io.InputStream stream, String encoding) {
602    try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
603    token_source = new PrologParserTokenManager(jj_input_stream);
604    token = new Token();
605    jj_ntk = -1;
606    jj_gen = 0;
607    for (int i = 0; i < 9; i++) jj_la1[i] = -1;
608    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
609  }
610
611  /** Reinitialise. */
612  public void ReInit(java.io.InputStream stream) {
613     ReInit(stream, null);
614  }
615  /** Reinitialise. */
616  public void ReInit(java.io.InputStream stream, String encoding) {
617    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
618    token_source.ReInit(jj_input_stream);
619    token = new Token();
620    jj_ntk = -1;
621    jj_gen = 0;
622    for (int i = 0; i < 9; i++) jj_la1[i] = -1;
623    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
624  }
625
626  /** Constructor. */
627  public PrologParser(java.io.Reader stream) {
628    jj_input_stream = new SimpleCharStream(stream, 1, 1);
629    token_source = new PrologParserTokenManager(jj_input_stream);
630    token = new Token();
631    jj_ntk = -1;
632    jj_gen = 0;
633    for (int i = 0; i < 9; i++) jj_la1[i] = -1;
634    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
635  }
636
637  /** Reinitialise. */
638  public void ReInit(java.io.Reader stream) {
639    jj_input_stream.ReInit(stream, 1, 1);
640    token_source.ReInit(jj_input_stream);
641    token = new Token();
642    jj_ntk = -1;
643    jj_gen = 0;
644    for (int i = 0; i < 9; i++) jj_la1[i] = -1;
645    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
646  }
647
648  /** Constructor with generated Token Manager. */
649  public PrologParser(PrologParserTokenManager tm) {
650    token_source = tm;
651    token = new Token();
652    jj_ntk = -1;
653    jj_gen = 0;
654    for (int i = 0; i < 9; i++) jj_la1[i] = -1;
655    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
656  }
657
658  /** Reinitialise. */
659  public void ReInit(PrologParserTokenManager tm) {
660    token_source = tm;
661    token = new Token();
662    jj_ntk = -1;
663    jj_gen = 0;
664    for (int i = 0; i < 9; i++) jj_la1[i] = -1;
665    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
666  }
667
668  private Token jj_consume_token(int kind) throws ParseException {
669    Token oldToken;
670    if ((oldToken = token).next != null) token = token.next;
671    else token = token.next = token_source.getNextToken();
672    jj_ntk = -1;
673    if (token.kind == kind) {
674      jj_gen++;
675      if (++jj_gc > 100) {
676        jj_gc = 0;
677        for (int i = 0; i < jj_2_rtns.length; i++) {
678          JJCalls c = jj_2_rtns[i];
679          while (c != null) {
680            if (c.gen < jj_gen) c.first = null;
681            c = c.next;
682          }
683        }
684      }
685      return token;
686    }
687    token = oldToken;
688    jj_kind = kind;
689    throw generateParseException();
690  }
691
692  static private final class LookaheadSuccess extends java.lang.Error { }
693  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
694  private boolean jj_scan_token(int kind) {
695    if (jj_scanpos == jj_lastpos) {
696      jj_la--;
697      if (jj_scanpos.next == null) {
698        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
699      } else {
700        jj_lastpos = jj_scanpos = jj_scanpos.next;
701      }
702    } else {
703      jj_scanpos = jj_scanpos.next;
704    }
705    if (jj_rescan) {
706      int i = 0; Token tok = token;
707      while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
708      if (tok != null) jj_add_error_token(kind, i);
709    }
710    if (jj_scanpos.kind != kind) return true;
711    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
712    return false;
713  }
714
715/** Get the next Token. */
716  final public Token getNextToken() {
717    if (token.next != null) token = token.next;
718    else token = token.next = token_source.getNextToken();
719    jj_ntk = -1;
720    jj_gen++;
721    return token;
722  }
723
724/** Get the specific Token. */
725  final public Token getToken(int index) {
726    Token t = token;
727    for (int i = 0; i < index; i++) {
728      if (t.next != null) t = t.next;
729      else t = t.next = token_source.getNextToken();
730    }
731    return t;
732  }
733
734  private int jj_ntk() {
735    if ((jj_nt=token.next) == null)
736      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
737    else
738      return (jj_ntk = jj_nt.kind);
739  }
740
741  private java.util.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
742  private int[] jj_expentry;
743  private int jj_kind = -1;
744  private int[] jj_lasttokens = new int[100];
745  private int jj_endpos;
746
747  private void jj_add_error_token(int kind, int pos) {
748    if (pos >= 100) return;
749    if (pos == jj_endpos + 1) {
750      jj_lasttokens[jj_endpos++] = kind;
751    } else if (jj_endpos != 0) {
752      jj_expentry = new int[jj_endpos];
753      for (int i = 0; i < jj_endpos; i++) {
754        jj_expentry[i] = jj_lasttokens[i];
755      }
756      jj_entries_loop: for (java.util.Iterator<?> it = jj_expentries.iterator(); it.hasNext();) {
757        int[] oldentry = (int[])(it.next());
758        if (oldentry.length == jj_expentry.length) {
759          for (int i = 0; i < jj_expentry.length; i++) {
760            if (oldentry[i] != jj_expentry[i]) {
761              continue jj_entries_loop;
762            }
763          }
764          jj_expentries.add(jj_expentry);
765          break jj_entries_loop;
766        }
767      }
768      if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
769    }
770  }
771
772  /** Generate ParseException. */
773  public ParseException generateParseException() {
774    jj_expentries.clear();
775    boolean[] la1tokens = new boolean[28];
776    if (jj_kind >= 0) {
777      la1tokens[jj_kind] = true;
778      jj_kind = -1;
779    }
780    for (int i = 0; i < 9; i++) {
781      if (jj_la1[i] == jj_gen) {
782        for (int j = 0; j < 32; j++) {
783          if ((jj_la1_0[i] & (1<<j)) != 0) {
784            la1tokens[j] = true;
785          }
786        }
787      }
788    }
789    for (int i = 0; i < 28; i++) {
790      if (la1tokens[i]) {
791        jj_expentry = new int[1];
792        jj_expentry[0] = i;
793        jj_expentries.add(jj_expentry);
794      }
795    }
796    jj_endpos = 0;
797    jj_rescan_token();
798    jj_add_error_token(0, 0);
799    int[][] exptokseq = new int[jj_expentries.size()][];
800    for (int i = 0; i < jj_expentries.size(); i++) {
801      exptokseq[i] = jj_expentries.get(i);
802    }
803    return new ParseException(token, exptokseq, tokenImage);
804  }
805
806  /** Enable tracing. */
807  final public void enable_tracing() {
808  }
809
810  /** Disable tracing. */
811  final public void disable_tracing() {
812  }
813
814  private void jj_rescan_token() {
815    jj_rescan = true;
816    for (int i = 0; i < 9; i++) {
817    try {
818      JJCalls p = jj_2_rtns[i];
819      do {
820        if (p.gen > jj_gen) {
821          jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
822          switch (i) {
823            case 0: jj_3_1(); break;
824            case 1: jj_3_2(); break;
825            case 2: jj_3_3(); break;
826            case 3: jj_3_4(); break;
827            case 4: jj_3_5(); break;
828            case 5: jj_3_6(); break;
829            case 6: jj_3_7(); break;
830            case 7: jj_3_8(); break;
831            case 8: jj_3_9(); break;
832          }
833        }
834        p = p.next;
835      } while (p != null);
836      } catch(LookaheadSuccess ls) { }
837    }
838    jj_rescan = false;
839  }
840
841  private void jj_save(int index, int xla) {
842    JJCalls p = jj_2_rtns[index];
843    while (p.gen > jj_gen) {
844      if (p.next == null) { p = p.next = new JJCalls(); break; }
845      p = p.next;
846    }
847    p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
848  }
849
850  static final class JJCalls {
851    int gen;
852    Token first;
853    int arg;
854    JJCalls next;
855  }
856
857}