Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extSymbology / src / org / gvsig / symbology / fmap / rendering / filter / parser / ExpressionParser.java @ 36624

History | View | Annotate | Download (25.4 KB)

1
/* Generated By:JavaCC: Do not edit this line. ExpressionParser.java */
2
/* gvSIG. Sistema de Informaci�n Geogr�fica de la Generalitat Valenciana
3
 *
4
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
19
 *
20
 * For more information, contact:
21
 *
22
 *  Generalitat Valenciana
23
 *   Conselleria d'Infraestructures i Transport
24
 *   Av. Blasco Ib��ez, 50
25
 *   46010 VALENCIA
26
 *   SPAIN
27
 *
28
 *      +34 963862235
29
 *   gvsig@gva.es
30
 *      www.gvsig.gva.es
31
 *
32
 *    or
33
 *
34
 *   IVER T.I. S.A
35
 *   Salamanca 50
36
 *   46005 Valencia
37
 *   Spain
38
 *
39
 *   +34 963163400
40
 *   dac@iver.es
41
 */
42
package org.gvsig.symbology.fmap.rendering.filter.parser;
43
import java.util.*;
44
import java.io.*;
45

    
46

    
47
import com.hardcode.gdbms.engine.values.*;
48
import org.gvsig.symbology.fmap.rendering.filter.operations.*;
49

    
50
/**
51
 *
52
 * @author Pepe Vidal Salvador - jose.vidal.salvador@iver.es
53
 *
54
 */
55
public class ExpressionParser implements ExpressionParserConstants {
56

    
57
    private Stack stack = new Stack();
58
        private static OperatorsFactory operators = OperatorsFactory.getInstance();
59
        private Hashtable<String, Value> symbols = new Hashtable<String, Value>();
60
        private ArrayList<String> classNames = new ArrayList<String>();
61

    
62

    
63
 public ArrayList<String> getClassNames (){
64
        return classNames;
65
 }
66

    
67
  public void addClassName(String name){
68
         for (int i = 0; i < classNames.size(); i++) {
69
                if(classNames.get(i).compareTo(name)==0)
70
                        return;
71
        }
72
         classNames.add(name);
73
 }
74
    public Expression getExpression(){
75
    return (Expression)stack.pop();
76
  }
77

    
78
         public Stack getStack(){
79

    
80
                return this.stack;
81
        }
82

    
83
  public ExpressionParser(StringReader reader, Hashtable<String, Value> symbolsTable) {
84
        this(reader);
85
          this.symbols = symbolsTable;
86
}
87

    
88
public void putSymbol(String string, Value value){
89
        this.symbols.put(string,value);
90
}
91

    
92
  public static void main(String[]args)throws ParseException,ExpressionException{
93
         ExpressionParser parser = new ExpressionParser(new StringReader("true && true"));
94
         parser.Expression();
95
         parser.getStack();
96
         Expression exp = parser.getExpression();
97

    
98
  }
99

    
100
  final public void Expression() throws ParseException {
101
    AndExpression();
102
    label_1:
103
    while (true) {
104
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
105
      case OR:
106
        ;
107
        break;
108
      default:
109
        jj_la1[0] = jj_gen;
110
        break label_1;
111
      }
112
      jj_consume_token(OR);
113
      AndExpression();
114
    Expression leftExpression = (Expression)stack.pop();
115
    Expression rightExpression = (Expression)stack.pop();
116

    
117
        Expression orExpr = new OrOperator(symbols);
118
        orExpr.addArgument(0, rightExpression);
119
        orExpr.addArgument(0, leftExpression);
120

    
121
    stack.push(orExpr);
122
    }
123
  }
124

    
125
  final public void AndExpression() throws ParseException {
126
  Token x;
127
    EqCompExpression();
128
    label_2:
129
    while (true) {
130
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
131
      case AND:
132
        ;
133
        break;
134
      default:
135
        jj_la1[1] = jj_gen;
136
        break label_2;
137
      }
138
      x = jj_consume_token(AND);
139
      EqCompExpression();
140
    Expression rightExpression = (Expression)stack.pop();
141
    Expression leftExpression = (Expression)stack.pop();
142

    
143
    Expression func = new AndOperator(symbols);
144

    
145
    func.addArgument(0, rightExpression);
146
    func.addArgument(0, leftExpression);
147

    
148
    stack.push(func);
149
    }
150
  }
151

    
152
  final public void EqCompExpression() throws ParseException {
153
  Token x;
154
    ComparisonExpression();
155
    label_3:
156
    while (true) {
157
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
158
      case EQ:
159
      case NE:
160
        ;
161
        break;
162
      default:
163
        jj_la1[2] = jj_gen;
164
        break label_3;
165
      }
166
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
167
      case EQ:
168
        x = jj_consume_token(EQ);
169
        break;
170
      case NE:
171
        x = jj_consume_token(NE);
172
        break;
173
      default:
174
        jj_la1[3] = jj_gen;
175
        jj_consume_token(-1);
176
        throw new ParseException();
177
      }
178
      ComparisonExpression();
179
    Expression rightExpression = (Expression)stack.pop();
180
    Expression leftExpression = (Expression)stack.pop();
181
    Expression func = null;
182

    
183
    if (x.kind == EQ)func = new EqOperator(symbols);
184
    else if (x.kind == NE)func = new NeOperator(symbols);
185

    
186
    func.addArgument(0, rightExpression);
187
    func.addArgument(0, leftExpression);
188

    
189
    stack.push(func);
190
    }
191
  }
192

    
193
  final public void ComparisonExpression() throws ParseException {
194
  Token x;
195
    AdditiveExpression();
196
    label_4:
197
    while (true) {
198
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
199
      case GT:
200
      case LT:
201
      case LE:
202
      case GE:
203
        ;
204
        break;
205
      default:
206
        jj_la1[4] = jj_gen;
207
        break label_4;
208
      }
209
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
210
      case LT:
211
        x = jj_consume_token(LT);
212
        break;
213
      case LE:
214
        x = jj_consume_token(LE);
215
        break;
216
      case GT:
217
        x = jj_consume_token(GT);
218
        break;
219
      case GE:
220
        x = jj_consume_token(GE);
221
        break;
222
      default:
223
        jj_la1[5] = jj_gen;
224
        jj_consume_token(-1);
225
        throw new ParseException();
226
      }
227
      AdditiveExpression();
228
    Expression rightExpression = (Expression)stack.pop();
229
    Expression leftExpression = (Expression)stack.pop();
230
    Expression func = null;
231

    
232

    
233
    if (x.kind == LT)func = new LessThanOperator(symbols);
234
    else if (x.kind == LE)func = new LessThanOrEqualsOperator(symbols);
235
    else if (x.kind == GT)func = new GreaterThanOperator(symbols);
236
    else if (x.kind == GE)func = new GreaterThanOrEqualsOperator(symbols);
237

    
238
    func.addArgument(0, rightExpression);
239
    func.addArgument(0, leftExpression);
240

    
241
    stack.push(func);
242
    }
243
  }
244

    
245
  final public void AdditiveExpression() throws ParseException {
246
  Token x;
247
    MultiplicativeExpression();
248
    label_5:
249
    while (true) {
250
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
251
      case PLUS:
252
      case MINUS:
253
        ;
254
        break;
255
      default:
256
        jj_la1[6] = jj_gen;
257
        break label_5;
258
      }
259
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
260
      case PLUS:
261
        x = jj_consume_token(PLUS);
262
        break;
263
      case MINUS:
264
        x = jj_consume_token(MINUS);
265
        break;
266
      default:
267
        jj_la1[7] = jj_gen;
268
        jj_consume_token(-1);
269
        throw new ParseException();
270
      }
271
      MultiplicativeExpression();
272
    Expression rightExpression = (Expression)stack.pop();
273
    Expression leftExpression = (Expression)stack.pop();
274
    Expression func = null;
275

    
276
    if (x.kind == PLUS)func = new AddOperator(symbols);
277
    else func = new MinusOperator(symbols);
278

    
279
    func.addArgument(0, rightExpression);
280
    func.addArgument(0, leftExpression);
281

    
282
    stack.push(func);
283
    }
284
  }
285

    
286
  final public void MultiplicativeExpression() throws ParseException {
287
  Token x;
288
    UnaryElement();
289
    label_6:
290
    while (true) {
291
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
292
      case MULTIPLY:
293
      case DIVIDE:
294
        ;
295
        break;
296
      default:
297
        jj_la1[8] = jj_gen;
298
        break label_6;
299
      }
300
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
301
      case MULTIPLY:
302
        x = jj_consume_token(MULTIPLY);
303
        break;
304
      case DIVIDE:
305
        x = jj_consume_token(DIVIDE);
306
        break;
307
      default:
308
        jj_la1[9] = jj_gen;
309
        jj_consume_token(-1);
310
        throw new ParseException();
311
      }
312
      UnaryElement();
313
        try{
314
                        Expression A = (Expression) stack.pop();
315
                        Expression B = (Expression) stack.pop();
316
                         boolean aInt = (((Expression) A).evaluate() instanceof Integer);
317
                         boolean bInt = (((Expression) B).evaluate() instanceof Integer);
318
                        if (aInt &&     bInt) {
319
                                int a = (Integer) A.evaluate();
320
                                int b = (Integer) B.evaluate();
321
                                if (x.kind == MULTIPLY)
322
                                        stack.push(new NumericalConstant(new Integer(b * a),symbols));
323
                                else
324
                                        stack.push(new NumericalConstant(new Integer(b / a),symbols));
325
                        } else {
326

    
327
                                double a = new Double(((Expression)A).evaluate().toString());
328
                double b = new Double(((Expression)B).evaluate().toString());
329
                                if (x.kind == MULTIPLY)
330
                                        stack.push(new NumericalConstant(new Double(b * a),symbols));
331
                                else
332
                                        stack.push(new NumericalConstant(new Double(b / a),symbols));
333
                        }}catch (ClassCastException ex) {
334
                  ex.printStackTrace();
335
            } catch (ExpressionException e) {
336
                                  e.printStackTrace();
337
                        }
338
    }
339
  }
340

    
341
  final public void UnaryElement() throws ParseException {
342
  Token x = null;
343
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
344
    case PLUS:
345
    case MINUS:
346
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
347
      case PLUS:
348
        x = jj_consume_token(PLUS);
349
        break;
350
      case MINUS:
351
        x = jj_consume_token(MINUS);
352
        break;
353
      default:
354
        jj_la1[10] = jj_gen;
355
        jj_consume_token(-1);
356
        throw new ParseException();
357
      }
358
      UnaryElement();
359
              try{
360
                 Object A = stack.pop();
361
                         if ((((Expression) A).evaluate() instanceof Integer)) {
362
                                int a = (Integer) ((Expression) A).evaluate();
363
                                if (x.kind == PLUS)
364
                                        stack.push(new NumericalConstant(new Integer(a),symbols));
365
                                else
366
                                        stack.push(new NumericalConstant(new Integer(-a),symbols));
367
                        } else {
368
                                double a = (Double) ((Expression) A).evaluate();
369
                                if (x.kind == PLUS)
370
                                        stack.push(new NumericalConstant(new Double(a),symbols));
371
                                else
372
                                        stack.push(new NumericalConstant(new Double(-a),symbols));
373
                        }
374
                         } catch (ClassCastException ex) {
375
               ex.printStackTrace();
376
             }catch (ExpressionException ex) {
377
                 ex.printStackTrace();
378
             }
379
      break;
380
    case NOT:
381
    case OPEN_SQ_BRACKETS:
382
    case OPEN_PARENTHESIS:
383
    case BOOLEAN:
384
    case NULL:
385
    case IDENTIFIER:
386
    case INTEGER:
387
    case FLOATING_POINT:
388
    case STRING:
389
      BooleanUnaryElement();
390
      break;
391
    default:
392
      jj_la1[11] = jj_gen;
393
      jj_consume_token(-1);
394
      throw new ParseException();
395
    }
396
  }
397

    
398
  final public void BooleanUnaryElement() throws ParseException {
399
        Token t;
400
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
401
    case NOT:
402
      t = jj_consume_token(NOT);
403
      UnaryElement();
404
                Expression rightExpression = (Expression)stack.pop();
405
                Expression func = new NotOperator(symbols);
406
                func.addArgument(0, rightExpression);
407
                stack.push(func);
408
      break;
409
    case OPEN_SQ_BRACKETS:
410
    case OPEN_PARENTHESIS:
411
    case BOOLEAN:
412
    case NULL:
413
    case IDENTIFIER:
414
    case INTEGER:
415
    case FLOATING_POINT:
416
    case STRING:
417
      Element();
418
      break;
419
    default:
420
      jj_la1[12] = jj_gen;
421
      jj_consume_token(-1);
422
      throw new ParseException();
423
    }
424
  }
425

    
426
  final public void Element() throws ParseException {
427
  Token x;
428
  String y =  "[$,A-Z,_,a-z]([$,A-Z,_,a-z]|[0-9])*";
429
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
430
    case OPEN_SQ_BRACKETS:
431
      jj_consume_token(OPEN_SQ_BRACKETS);
432
      x = jj_consume_token(IDENTIFIER);
433
      jj_consume_token(CLOSE_SQ_BRACKETS);
434
    ReplaceOperator func = new ReplaceOperator(symbols);
435
     func.addArgument(x.image);
436
        stack.push(func);
437
        addClassName(x.image);
438
      break;
439
    case INTEGER:
440
      x = jj_consume_token(INTEGER);
441
        NumericalConstant intC = new NumericalConstant(Integer.valueOf(x.image),symbols);
442
        stack.push(intC);
443
      break;
444
    case FLOATING_POINT:
445
      x = jj_consume_token(FLOATING_POINT);
446
        NumericalConstant doubleC = new NumericalConstant(Double.valueOf(x.image),symbols);
447
        stack.push(doubleC);
448
      break;
449
    case STRING:
450
      x = jj_consume_token(STRING);
451
    StringConstant stringValue = new StringConstant(x.image.substring(1, x.image.length()-1),symbols);
452
    stack.push(stringValue);
453
      break;
454
    case BOOLEAN:
455
      x = jj_consume_token(BOOLEAN);
456
    BooleanConstant boolValue = new BooleanConstant(x.image,symbols);
457
    stack.push(boolValue);
458
      break;
459
    case NULL:
460
      x = jj_consume_token(NULL);
461
        NullConstant nullValue = new NullConstant(symbols);
462
    stack.push(nullValue);
463
      break;
464
    default:
465
      jj_la1[13] = jj_gen;
466
      if (jj_2_1(2)) {
467
        function();
468
      } else {
469
        switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
470
        case OPEN_PARENTHESIS:
471
          jj_consume_token(OPEN_PARENTHESIS);
472
          Expression();
473
          jj_consume_token(CLOSE_PARENTHESIS);
474
          break;
475
        default:
476
          jj_la1[14] = jj_gen;
477
          jj_consume_token(-1);
478
          throw new ParseException();
479
        }
480
      }
481
    }
482
  }
483

    
484
  final public void function() throws ParseException {
485
  String functionName;
486
  int argCount = 0;
487
  Expression function;
488
  Token x;
489
    if (jj_2_2(2)) {
490
      jj_consume_token(IDENTIFIER);
491
    functionName = token.image;
492
      argCount = Arguments();
493
    try {
494
      function = (Expression) operators.getOperator(functionName);
495
    }
496
    catch (Exception e){
497
      {if (true) throw new ParseException("Problem with function '"+functionName+"': "+e.toString());}
498
    }
499
    if (function == null){if (true) throw new ParseException("Nonexisting function name '"+functionName+"'");}
500
    for (int i = 0;
501
    i<argCount;
502
    i++){
503
      Expression arg = (Expression)stack.pop();
504
      function.addArgument(0, arg);
505
    }
506
    stack.push(function);
507
    } else {
508
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
509
      case IDENTIFIER:
510
        x = jj_consume_token(IDENTIFIER);
511
    StringConstant stringValue = new StringConstant(x.image,symbols);
512
    stack.push(stringValue);
513
        break;
514
      default:
515
        jj_la1[15] = jj_gen;
516
        jj_consume_token(-1);
517
        throw new ParseException();
518
      }
519
    }
520
  }
521

    
522
  final public int Arguments() throws ParseException {
523
  int argCount = 0;
524
    jj_consume_token(OPEN_PARENTHESIS);
525
    switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
526
    case PLUS:
527
    case MINUS:
528
    case NOT:
529
    case OPEN_SQ_BRACKETS:
530
    case OPEN_PARENTHESIS:
531
    case BOOLEAN:
532
    case NULL:
533
    case IDENTIFIER:
534
    case INTEGER:
535
    case FLOATING_POINT:
536
    case STRING:
537
      argCount = ArgumentList();
538
      break;
539
    default:
540
      jj_la1[16] = jj_gen;
541
      ;
542
    }
543
    jj_consume_token(CLOSE_PARENTHESIS);
544
    {if (true) return argCount;}
545
    throw new Error("Missing return statement in function");
546
  }
547

    
548
  final public int ArgumentList() throws ParseException {
549
  int argCount = 0;
550
    Expression();
551
    argCount++;
552
    label_7:
553
    while (true) {
554
      switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
555
      case COMMA:
556
        ;
557
        break;
558
      default:
559
        jj_la1[17] = jj_gen;
560
        break label_7;
561
      }
562
      jj_consume_token(COMMA);
563
      Expression();
564
    argCount++;
565
    }
566
    {if (true) return argCount;}
567
    throw new Error("Missing return statement in function");
568
  }
569

    
570
  final private boolean jj_2_1(int xla) {
571
    jj_la = xla; jj_lastpos = jj_scanpos = token;
572
    try { return !jj_3_1(); }
573
    catch(LookaheadSuccess ls) { return true; }
574
    finally { jj_save(0, xla); }
575
  }
576

    
577
  final private boolean jj_2_2(int xla) {
578
    jj_la = xla; jj_lastpos = jj_scanpos = token;
579
    try { return !jj_3_2(); }
580
    catch(LookaheadSuccess ls) { return true; }
581
    finally { jj_save(1, xla); }
582
  }
583

    
584
  final private boolean jj_3R_9() {
585
    if (jj_scan_token(OPEN_PARENTHESIS)) return true;
586
    return false;
587
  }
588

    
589
  final private boolean jj_3_1() {
590
    if (jj_3R_8()) return true;
591
    return false;
592
  }
593

    
594
  final private boolean jj_3R_10() {
595
    if (jj_scan_token(IDENTIFIER)) return true;
596
    return false;
597
  }
598

    
599
  final private boolean jj_3R_8() {
600
    Token xsp;
601
    xsp = jj_scanpos;
602
    if (jj_3_2()) {
603
    jj_scanpos = xsp;
604
    if (jj_3R_10()) return true;
605
    }
606
    return false;
607
  }
608

    
609
  final private boolean jj_3_2() {
610
    if (jj_scan_token(IDENTIFIER)) return true;
611
    if (jj_3R_9()) return true;
612
    return false;
613
  }
614

    
615
  public ExpressionParserTokenManager token_source;
616
  SimpleCharStream jj_input_stream;
617
  public Token token, jj_nt;
618
  private int jj_ntk;
619
  private Token jj_scanpos, jj_lastpos;
620
  private int jj_la;
621
  public boolean lookingAhead = false;
622
  private boolean jj_semLA;
623
  private int jj_gen;
624
  final private int[] jj_la1 = new int[18];
625
  static private int[] jj_la1_0;
626
  static private int[] jj_la1_1;
627
  static {
628
      jj_la1_0();
629
      jj_la1_1();
630
   }
631
   private static void jj_la1_0() {
632
      jj_la1_0 = new int[] {0x10000,0x20000,0x9000,0x9000,0x6600,0x6600,0x60,0x60,0x180,0x180,0x60,0x38280860,0x38280800,0x18080000,0x200000,0x20000000,0x38280860,0x1000000,};
633
   }
634
   private static void jj_la1_1() {
635
      jj_la1_1 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xb,0xb,0xb,0x0,0x0,0xb,0x0,};
636
   }
637
  final private JJCalls[] jj_2_rtns = new JJCalls[2];
638
  private boolean jj_rescan = false;
639
  private int jj_gc = 0;
640

    
641
  public ExpressionParser(java.io.InputStream stream) {
642
     this(stream, null);
643
  }
644
  public ExpressionParser(java.io.InputStream stream, String encoding) {
645
    try { jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
646
    token_source = new ExpressionParserTokenManager(jj_input_stream);
647
    token = new Token();
648
    jj_ntk = -1;
649
    jj_gen = 0;
650
    for (int i = 0; i < 18; i++) jj_la1[i] = -1;
651
    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
652
  }
653

    
654
  public void ReInit(java.io.InputStream stream) {
655
     ReInit(stream, null);
656
  }
657
  public void ReInit(java.io.InputStream stream, String encoding) {
658
    try { jj_input_stream.ReInit(stream, encoding, 1, 1); } catch(java.io.UnsupportedEncodingException e) { throw new RuntimeException(e); }
659
    token_source.ReInit(jj_input_stream);
660
    token = new Token();
661
    jj_ntk = -1;
662
    jj_gen = 0;
663
    for (int i = 0; i < 18; i++) jj_la1[i] = -1;
664
    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
665
  }
666

    
667
  public ExpressionParser(java.io.Reader stream) {
668
    jj_input_stream = new SimpleCharStream(stream, 1, 1);
669
    token_source = new ExpressionParserTokenManager(jj_input_stream);
670
    token = new Token();
671
    jj_ntk = -1;
672
    jj_gen = 0;
673
    for (int i = 0; i < 18; i++) jj_la1[i] = -1;
674
    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
675
  }
676

    
677
  public void ReInit(java.io.Reader stream) {
678
    jj_input_stream.ReInit(stream, 1, 1);
679
    token_source.ReInit(jj_input_stream);
680
    token = new Token();
681
    jj_ntk = -1;
682
    jj_gen = 0;
683
    for (int i = 0; i < 18; i++) jj_la1[i] = -1;
684
    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
685
  }
686

    
687
  public ExpressionParser(ExpressionParserTokenManager tm) {
688
    token_source = tm;
689
    token = new Token();
690
    jj_ntk = -1;
691
    jj_gen = 0;
692
    for (int i = 0; i < 18; i++) jj_la1[i] = -1;
693
    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
694
  }
695

    
696
  public void ReInit(ExpressionParserTokenManager tm) {
697
    token_source = tm;
698
    token = new Token();
699
    jj_ntk = -1;
700
    jj_gen = 0;
701
    for (int i = 0; i < 18; i++) jj_la1[i] = -1;
702
    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
703
  }
704

    
705
  final private Token jj_consume_token(int kind) throws ParseException {
706
    Token oldToken;
707
    if ((oldToken = token).next != null) token = token.next;
708
    else token = token.next = token_source.getNextToken();
709
    jj_ntk = -1;
710
    if (token.kind == kind) {
711
      jj_gen++;
712
      if (++jj_gc > 100) {
713
        jj_gc = 0;
714
        for (int i = 0; i < jj_2_rtns.length; i++) {
715
          JJCalls c = jj_2_rtns[i];
716
          while (c != null) {
717
            if (c.gen < jj_gen) c.first = null;
718
            c = c.next;
719
          }
720
        }
721
      }
722
      return token;
723
    }
724
    token = oldToken;
725
    jj_kind = kind;
726
    throw generateParseException();
727
  }
728

    
729
  static private final class LookaheadSuccess extends java.lang.Error { }
730
  final private LookaheadSuccess jj_ls = new LookaheadSuccess();
731
  final private boolean jj_scan_token(int kind) {
732
    if (jj_scanpos == jj_lastpos) {
733
      jj_la--;
734
      if (jj_scanpos.next == null) {
735
        jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
736
      } else {
737
        jj_lastpos = jj_scanpos = jj_scanpos.next;
738
      }
739
    } else {
740
      jj_scanpos = jj_scanpos.next;
741
    }
742
    if (jj_rescan) {
743
      int i = 0; Token tok = token;
744
      while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
745
      if (tok != null) jj_add_error_token(kind, i);
746
    }
747
    if (jj_scanpos.kind != kind) return true;
748
    if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
749
    return false;
750
  }
751

    
752
  final public Token getNextToken() {
753
    if (token.next != null) token = token.next;
754
    else token = token.next = token_source.getNextToken();
755
    jj_ntk = -1;
756
    jj_gen++;
757
    return token;
758
  }
759

    
760
  final public Token getToken(int index) {
761
    Token t = lookingAhead ? jj_scanpos : token;
762
    for (int i = 0; i < index; i++) {
763
      if (t.next != null) t = t.next;
764
      else t = t.next = token_source.getNextToken();
765
    }
766
    return t;
767
  }
768

    
769
  final private int jj_ntk() {
770
    if ((jj_nt=token.next) == null)
771
      return (jj_ntk = (token.next=token_source.getNextToken()).kind);
772
    else
773
      return (jj_ntk = jj_nt.kind);
774
  }
775

    
776
  private java.util.Vector jj_expentries = new java.util.Vector();
777
  private int[] jj_expentry;
778
  private int jj_kind = -1;
779
  private int[] jj_lasttokens = new int[100];
780
  private int jj_endpos;
781

    
782
  private void jj_add_error_token(int kind, int pos) {
783
    if (pos >= 100) return;
784
    if (pos == jj_endpos + 1) {
785
      jj_lasttokens[jj_endpos++] = kind;
786
    } else if (jj_endpos != 0) {
787
      jj_expentry = new int[jj_endpos];
788
      for (int i = 0; i < jj_endpos; i++) {
789
        jj_expentry[i] = jj_lasttokens[i];
790
      }
791
      boolean exists = false;
792
      for (java.util.Enumeration e = jj_expentries.elements(); e.hasMoreElements();) {
793
        int[] oldentry = (int[])(e.nextElement());
794
        if (oldentry.length == jj_expentry.length) {
795
          exists = true;
796
          for (int i = 0; i < jj_expentry.length; i++) {
797
            if (oldentry[i] != jj_expentry[i]) {
798
              exists = false;
799
              break;
800
            }
801
          }
802
          if (exists) break;
803
        }
804
      }
805
      if (!exists) jj_expentries.addElement(jj_expentry);
806
      if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
807
    }
808
  }
809

    
810
  public ParseException generateParseException() {
811
    jj_expentries.removeAllElements();
812
    boolean[] la1tokens = new boolean[37];
813
    for (int i = 0; i < 37; i++) {
814
      la1tokens[i] = false;
815
    }
816
    if (jj_kind >= 0) {
817
      la1tokens[jj_kind] = true;
818
      jj_kind = -1;
819
    }
820
    for (int i = 0; i < 18; i++) {
821
      if (jj_la1[i] == jj_gen) {
822
        for (int j = 0; j < 32; j++) {
823
          if ((jj_la1_0[i] & (1<<j)) != 0) {
824
            la1tokens[j] = true;
825
          }
826
          if ((jj_la1_1[i] & (1<<j)) != 0) {
827
            la1tokens[32+j] = true;
828
          }
829
        }
830
      }
831
    }
832
    for (int i = 0; i < 37; i++) {
833
      if (la1tokens[i]) {
834
        jj_expentry = new int[1];
835
        jj_expentry[0] = i;
836
        jj_expentries.addElement(jj_expentry);
837
      }
838
    }
839
    jj_endpos = 0;
840
    jj_rescan_token();
841
    jj_add_error_token(0, 0);
842
    int[][] exptokseq = new int[jj_expentries.size()][];
843
    for (int i = 0; i < jj_expentries.size(); i++) {
844
      exptokseq[i] = (int[])jj_expentries.elementAt(i);
845
    }
846
    return new ParseException(token, exptokseq, tokenImage);
847
  }
848

    
849
  final public void enable_tracing() {
850
  }
851

    
852
  final public void disable_tracing() {
853
  }
854

    
855
  final private void jj_rescan_token() {
856
    jj_rescan = true;
857
    for (int i = 0; i < 2; i++) {
858
    try {
859
      JJCalls p = jj_2_rtns[i];
860
      do {
861
        if (p.gen > jj_gen) {
862
          jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
863
          switch (i) {
864
            case 0: jj_3_1(); break;
865
            case 1: jj_3_2(); break;
866
          }
867
        }
868
        p = p.next;
869
      } while (p != null);
870
      } catch(LookaheadSuccess ls) { }
871
    }
872
    jj_rescan = false;
873
  }
874

    
875
  final private void jj_save(int index, int xla) {
876
    JJCalls p = jj_2_rtns[index];
877
    while (p.gen > jj_gen) {
878
      if (p.next == null) { p = p.next = new JJCalls(); break; }
879
      p = p.next;
880
    }
881
    p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
882
  }
883

    
884
  static final class JJCalls {
885
    int gen;
886
    Token first;
887
    int arg;
888
    JJCalls next;
889
  }
890

    
891
}