1
2 package freemarker.core;
3
4 import freemarker.template.Configuration;
5 import freemarker.template.Template;
6 import freemarker.template.TemplateBooleanModel;
7 import freemarker.template.TemplateCollectionModel;
8 import freemarker.template.TemplateHashModelEx;
9 import freemarker.template.TemplateModel;
10 import freemarker.template.TemplateModelException;
11 import freemarker.template.TemplateModelIterator;
12 import freemarker.template.TemplateScalarModel;
13 import freemarker.template.utility.DeepUnwrap;
14 import freemarker.template.utility.StringUtil;
15
16 import java.io.InputStream;
17 import java.io.Reader;
18 import java.io.StringReader;
19 import java.util.ArrayList;
20 import java.util.Enumeration;
21 import java.util.HashMap;
22 import java.util.LinkedList;
23 import java.util.Map;
24 import java.util.StringTokenizer;
25 import java.util.Vector;
26
27
28
29
30 public class FMParser implements FMParserConstants {
31
32
33 Template template;
34 private String templateName;
35
36
37 private int loopNesting, switchNesting;
38 private boolean inMacro, inFunction, stripWhitespace, stripText;
39 private LinkedList escapes = new LinkedList();
40 private int contentNesting;
41
42
43
44
45 static public FMParser createExpressionParser(String s) {
46 SimpleCharStream scs = new SimpleCharStream(new StringReader(s), 1, 1, s.length());
47 FMParserTokenManager token_source = new FMParserTokenManager(scs);
48 token_source.SwitchTo(FMParserConstants.FM_EXPRESSION);
49 return new FMParser(token_source);
50 }
51
52
53
54
55
56
57
58 public FMParser(Template template, Reader reader, boolean strictEscapeSyntax, boolean stripWhitespace) {
59 this(reader);
60 this.template = template;
61 token_source.strictEscapeSyntax = strictEscapeSyntax;
62 this.templateName = template != null ? template.getName() : "";
63 token_source.templateName = templateName;
64 this.stripWhitespace = stripWhitespace;
65 }
66
67 public FMParser(Template template, Reader reader, boolean strictEscapeSyntax, boolean stripWhitespace, int tagSyntax) {
68 this(template, reader, strictEscapeSyntax, stripWhitespace);
69 switch (tagSyntax) {
70 case Configuration.AUTO_DETECT_TAG_SYNTAX :
71 token_source.autodetectTagSyntax = true;
72 break;
73 case Configuration.ANGLE_BRACKET_TAG_SYNTAX :
74 token_source.altDirectiveSyntax = false;
75 break;
76 case Configuration.SQUARE_BRACKET_TAG_SYNTAX :
77 token_source.altDirectiveSyntax = true;
78 break;
79 default : throw new IllegalArgumentException("Illegal argument for tagSyntax");
80 }
81 }
82
83 public FMParser(String template) {
84 this(null, new StringReader(template), true, true);
85 }
86
87 private String getErrorStart(Token t) {
88 return "Error in template: " + template.getName()
89 + "\non line " + t.beginLine + ", column " + t.beginColumn;
90 }
91
92
93
94
95
96 private void notStringLiteral(Expression exp, String expected) throws ParseException {
97 if (exp instanceof StringLiteral) {
98 String msg = "Error " + exp.getStartLocation()
99 + "\nFound string literal: " + exp
100 + "\nExpecting: " + expected;
101 throw new ParseException(msg, exp);
102 }
103 }
104
105
106
107
108
109 private void notNumberLiteral(Expression exp, String expected) throws ParseException {
110 if (exp instanceof NumberLiteral) {
111 String msg = "Error " + exp.getStartLocation()
112 + "\nFound number literal: " + exp.getCanonicalForm()
113 + "\nExpecting " + expected;
114 throw new ParseException(msg, exp);
115 }
116 }
117
118
119
120
121
122 private void notBooleanLiteral(Expression exp, String expected) throws ParseException {
123 if (exp instanceof BooleanLiteral) {
124 String msg = "Error " + exp.getStartLocation()
125 + "\nFound: " + exp.getCanonicalForm()
126 + "\nExpecting " + expected;
127 throw new ParseException(msg, exp);
128 }
129 }
130
131
132
133
134
135 private void notHashLiteral(Expression exp, String expected) throws ParseException {
136 if (exp instanceof HashLiteral) {
137 String msg = "Error " + exp.getStartLocation()
138 + "\nFound hash literal: " + exp.getCanonicalForm()
139 + "\nExpecting " + expected;
140 throw new ParseException(msg, exp);
141 }
142 }
143
144
145
146
147
148
149 private void notListLiteral(Expression exp, String expected)
150 throws ParseException
151 {
152 if (exp instanceof ListLiteral) {
153 String msg = "Error " + exp.getStartLocation()
154 + "\nFound list literal: " + exp.getCanonicalForm()
155 + "\nExpecting " + expected;
156 throw new ParseException(msg, exp);
157 }
158 }
159
160
161
162
163 private void numberLiteralOnly(Expression exp) throws ParseException {
164 notStringLiteral(exp, "number");
165 notListLiteral(exp, "number");
166 notHashLiteral(exp, "number");
167 notBooleanLiteral(exp, "number");
168 }
169
170
171
172
173
174 private void stringLiteralOnly(Expression exp) throws ParseException {
175 notNumberLiteral(exp, "number");
176 notListLiteral(exp, "number");
177 notHashLiteral(exp, "number");
178 notBooleanLiteral(exp, "number");
179 }
180
181
182
183
184
185 private void booleanLiteralOnly(Expression exp) throws ParseException {
186 notStringLiteral(exp, "boolean (true/false)");
187 notListLiteral(exp, "boolean (true/false)");
188 notHashLiteral(exp, "boolean (true/false)");
189 notNumberLiteral(exp, "boolean (true/false)");
190 }
191
192 private Expression escapedExpression(Expression exp) {
193 if(!escapes.isEmpty()) {
194 return ((EscapeBlock)escapes.getFirst()).doEscape(exp);
195 }
196 return exp;
197 }
198
199 private boolean getBoolean(Expression exp) throws ParseException {
200 TemplateModel tm = null;
201 try {
202 tm = exp.getAsTemplateModel(null);
203 } catch (Exception e) {
204 throw new ParseException(e.getMessage()
205 + "\nCould not evaluate expression: "
206 + exp.getCanonicalForm()
207 + exp.getStartLocation(), exp);
208 }
209 if (tm instanceof TemplateBooleanModel) {
210 try {
211 return ((TemplateBooleanModel) tm).getAsBoolean();
212 } catch (TemplateModelException tme) {
213 }
214 }
215 if (tm instanceof TemplateScalarModel) {
216 try {
217 return StringUtil.getYesNo(((TemplateScalarModel) tm).getAsString());
218 } catch (Exception e) {
219 throw new ParseException(e.getMessage()
220 + "\nExpecting yes/no, found: " + exp.getCanonicalForm()
221 + exp.getStartLocation(), exp);
222 }
223 }
224 throw new ParseException("Expecting boolean (yes/no) parameter" + exp.getStartLocation(), exp);
225 }
226
227
228
229
230
231
232
233
234
235
236 final public Expression Expression() throws ParseException {
237 Expression exp;
238 exp = OrExpression();
239 {if (true) return exp;}
240 throw new Error("Missing return statement in function");
241 }
242
243
244
245
246
247
248 final public Expression PrimaryExpression() throws ParseException {
249 Expression exp;
250 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
251 case INTEGER:
252 case DECIMAL:
253 exp = NumberLiteral();
254 break;
255 case OPEN_BRACE:
256 exp = HashLiteral();
257 break;
258 case STRING_LITERAL:
259 case RAW_STRING:
260 exp = StringLiteral(true);
261 break;
262 case FALSE:
263 case TRUE:
264 exp = BooleanLiteral();
265 break;
266 case OPEN_BRACKET:
267 exp = ListLiteral();
268 break;
269 case ID:
270 exp = Identifier();
271 break;
272 case OPEN_PAREN:
273 exp = Parenthesis();
274 break;
275 case DOT:
276 exp = BuiltinVariable();
277 break;
278 default:
279 jj_la1[0] = jj_gen;
280 jj_consume_token(-1);
281 throw new ParseException();
282 }
283 label_1:
284 while (true) {
285 if (jj_2_1(2147483647)) {
286 ;
287 } else {
288 break label_1;
289 }
290 exp = AddSubExpression(exp);
291 }
292 {if (true) return exp;}
293 throw new Error("Missing return statement in function");
294 }
295
296 final public Expression Parenthesis() throws ParseException {
297 Expression exp, result;
298 Token start, end;
299 start = jj_consume_token(OPEN_PAREN);
300 exp = Expression();
301 end = jj_consume_token(CLOSE_PAREN);
302 result = new ParentheticalExpression(exp);
303 result.setLocation(template, start, end);
304 {if (true) return result;}
305 throw new Error("Missing return statement in function");
306 }
307
308
309
310
311
312
313 final public Expression UnaryExpression() throws ParseException {
314 Expression exp, result;
315 boolean haveNot = false;
316 Token t = null, start=null;
317 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
318 case PLUS:
319 case MINUS:
320 result = UnaryPlusMinusExpression();
321 break;
322 case EXCLAM:
323 result = NotExpression();
324 break;
325 case STRING_LITERAL:
326 case RAW_STRING:
327 case FALSE:
328 case TRUE:
329 case INTEGER:
330 case DECIMAL:
331 case DOT:
332 case OPEN_BRACKET:
333 case OPEN_PAREN:
334 case OPEN_BRACE:
335 case ID:
336 result = PrimaryExpression();
337 break;
338 default:
339 jj_la1[1] = jj_gen;
340 jj_consume_token(-1);
341 throw new ParseException();
342 }
343 {if (true) return result;}
344 throw new Error("Missing return statement in function");
345 }
346
347 final public Expression NotExpression() throws ParseException {
348 Token t;
349 Expression exp, result=null;
350 ArrayList nots = new ArrayList();
351 label_2:
352 while (true) {
353 t = jj_consume_token(EXCLAM);
354 nots.add(t);
355 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
356 case EXCLAM:
357 ;
358 break;
359 default:
360 jj_la1[2] = jj_gen;
361 break label_2;
362 }
363 }
364 exp = PrimaryExpression();
365 for (int i=0; i<nots.size(); i++) {
366 result = new NotExpression(exp);
367 Token tok = (Token) nots.get(nots.size() -i -1);
368 result.setLocation(template, tok, exp);
369 exp = result;
370 }
371 {if (true) return result;}
372 throw new Error("Missing return statement in function");
373 }
374
375 final public Expression UnaryPlusMinusExpression() throws ParseException {
376 Expression exp, result;
377 boolean isMinus = false;
378 Token t;
379 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
380 case PLUS:
381 t = jj_consume_token(PLUS);
382 break;
383 case MINUS:
384 t = jj_consume_token(MINUS);
385 isMinus = true;
386 break;
387 default:
388 jj_la1[3] = jj_gen;
389 jj_consume_token(-1);
390 throw new ParseException();
391 }
392 exp = PrimaryExpression();
393 result = new UnaryPlusMinusExpression(exp, isMinus);
394 result.setLocation(template, t, exp);
395 {if (true) return result;}
396 throw new Error("Missing return statement in function");
397 }
398
399 final public Expression AdditiveExpression() throws ParseException {
400 Expression lhs, rhs, result;
401 boolean plus;
402 lhs = MultiplicativeExpression();
403 result = lhs;
404 label_3:
405 while (true) {
406 if (jj_2_2(2147483647)) {
407 ;
408 } else {
409 break label_3;
410 }
411 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
412 case PLUS:
413 jj_consume_token(PLUS);
414 plus = true;
415 break;
416 case MINUS:
417 jj_consume_token(MINUS);
418 plus = false;
419 break;
420 default:
421 jj_la1[4] = jj_gen;
422 jj_consume_token(-1);
423 throw new ParseException();
424 }
425 rhs = MultiplicativeExpression();
426 if (plus) {
427
428
429 result = new AddConcatExpression(lhs, rhs);
430 }
431 else {
432 numberLiteralOnly(lhs);
433 numberLiteralOnly(rhs);
434 result = new ArithmeticExpression(lhs,
435 rhs,
436 ArithmeticExpression.SUBSTRACTION);
437 }
438 result.setLocation(template, lhs, rhs);
439 lhs = result;
440 }
441 {if (true) return result;}
442 throw new Error("Missing return statement in function");
443 }
444
445
446
447
448
449 final public Expression MultiplicativeExpression() throws ParseException {
450 Expression lhs, rhs, result;
451 int operation = ArithmeticExpression.MULTIPLICATION;
452 lhs = UnaryExpression();
453 result = lhs;
454 label_4:
455 while (true) {
456 if (jj_2_3(2147483647)) {
457 ;
458 } else {
459 break label_4;
460 }
461 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
462 case TIMES:
463 jj_consume_token(TIMES);
464 operation = ArithmeticExpression.MULTIPLICATION;
465 break;
466 case DIVIDE:
467 jj_consume_token(DIVIDE);
468 operation = ArithmeticExpression.DIVISION;
469 break;
470 case PERCENT:
471 jj_consume_token(PERCENT);
472 operation = ArithmeticExpression.MODULUS;
473 break;
474 default:
475 jj_la1[5] = jj_gen;
476 jj_consume_token(-1);
477 throw new ParseException();
478 }
479 rhs = UnaryExpression();
480 numberLiteralOnly(lhs);
481 numberLiteralOnly(rhs);
482 result = new ArithmeticExpression(lhs, rhs, operation);
483 result.setLocation(template, lhs, rhs);
484 lhs = result;
485 }
486 {if (true) return result;}
487 throw new Error("Missing return statement in function");
488 }
489
490 final public Expression EqualityExpression() throws ParseException {
491 Expression lhs, rhs, result;
492 Token t;
493 lhs = RelationalExpression();
494 result = lhs;
495 if (jj_2_4(2147483647)) {
496 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
497 case NOT_EQUALS:
498 t = jj_consume_token(NOT_EQUALS);
499 break;
500 case EQUALS:
501 t = jj_consume_token(EQUALS);
502 break;
503 case DOUBLE_EQUALS:
504 t = jj_consume_token(DOUBLE_EQUALS);
505 break;
506 default:
507 jj_la1[6] = jj_gen;
508 jj_consume_token(-1);
509 throw new ParseException();
510 }
511 rhs = RelationalExpression();
512 notHashLiteral(lhs, "scalar");
513 notHashLiteral(rhs, "scalar");
514 notListLiteral(lhs, "scalar");
515 notListLiteral(rhs, "scalar");
516 result = new ComparisonExpression(lhs, rhs, t.image);
517 result.setLocation(template, lhs, rhs);
518 } else {
519 ;
520 }
521 {if (true) return result;}
522 throw new Error("Missing return statement in function");
523 }
524
525 final public Expression RelationalExpression() throws ParseException {
526 Expression lhs, rhs, result;
527 Token t;
528 lhs = RangeExpression();
529 result = lhs;
530 if (jj_2_5(2147483647)) {
531 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
532 case NATURAL_GTE:
533 t = jj_consume_token(NATURAL_GTE);
534 break;
535 case ESCAPED_GTE:
536 t = jj_consume_token(ESCAPED_GTE);
537 break;
538 case NATURAL_GT:
539 t = jj_consume_token(NATURAL_GT);
540 break;
541 case ESCAPED_GT:
542 t = jj_consume_token(ESCAPED_GT);
543 break;
544 case LESS_THAN_EQUALS:
545 t = jj_consume_token(LESS_THAN_EQUALS);
546 break;
547 case LESS_THAN:
548 t = jj_consume_token(LESS_THAN);
549 break;
550 default:
551 jj_la1[7] = jj_gen;
552 jj_consume_token(-1);
553 throw new ParseException();
554 }
555 rhs = RangeExpression();
556 notHashLiteral(lhs, "scalar");
557 notHashLiteral(rhs, "scalar");
558 notListLiteral(lhs, "scalar");
559 notListLiteral(rhs, "scalar");
560 notStringLiteral(lhs, "number");
561 notStringLiteral(rhs, "number");
562 result = new ComparisonExpression(lhs, rhs, t.image);
563 result.setLocation(template, lhs, rhs);
564 } else {
565 ;
566 }
567 {if (true) return result;}
568 throw new Error("Missing return statement in function");
569 }
570
571 final public Expression RangeExpression() throws ParseException {
572 Expression lhs, rhs=null, result;
573 lhs = AdditiveExpression();
574 result = lhs;
575 if (jj_2_7(2147483647)) {
576 jj_consume_token(DOT_DOT);
577 if (jj_2_6(2147483647)) {
578 rhs = AdditiveExpression();
579 } else {
580 ;
581 }
582 numberLiteralOnly(lhs);
583 if (rhs != null) {
584 numberLiteralOnly(rhs);
585 }
586 Range range = new Range(lhs, rhs);
587 if (rhs != null) {
588 range.setLocation(template, lhs, rhs);
589 } else {
590 range.setLocation(template, lhs, lhs);
591 }
592 result = range;
593 } else {
594 ;
595 }
596 {if (true) return result;}
597 throw new Error("Missing return statement in function");
598 }
599
600 final public Expression AndExpression() throws ParseException {
601 Expression lhs, rhs, result;
602 lhs = EqualityExpression();
603 result = lhs;
604 label_5:
605 while (true) {
606 if (jj_2_8(2147483647)) {
607 ;
608 } else {
609 break label_5;
610 }
611 jj_consume_token(AND);
612 rhs = EqualityExpression();
613 booleanLiteralOnly(lhs);
614 booleanLiteralOnly(rhs);
615 result = new AndExpression(lhs, rhs);
616 result.setLocation(template, lhs, rhs);
617 lhs = result;
618 }
619 {if (true) return result;}
620 throw new Error("Missing return statement in function");
621 }
622
623 final public Expression OrExpression() throws ParseException {
624 Expression lhs, rhs, result;
625 lhs = AndExpression();
626 result = lhs;
627 label_6:
628 while (true) {
629 if (jj_2_9(2147483647)) {
630 ;
631 } else {
632 break label_6;
633 }
634 jj_consume_token(OR);
635 rhs = AndExpression();
636 booleanLiteralOnly(lhs);
637 booleanLiteralOnly(rhs);
638 result = new OrExpression(lhs, rhs);
639 result.setLocation(template, lhs, rhs);
640 lhs = result;
641 }
642 {if (true) return result;}
643 throw new Error("Missing return statement in function");
644 }
645
646 final public ListLiteral ListLiteral() throws ParseException {
647 ArrayList values = new ArrayList();
648 Token begin, end;
649 begin = jj_consume_token(OPEN_BRACKET);
650 values = PositionalArgs();
651 end = jj_consume_token(CLOSE_BRACKET);
652 ListLiteral result = new ListLiteral(values);
653 result.setLocation(template, begin, end);
654 {if (true) return result;}
655 throw new Error("Missing return statement in function");
656 }
657
658 final public Expression NumberLiteral() throws ParseException {
659 Token op = null, t;
660 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
661 case INTEGER:
662 t = jj_consume_token(INTEGER);
663 break;
664 case DECIMAL:
665 t = jj_consume_token(DECIMAL);
666 break;
667 default:
668 jj_la1[8] = jj_gen;
669 jj_consume_token(-1);
670 throw new ParseException();
671 }
672 String s = t.image;
673 Expression result = new NumberLiteral(template.getArithmeticEngine().toNumber(s));
674 Token startToken = (op != null) ? op : t;
675 result.setLocation(template, startToken, t);
676 {if (true) return result;}
677 throw new Error("Missing return statement in function");
678 }
679
680 final public Identifier Identifier() throws ParseException {
681 Token t;
682 t = jj_consume_token(ID);
683 Identifier id = new Identifier(t.image);
684 id.setLocation(template, t, t);
685 {if (true) return id;}
686 throw new Error("Missing return statement in function");
687 }
688
689 final public Expression IdentifierOrStringLiteral() throws ParseException {
690 Expression exp;
691 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
692 case ID:
693 exp = Identifier();
694 break;
695 case STRING_LITERAL:
696 case RAW_STRING:
697 exp = StringLiteral(false);
698 break;
699 default:
700 jj_la1[9] = jj_gen;
701 jj_consume_token(-1);
702 throw new ParseException();
703 }
704 {if (true) return exp;}
705 throw new Error("Missing return statement in function");
706 }
707
708 final public BuiltinVariable BuiltinVariable() throws ParseException {
709 Token dot, name;
710 dot = jj_consume_token(DOT);
711 name = jj_consume_token(ID);
712 BuiltinVariable result = null;
713 try {
714 result = new BuiltinVariable(name.image);
715 } catch (ParseException pe) {
716 pe.lineNumber = dot.beginLine;
717 pe.columnNumber = dot.beginColumn;
718 {if (true) throw pe;}
719 }
720 result.setLocation(template, dot, name);
721 {if (true) return result;}
722 throw new Error("Missing return statement in function");
723 }
724
725
726
727
728
729
730 final public Expression AddSubExpression(Expression exp) throws ParseException {
731 Expression result = null;
732 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
733 case DOT:
734 result = DotVariable(exp);
735 break;
736 case OPEN_BRACKET:
737 result = DynamicKey(exp);
738 break;
739 case OPEN_PAREN:
740 result = MethodArgs(exp);
741 break;
742 case BUILT_IN:
743 result = BuiltIn(exp);
744 break;
745 case EXCLAM:
746 case TERMINATING_EXCLAM:
747 result = DefaultTo(exp);
748 break;
749 case EXISTS:
750 result = Exists(exp);
751 break;
752 default:
753 jj_la1[10] = jj_gen;
754 jj_consume_token(-1);
755 throw new ParseException();
756 }
757 {if (true) return result;}
758 throw new Error("Missing return statement in function");
759 }
760
761 final public Expression DefaultTo(Expression exp) throws ParseException {
762 Expression rhs = null;
763 Token t;
764 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
765 case TERMINATING_EXCLAM:
766 t = jj_consume_token(TERMINATING_EXCLAM);
767 break;
768 case EXCLAM:
769 t = jj_consume_token(EXCLAM);
770 if (jj_2_10(2147483647)) {
771 rhs = Expression();
772 } else {
773 ;
774 }
775 break;
776 default:
777 jj_la1[11] = jj_gen;
778 jj_consume_token(-1);
779 throw new ParseException();
780 }
781 DefaultToExpression result = new DefaultToExpression(exp, rhs);
782 if (rhs ==null) {
783 result.setLocation(template, exp, t);
784 }
785 else {
786 result.setLocation(template, exp, rhs);
787 }
788 {if (true) return result;}
789 throw new Error("Missing return statement in function");
790 }
791
792 final public Expression Exists(Expression exp) throws ParseException {
793 Token t;
794 t = jj_consume_token(EXISTS);
795 ExistsExpression result = new ExistsExpression(exp);
796 result.setLocation(template, exp, t);
797 {if (true) return result;}
798 throw new Error("Missing return statement in function");
799 }
800
801 final public Expression BuiltIn(Expression exp) throws ParseException {
802 Token t=null;
803 jj_consume_token(BUILT_IN);
804 t = jj_consume_token(ID);
805 BuiltIn result = null;
806 try {
807 result = BuiltIn.newBuiltIn(exp, t.image, t, templateName);
808 } catch (ParseException pe) {
809 pe.lineNumber = t.beginLine;
810 pe.columnNumber = t.beginColumn;
811 {if (true) throw pe;}
812 }
813 result.setLocation(template, exp, t);
814 {if (true) return result;}
815 throw new Error("Missing return statement in function");
816 }
817
818
819
820
821 final public Expression DotVariable(Expression exp) throws ParseException {
822 Token t;
823 jj_consume_token(DOT);
824 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
825 case ID:
826 t = jj_consume_token(ID);
827 break;
828 case TIMES:
829 t = jj_consume_token(TIMES);
830 break;
831 case DOUBLE_STAR:
832 t = jj_consume_token(DOUBLE_STAR);
833 break;
834 case FALSE:
835 case TRUE:
836 case LESS_THAN:
837 case LESS_THAN_EQUALS:
838 case ESCAPED_GT:
839 case ESCAPED_GTE:
840 case IN:
841 case AS:
842 case USING:
843 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
844 case LESS_THAN:
845 t = jj_consume_token(LESS_THAN);
846 break;
847 case LESS_THAN_EQUALS:
848 t = jj_consume_token(LESS_THAN_EQUALS);
849 break;
850 case ESCAPED_GT:
851 t = jj_consume_token(ESCAPED_GT);
852 break;
853 case ESCAPED_GTE:
854 t = jj_consume_token(ESCAPED_GTE);
855 break;
856 case FALSE:
857 t = jj_consume_token(FALSE);
858 break;
859 case TRUE:
860 t = jj_consume_token(TRUE);
861 break;
862 case IN:
863 t = jj_consume_token(IN);
864 break;
865 case AS:
866 t = jj_consume_token(AS);
867 break;
868 case USING:
869 t = jj_consume_token(USING);
870 break;
871 default:
872 jj_la1[12] = jj_gen;
873 jj_consume_token(-1);
874 throw new ParseException();
875 }
876 if (!Character.isLetter(t.image.charAt(0))) {
877 String msg = getErrorStart(t)
878 + "\n" + t.image + " is not a valid identifier.";
879 {if (true) throw new ParseException(msg, t.beginLine, t.beginColumn);}
880 }
881 break;
882 default:
883 jj_la1[13] = jj_gen;
884 jj_consume_token(-1);
885 throw new ParseException();
886 }
887 notListLiteral(exp, "hash");
888 notStringLiteral(exp, "hash");
889 notBooleanLiteral(exp, "hash");
890 Dot dot = new Dot(exp, t.image);
891 dot.setLocation(template, exp, t);
892 {if (true) return dot;}
893 throw new Error("Missing return statement in function");
894 }
895
896
897
898
899
900 final public Expression DynamicKey(Expression exp) throws ParseException {
901 Expression arg;
902 Token t;
903 jj_consume_token(OPEN_BRACKET);
904 arg = Expression();
905 t = jj_consume_token(CLOSE_BRACKET);
906 notBooleanLiteral(exp, "list or hash");
907 notNumberLiteral(exp, "list or hash");
908 DynamicKeyName dkn = new DynamicKeyName(exp, arg);
909 dkn.setLocation(template, exp, t);
910 {if (true) return dkn;}
911 throw new Error("Missing return statement in function");
912 }
913
914
915
916
917 final public MethodCall MethodArgs(Expression exp) throws ParseException {
918 ArrayList args = new ArrayList();
919 Token end;
920 jj_consume_token(OPEN_PAREN);
921 args = PositionalArgs();
922 end = jj_consume_token(CLOSE_PAREN);
923 args.trimToSize();
924 MethodCall result = new MethodCall(exp, args);
925 result.setLocation(template, exp, end);
926 {if (true) return result;}
927 throw new Error("Missing return statement in function");
928 }
929
930 final public StringLiteral StringLiteral(boolean interpolate) throws ParseException {
931 Token t;
932 boolean raw = false;
933 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
934 case STRING_LITERAL:
935 t = jj_consume_token(STRING_LITERAL);
936 break;
937 case RAW_STRING:
938 t = jj_consume_token(RAW_STRING);
939 raw = true;
940 break;
941 default:
942 jj_la1[14] = jj_gen;
943 jj_consume_token(-1);
944 throw new ParseException();
945 }
946 String s = t.image;
947
948 s = s.substring(1, s.length() -1);
949 if (raw) {
950 s=s.substring(1);
951 }
952 else try {
953 s = StringUtil.FTLStringLiteralDec(s);
954 } catch (ParseException pe) {
955 pe.lineNumber = t.beginLine;
956 pe.columnNumber = t.beginColumn;
957 {if (true) throw pe;}
958 }
959 StringLiteral result = new StringLiteral(s);
960 result.setLocation(template, t, t);
961 if (interpolate && !raw) {
962 if (t.image.indexOf("${") >=0 || t.image.indexOf("#{") >=0)
963 result.checkInterpolation();
964 }
965 {if (true) return result;}
966 throw new Error("Missing return statement in function");
967 }
968
969 final public Expression BooleanLiteral() throws ParseException {
970 Token t;
971 Expression result;
972 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
973 case FALSE:
974 t = jj_consume_token(FALSE);
975 result = new BooleanLiteral(false);
976 break;
977 case TRUE:
978 t = jj_consume_token(TRUE);
979 result = new BooleanLiteral(true);
980 break;
981 default:
982 jj_la1[15] = jj_gen;
983 jj_consume_token(-1);
984 throw new ParseException();
985 }
986 result.setLocation(template, t, t);
987 {if (true) return result;}
988 throw new Error("Missing return statement in function");
989 }
990
991 final public HashLiteral HashLiteral() throws ParseException {
992 Token begin, end;
993 Expression key, value;
994 ArrayList keys = new ArrayList();
995 ArrayList values = new ArrayList();
996 begin = jj_consume_token(OPEN_BRACE);
997 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
998 case STRING_LITERAL:
999 case RAW_STRING:
1000 case FALSE:
1001 case TRUE:
1002 case INTEGER:
1003 case DECIMAL:
1004 case DOT:
1005 case PLUS:
1006 case MINUS:
1007 case EXCLAM:
1008 case OPEN_BRACKET:
1009 case OPEN_PAREN:
1010 case OPEN_BRACE:
1011 case ID:
1012 key = Expression();
1013 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1014 case COMMA:
1015 jj_consume_token(COMMA);
1016 break;
1017 case COLON:
1018 jj_consume_token(COLON);
1019 break;
1020 default:
1021 jj_la1[16] = jj_gen;
1022 jj_consume_token(-1);
1023 throw new ParseException();
1024 }
1025 value = Expression();
1026 stringLiteralOnly(key);
1027 keys.add(key);
1028 values.add(value);
1029 label_7:
1030 while (true) {
1031 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1032 case COMMA:
1033 ;
1034 break;
1035 default:
1036 jj_la1[17] = jj_gen;
1037 break label_7;
1038 }
1039 jj_consume_token(COMMA);
1040 key = Expression();
1041 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1042 case COMMA:
1043 jj_consume_token(COMMA);
1044 break;
1045 case COLON:
1046 jj_consume_token(COLON);
1047 break;
1048 default:
1049 jj_la1[18] = jj_gen;
1050 jj_consume_token(-1);
1051 throw new ParseException();
1052 }
1053 value = Expression();
1054 stringLiteralOnly(key);
1055 keys.add(key);
1056 values.add(value);
1057 }
1058 break;
1059 default:
1060 jj_la1[19] = jj_gen;
1061 ;
1062 }
1063 end = jj_consume_token(CLOSE_BRACE);
1064 HashLiteral result = new HashLiteral(keys, values);
1065 result.setLocation(template, begin, end);
1066 {if (true) return result;}
1067 throw new Error("Missing return statement in function");
1068 }
1069
1070
1071
1072
1073
1074 final public DollarVariable StringOutput() throws ParseException {
1075 Expression exp;
1076 Token begin, end;
1077 begin = jj_consume_token(OUTPUT_ESCAPE);
1078 exp = Expression();
1079 notHashLiteral(exp, "scalar");
1080 notListLiteral(exp, "scalar");
1081 notBooleanLiteral(exp, "scalar");
1082 end = jj_consume_token(CLOSE_BRACE);
1083 DollarVariable result = new DollarVariable(exp, escapedExpression(exp));
1084 result.setLocation(template, begin, end);
1085 {if (true) return result;}
1086 throw new Error("Missing return statement in function");
1087 }
1088
1089 final public NumericalOutput NumericalOutput() throws ParseException {
1090 Expression exp;
1091 Token fmt = null, begin, end;
1092 begin = jj_consume_token(NUMERICAL_ESCAPE);
1093 exp = Expression();
1094 numberLiteralOnly(exp);
1095 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1096 case SEMICOLON:
1097 jj_consume_token(SEMICOLON);
1098 fmt = jj_consume_token(ID);
1099 break;
1100 default:
1101 jj_la1[20] = jj_gen;
1102 ;
1103 }
1104 end = jj_consume_token(CLOSE_BRACE);
1105 NumericalOutput result;
1106 if (fmt != null) {
1107 int minFrac = -1;
1108 int maxFrac = -1;
1109
1110 StringTokenizer st = new StringTokenizer(fmt.image, "mM", true);
1111 char type = '-';
1112 while (st.hasMoreTokens()) {
1113 String token = st.nextToken();
1114 try {
1115 if (type != '-') {
1116 switch (type) {
1117 case 'm':
1118 if (minFrac != -1) {if (true) throw new ParseException("invalid formatting string", fmt.beginLine, fmt.beginColumn);}
1119 minFrac = Integer.parseInt(token);
1120 break;
1121 case 'M':
1122 if (maxFrac != -1) {if (true) throw new ParseException("invalid formatting string", fmt.beginLine, fmt.beginColumn);}
1123 maxFrac = Integer.parseInt(token);
1124 break;
1125 default:
1126 {if (true) throw new ParseException();}
1127 }
1128 type = '-';
1129 } else if (token.equals("m")) {
1130 type = 'm';
1131 } else if (token.equals("M")) {
1132 type = 'M';
1133 } else {
1134 {if (true) throw new ParseException();}
1135 }
1136 }
1137 catch (ParseException e) {
1138 String msg = getErrorStart(fmt)
1139 + "\nInvalid format specifier "
1140 + fmt.image;
1141 {if (true) throw new ParseException(msg, fmt.beginLine, fmt.beginColumn);}
1142 }
1143 catch (NumberFormatException e) {
1144 String msg = getErrorStart(fmt)
1145 + "\nInvalid number in the format specifier "
1146 + fmt.image;
1147 {if (true) throw new ParseException(msg, fmt.beginLine, fmt.beginColumn);}
1148 }
1149 }
1150
1151 if (maxFrac == -1) {
1152 if (minFrac == -1) {
1153 String msg = getErrorStart(fmt)
1154 + "\nInvalid format specification, at least one of m and M must be specified!";
1155 {if (true) throw new ParseException(msg, fmt.beginLine, fmt.beginColumn);}
1156 }
1157 maxFrac = minFrac;
1158 } else if (minFrac == -1) {
1159 minFrac = 0;
1160 }
1161 if (minFrac > maxFrac) {
1162 String msg = getErrorStart(fmt)
1163 + "\nInvalid format specification, min cannot be greater than max!";
1164 {if (true) throw new ParseException(msg, fmt.beginLine, fmt.beginColumn);}
1165 }
1166 if (minFrac > 50 || maxFrac > 50) {
1167 String msg = getErrorStart(fmt)
1168 + "\nCannot specify more than 50 fraction digits";
1169 {if (true) throw new ParseException(msg, fmt.beginLine, fmt.beginColumn);}
1170 }
1171 result = new NumericalOutput(exp, minFrac, maxFrac);
1172 } else {
1173 result = new NumericalOutput(exp);
1174 }
1175 result.setLocation(template, begin, end);
1176 {if (true) return result;}
1177 throw new Error("Missing return statement in function");
1178 }
1179
1180 final public TemplateElement If() throws ParseException {
1181 Token start, end, t;
1182 Expression condition;
1183 TemplateElement block;
1184 IfBlock ifBlock;
1185 ConditionalBlock cblock;
1186 start = jj_consume_token(IF);
1187 condition = Expression();
1188 jj_consume_token(DIRECTIVE_END);
1189 block = OptionalBlock();
1190 cblock = new ConditionalBlock(condition, block, true);
1191 cblock.setLocation(template, start, block);
1192 ifBlock = new IfBlock(cblock);
1193 label_8:
1194 while (true) {
1195 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1196 case ELSE_IF:
1197 ;
1198 break;
1199 default:
1200 jj_la1[21] = jj_gen;
1201 break label_8;
1202 }
1203 t = jj_consume_token(ELSE_IF);
1204 condition = Expression();
1205 LooseDirectiveEnd();
1206 block = OptionalBlock();
1207 cblock = new ConditionalBlock(condition, block, false);
1208 cblock.setLocation(template, t, block);
1209 ifBlock.addBlock(cblock);
1210 }
1211 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1212 case ELSE:
1213 t = jj_consume_token(ELSE);
1214 block = OptionalBlock();
1215 cblock = new ConditionalBlock(null, block, false);
1216 cblock.setLocation(template, t, block);
1217 ifBlock.addBlock(cblock);
1218 break;
1219 default:
1220 jj_la1[22] = jj_gen;
1221 ;
1222 }
1223 end = jj_consume_token(END_IF);
1224 ifBlock.setLocation(template, start, end);
1225 {if (true) return ifBlock;}
1226 throw new Error("Missing return statement in function");
1227 }
1228
1229 final public AttemptBlock Attempt() throws ParseException {
1230 Token start, end;
1231 TemplateElement block, recoveryBlock;
1232 start = jj_consume_token(ATTEMPT);
1233 block = OptionalBlock();
1234 recoveryBlock = Recover();
1235 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1236 case END_RECOVER:
1237 end = jj_consume_token(END_RECOVER);
1238 break;
1239 case END_ATTEMPT:
1240 end = jj_consume_token(END_ATTEMPT);
1241 break;
1242 default:
1243 jj_la1[23] = jj_gen;
1244 jj_consume_token(-1);
1245 throw new ParseException();
1246 }
1247 AttemptBlock result = new AttemptBlock(block, recoveryBlock);
1248 result.setLocation(template, start, end);
1249 {if (true) return result;}
1250 throw new Error("Missing return statement in function");
1251 }
1252
1253 final public RecoveryBlock Recover() throws ParseException {
1254 Token start;
1255 TemplateElement block;
1256 start = jj_consume_token(RECOVER);
1257 block = OptionalBlock();
1258 RecoveryBlock result = new RecoveryBlock(block);
1259 result.setLocation(template, start, block);
1260 {if (true) return result;}
1261 throw new Error("Missing return statement in function");
1262 }
1263
1264 final public IteratorBlock List() throws ParseException {
1265 Expression exp;
1266 Token index, start, end;
1267 TemplateElement block;
1268 start = jj_consume_token(LIST);
1269 ++loopNesting;
1270 exp = Expression();
1271 jj_consume_token(AS);
1272 index = jj_consume_token(ID);
1273 jj_consume_token(DIRECTIVE_END);
1274 block = OptionalBlock();
1275 end = jj_consume_token(END_LIST);
1276 --loopNesting;
1277 IteratorBlock result = new IteratorBlock(exp,
1278 index.image,
1279 block,
1280 false);
1281 result.setLocation(template, start, end);
1282 {if (true) return result;}
1283 throw new Error("Missing return statement in function");
1284 }
1285
1286 final public IteratorBlock ForEach() throws ParseException {
1287 Expression exp;
1288 Token index, start, end;
1289 TemplateElement block;
1290 start = jj_consume_token(FOREACH);
1291 ++loopNesting;
1292 index = jj_consume_token(ID);
1293 jj_consume_token(IN);
1294 exp = Expression();
1295 jj_consume_token(DIRECTIVE_END);
1296 block = OptionalBlock();
1297 end = jj_consume_token(END_FOREACH);
1298 --loopNesting;
1299 IteratorBlock result = new IteratorBlock(exp,
1300 index.image,
1301 block,
1302 true);
1303 result.setLocation(template, start, end);
1304 {if (true) return result;}
1305 throw new Error("Missing return statement in function");
1306 }
1307
1308 final public VisitNode Visit() throws ParseException {
1309 Token start, end;
1310 Expression targetNode, namespaces=null;
1311 start = jj_consume_token(VISIT);
1312 targetNode = Expression();
1313 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1314 case USING:
1315 jj_consume_token(USING);
1316 namespaces = Expression();
1317 break;
1318 default:
1319 jj_la1[24] = jj_gen;
1320 ;
1321 }
1322 end = LooseDirectiveEnd();
1323 VisitNode result = new VisitNode(targetNode, namespaces);
1324 result.setLocation(template, start, end);
1325 {if (true) return result;}
1326 throw new Error("Missing return statement in function");
1327 }
1328
1329 final public RecurseNode Recurse() throws ParseException {
1330 Token start, end = null;
1331 Expression node=null, namespaces=null;
1332 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1333 case SIMPLE_RECURSE:
1334 start = jj_consume_token(SIMPLE_RECURSE);
1335 break;
1336 case RECURSE:
1337 start = jj_consume_token(RECURSE);
1338 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1339 case STRING_LITERAL:
1340 case RAW_STRING:
1341 case FALSE:
1342 case TRUE:
1343 case INTEGER:
1344 case DECIMAL:
1345 case DOT:
1346 case PLUS:
1347 case MINUS:
1348 case EXCLAM:
1349 case OPEN_BRACKET:
1350 case OPEN_PAREN:
1351 case OPEN_BRACE:
1352 case ID:
1353 node = Expression();
1354 break;
1355 default:
1356 jj_la1[25] = jj_gen;
1357 ;
1358 }
1359 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1360 case USING:
1361 jj_consume_token(USING);
1362 namespaces = Expression();
1363 break;
1364 default:
1365 jj_la1[26] = jj_gen;
1366 ;
1367 }
1368 end = LooseDirectiveEnd();
1369 break;
1370 default:
1371 jj_la1[27] = jj_gen;
1372 jj_consume_token(-1);
1373 throw new ParseException();
1374 }
1375 if (end == null) end = start;
1376 RecurseNode result = new RecurseNode(node, namespaces);
1377 result.setLocation(template, start, end);
1378 {if (true) return result;}
1379 throw new Error("Missing return statement in function");
1380 }
1381
1382 final public FallbackInstruction FallBack() throws ParseException {
1383 Token tok;
1384 tok = jj_consume_token(FALLBACK);
1385 if (!inMacro) {
1386 {if (true) throw new ParseException(getErrorStart(tok)
1387 + "\nCannot fall back "
1388 + " outside a macro.",
1389 tok.beginLine, tok.beginColumn);}
1390
1391 }
1392 FallbackInstruction result = new FallbackInstruction();
1393 result.setLocation(template, tok, tok);
1394 {if (true) return result;}
1395 throw new Error("Missing return statement in function");
1396 }
1397
1398
1399
1400
1401 final public BreakInstruction Break() throws ParseException {
1402 Token start;
1403 start = jj_consume_token(BREAK);
1404 if (loopNesting < 1 && switchNesting <1)
1405 {
1406 String msg = getErrorStart(start) + "\n"
1407 + start.image
1408 + " occurred outside a loop or a switch block.";
1409 {if (true) throw new ParseException(msg, start.beginLine, start.beginColumn);}
1410 }
1411 BreakInstruction result = new BreakInstruction();
1412 result.setLocation(template, start, start);
1413 {if (true) return result;}
1414 throw new Error("Missing return statement in function");
1415 }
1416
1417
1418
1419
1420
1421 final public ReturnInstruction Return() throws ParseException {
1422 Token start, end=null;
1423 Expression exp = null;
1424 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1425 case SIMPLE_RETURN:
1426 start = jj_consume_token(SIMPLE_RETURN);
1427 end = start;
1428 break;
1429 case RETURN:
1430 start = jj_consume_token(RETURN);
1431 exp = Expression();
1432 end = LooseDirectiveEnd();
1433 break;
1434 default:
1435 jj_la1[28] = jj_gen;
1436 jj_consume_token(-1);
1437 throw new ParseException();
1438 }
1439 if (inMacro) {
1440 if (exp != null) {
1441 String msg = getErrorStart(start)
1442 + "\nA macro cannot return a value";
1443 {if (true) throw new ParseException(msg, start.beginLine, start.beginColumn);}
1444 }
1445 }
1446 else if (inFunction) {
1447 if (exp == null) {
1448 String msg = getErrorStart(start)
1449 + "\nA function must return a value";
1450 {if (true) throw new ParseException(msg, start.beginLine, start.beginColumn);}
1451 }
1452 }
1453 else {
1454 if (exp == null) {
1455 String msg = getErrorStart(start)
1456 + "\nA return instruction can only occur inside a macro of function";
1457 {if (true) throw new ParseException(msg, start.beginLine, start.beginColumn);}
1458 }
1459 }
1460 ReturnInstruction result = new ReturnInstruction(exp);
1461 result.setLocation(template, start, end);
1462 {if (true) return result;}
1463 throw new Error("Missing return statement in function");
1464 }
1465
1466 final public StopInstruction Stop() throws ParseException {
1467 Token start = null;
1468 Expression exp = null;
1469 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1470 case HALT:
1471 start = jj_consume_token(HALT);
1472 break;
1473 case STOP:
1474 start = jj_consume_token(STOP);
1475 exp = Expression();
1476 LooseDirectiveEnd();
1477 break;
1478 default:
1479 jj_la1[29] = jj_gen;
1480 jj_consume_token(-1);
1481 throw new ParseException();
1482 }
1483 StopInstruction result = new StopInstruction(exp);
1484 result.setLocation(template, start, start);
1485 {if (true) return result;}
1486 throw new Error("Missing return statement in function");
1487 }
1488
1489 final public TemplateElement Nested() throws ParseException {
1490 Token t, end;
1491 ArrayList bodyParameters;
1492 BodyInstruction result = null;
1493 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1494 case SIMPLE_NESTED:
1495 t = jj_consume_token(SIMPLE_NESTED);
1496 result = new BodyInstruction(null);
1497 result.setLocation(template, t, t);
1498 break;
1499 case NESTED:
1500 t = jj_consume_token(NESTED);
1501 bodyParameters = PositionalArgs();
1502 end = LooseDirectiveEnd();
1503 result = new BodyInstruction(bodyParameters);
1504 result.setLocation(template, t, end);
1505 break;
1506 default:
1507 jj_la1[30] = jj_gen;
1508 jj_consume_token(-1);
1509 throw new ParseException();
1510 }
1511 if (!inMacro) {
1512 {if (true) throw new ParseException(getErrorStart(t)
1513 + "\nCannot use a "
1514 + t.image
1515 + " instruction outside a macro.",
1516 t.beginLine, t.beginColumn);}
1517 }
1518 {if (true) return result;}
1519 throw new Error("Missing return statement in function");
1520 }
1521
1522 final public TemplateElement Flush() throws ParseException {
1523 Token t;
1524 t = jj_consume_token(FLUSH);
1525 FlushInstruction result = new FlushInstruction();
1526 result.setLocation(template, t, t);
1527 {if (true) return result;}
1528 throw new Error("Missing return statement in function");
1529 }
1530
1531 final public TemplateElement Trim() throws ParseException {
1532 Token t;
1533 TrimInstruction result=null;
1534 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1535 case TRIM:
1536 t = jj_consume_token(TRIM);
1537 result = new TrimInstruction(true, true);
1538 break;
1539 case LTRIM:
1540 t = jj_consume_token(LTRIM);
1541 result = new TrimInstruction(true, false);
1542 break;
1543 case RTRIM:
1544 t = jj_consume_token(RTRIM);
1545 result = new TrimInstruction(false, true);
1546 break;
1547 case NOTRIM:
1548 t = jj_consume_token(NOTRIM);
1549 result = new TrimInstruction(false, false);
1550 break;
1551 default:
1552 jj_la1[31] = jj_gen;
1553 jj_consume_token(-1);
1554 throw new ParseException();
1555 }
1556 result.setLocation(template, t, t);
1557 {if (true) return result;}
1558 throw new Error("Missing return statement in function");
1559 }
1560
1561 final public TemplateElement Assign() throws ParseException {
1562 Token start, end;
1563 int scope;
1564 Token id=null;
1565 Expression nameExp, exp, nsExp=null;
1566 String varName;
1567 ArrayList assignments = new ArrayList();
1568 Assignment ass;
1569 TemplateElement block;
1570 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1571 case ASSIGN:
1572 start = jj_consume_token(ASSIGN);
1573 scope = Assignment.NAMESPACE;
1574 break;
1575 case GLOBALASSIGN:
1576 start = jj_consume_token(GLOBALASSIGN);
1577 scope = Assignment.GLOBAL;
1578 break;
1579 case LOCALASSIGN:
1580 start = jj_consume_token(LOCALASSIGN);
1581 scope = Assignment.LOCAL;
1582 scope = Assignment.LOCAL;
1583 if (!inMacro && !inFunction) {
1584 String msg = getErrorStart(start)
1585 + "\nLocal variable assigned outside a macro.";
1586 {if (true) throw new ParseException(msg, start.beginLine, start.beginColumn);}
1587 }
1588 break;
1589 default:
1590 jj_la1[32] = jj_gen;
1591 jj_consume_token(-1);
1592 throw new ParseException();
1593 }
1594 nameExp = IdentifierOrStringLiteral();
1595 varName = (nameExp instanceof StringLiteral) ? ((StringLiteral) nameExp).getAsString() : nameExp.toString();
1596 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1597 case EQUALS:
1598 jj_consume_token(EQUALS);
1599 exp = Expression();
1600 ass = new Assignment(varName, exp, scope);
1601 ass.setLocation(template, nameExp, exp);
1602 assignments.add(ass);
1603 label_9:
1604 while (true) {
1605 if (jj_2_11(2147483647)) {
1606 ;
1607 } else {
1608 break label_9;
1609 }
1610 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1611 case COMMA:
1612 jj_consume_token(COMMA);
1613 break;
1614 default:
1615 jj_la1[33] = jj_gen;
1616 ;
1617 }
1618 nameExp = IdentifierOrStringLiteral();
1619 varName = (nameExp instanceof StringLiteral) ? ((StringLiteral) nameExp).getAsString() : nameExp.toString();
1620 jj_consume_token(EQUALS);
1621 exp = Expression();
1622 ass = new Assignment(varName, exp, scope);
1623 ass.setLocation(template, nameExp, exp);
1624 assignments.add(ass);
1625 }
1626 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1627 case IN:
1628 id = jj_consume_token(IN);
1629 nsExp = Expression();
1630 if (scope != Assignment.NAMESPACE) {if (true) throw new ParseException(getErrorStart(id) + "\nCannot assign to namespace here.", id.beginLine, id.beginColumn);}
1631 break;
1632 default:
1633 jj_la1[34] = jj_gen;
1634 ;
1635 }
1636 end = LooseDirectiveEnd();
1637 AssignmentInstruction ai = new AssignmentInstruction(scope);
1638 for (int i = 0; i< assignments.size(); i++) {
1639 ai.addAssignment((Assignment) assignments.get(i));
1640 }
1641 ai.setNamespaceExp(nsExp);
1642 ai.setLocation(template, start, end);
1643 {if (true) return ai;}
1644 break;
1645 case IN:
1646 case DIRECTIVE_END:
1647 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1648 case IN:
1649 id = jj_consume_token(IN);
1650 nsExp = Expression();
1651 if (scope != Assignment.NAMESPACE) {if (true) throw new ParseException(getErrorStart(id) + "\nCannot assign to namespace here.", id.beginLine, id.beginColumn);}
1652 break;
1653 default:
1654 jj_la1[35] = jj_gen;
1655 ;
1656 }
1657 jj_consume_token(DIRECTIVE_END);
1658 block = OptionalBlock();
1659 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1660 case END_LOCAL:
1661 end = jj_consume_token(END_LOCAL);
1662 if (scope != Assignment.LOCAL) {if (true) throw new ParseException(getErrorStart(end) + "\nMismatched assignment tags.", end.beginLine, end.beginColumn);}
1663 break;
1664 case END_ASSIGN:
1665 end = jj_consume_token(END_ASSIGN);
1666 if (scope != Assignment.NAMESPACE) {if (true) throw new ParseException(getErrorStart(end) + "\nMismatched assignment tags.", end.beginLine, end.beginColumn);}
1667 break;
1668 case END_GLOBAL:
1669 end = jj_consume_token(END_GLOBAL);
1670 if (scope != Assignment.GLOBAL) {if (true) throw new ParseException(getErrorStart(end) + "\nMismatched assignment tags", end.beginLine, end.beginColumn);}
1671 break;
1672 default:
1673 jj_la1[36] = jj_gen;
1674 jj_consume_token(-1);
1675 throw new ParseException();
1676 }
1677 BlockAssignment ba = new BlockAssignment(block, varName, scope, nsExp);
1678 ba.setLocation(template, start, end);
1679 {if (true) return ba;}
1680 break;
1681 default:
1682 jj_la1[37] = jj_gen;
1683 jj_consume_token(-1);
1684 throw new ParseException();
1685 }
1686 throw new Error("Missing return statement in function");
1687 }
1688
1689 final public Include Include() throws ParseException {
1690 Expression nameExp;
1691 Token att, start, end;
1692 Expression exp, parseExp = null, encodingExp = null;
1693 start = jj_consume_token(_INCLUDE);
1694 nameExp = Expression();
1695 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1696 case SEMICOLON:
1697 jj_consume_token(SEMICOLON);
1698 break;
1699 default:
1700 jj_la1[38] = jj_gen;
1701 ;
1702 }
1703 label_10:
1704 while (true) {
1705 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1706 case ID:
1707 ;
1708 break;
1709 default:
1710 jj_la1[39] = jj_gen;
1711 break label_10;
1712 }
1713 att = jj_consume_token(ID);
1714 jj_consume_token(EQUALS);
1715 exp = Expression();
1716 String attString = att.image;
1717 if (attString.equalsIgnoreCase("parse")) {
1718 parseExp = exp;
1719 }
1720 else if (attString.equalsIgnoreCase("encoding")) {
1721 encodingExp = exp;
1722 }
1723 else {
1724 String msg = getErrorStart(att)
1725 + "\nexpecting parse= or encoding= to be specified.";
1726 {if (true) throw new ParseException(msg, att.beginLine, att.beginColumn);}
1727 }
1728 }
1729 end = LooseDirectiveEnd();
1730 Include result = new Include(template, nameExp, encodingExp, parseExp);
1731 result.setLocation(template, start, end);
1732 {if (true) return result;}
1733 throw new Error("Missing return statement in function");
1734 }
1735
1736 final public LibraryLoad Import() throws ParseException {
1737 Token start, end, ns;
1738 Expression nameExp;
1739 start = jj_consume_token(IMPORT);
1740 nameExp = Expression();
1741 jj_consume_token(AS);
1742 ns = jj_consume_token(ID);
1743 end = LooseDirectiveEnd();
1744 LibraryLoad result = new LibraryLoad(template, nameExp, ns.image);
1745 result.setLocation(template, start, end);
1746 template.addImport(result);
1747 {if (true) return result;}
1748 throw new Error("Missing return statement in function");
1749 }
1750
1751 final public Macro Macro() throws ParseException {
1752 Token arg, start, end;
1753 Expression nameExp;
1754 String name;
1755 ArrayList argNames = new ArrayList();
1756 HashMap args = new HashMap();
1757 ArrayList defNames = new ArrayList();
1758 Expression defValue=null;
1759 TemplateElement block;
1760 boolean isFunction = false, hasDefaults=false;
1761 boolean isCatchAll = false;
1762 String catchAll = null;
1763 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1764 case MACRO:
1765 start = jj_consume_token(MACRO);
1766 break;
1767 case FUNCTION:
1768 start = jj_consume_token(FUNCTION);
1769 isFunction = true;
1770 break;
1771 default:
1772 jj_la1[40] = jj_gen;
1773 jj_consume_token(-1);
1774 throw new ParseException();
1775 }
1776 if (inMacro || inFunction) {
1777 {if (true) throw new ParseException(getErrorStart(start)
1778 + "\nMacros cannot be nested.", start.beginLine, start.endLine);}
1779 }
1780 if (isFunction) inFunction = true; else inMacro = true;
1781 nameExp = IdentifierOrStringLiteral();
1782 name = (nameExp instanceof StringLiteral) ? ((StringLiteral) nameExp).getAsString() : nameExp.toString();
1783 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1784 case OPEN_PAREN:
1785 jj_consume_token(OPEN_PAREN);
1786 break;
1787 default:
1788 jj_la1[41] = jj_gen;
1789 ;
1790 }
1791 label_11:
1792 while (true) {
1793 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1794 case ID:
1795 ;
1796 break;
1797 default:
1798 jj_la1[42] = jj_gen;
1799 break label_11;
1800 }
1801 arg = jj_consume_token(ID);
1802 defValue = null;
1803 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1804 case ELLIPSIS:
1805 jj_consume_token(ELLIPSIS);
1806 isCatchAll = true;
1807 break;
1808 default:
1809 jj_la1[43] = jj_gen;
1810 ;
1811 }
1812 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1813 case EQUALS:
1814 jj_consume_token(EQUALS);
1815 defValue = Expression();
1816 defNames.add(arg.image);
1817 hasDefaults = true;
1818 break;
1819 default:
1820 jj_la1[44] = jj_gen;
1821 ;
1822 }
1823 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1824 case COMMA:
1825 jj_consume_token(COMMA);
1826 break;
1827 default:
1828 jj_la1[45] = jj_gen;
1829 ;
1830 }
1831 if (catchAll != null) {
1832 {if (true) throw new ParseException(getErrorStart(arg)
1833 + "\nThere may only be one \"catch-all\" parameter in a macro declaration, "
1834 + "and it must be the last parameter.", arg.beginLine, arg.endLine);}
1835 }
1836 if (isCatchAll) {
1837 if (defValue != null) {
1838 {if (true) throw new ParseException(getErrorStart(arg)
1839 + "\n\"Catch-all\" macro parameter may not have a default value.",
1840 arg.beginLine, arg.endLine);}
1841 }
1842 catchAll = arg.image;
1843 } else {
1844 argNames.add(arg.image);
1845 if (hasDefaults && defValue == null) {
1846 {if (true) throw new ParseException(getErrorStart(arg)
1847 + "\nIn a macro declaration, parameters without a default value "
1848 + "must all occur before the parameters with default values.",
1849 arg.beginLine, arg.endLine);}
1850 }
1851 args.put(arg.image, defValue);
1852 }
1853 }
1854 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1855 case CLOSE_PAREN:
1856 jj_consume_token(CLOSE_PAREN);
1857 break;
1858 default:
1859 jj_la1[46] = jj_gen;
1860 ;
1861 }
1862 jj_consume_token(DIRECTIVE_END);
1863 block = OptionalBlock();
1864 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1865 case END_MACRO:
1866 end = jj_consume_token(END_MACRO);
1867 if(isFunction) {if (true) throw new ParseException(getErrorStart(start) + "\nExpected function end tag here.", start.beginLine, start.endLine);}
1868 break;
1869 case END_FUNCTION:
1870 end = jj_consume_token(END_FUNCTION);
1871 if(!isFunction) {if (true) throw new ParseException(getErrorStart(start) + "\nExpected macro end tag here.", start.beginLine, start.endLine);}
1872 break;
1873 default:
1874 jj_la1[47] = jj_gen;
1875 jj_consume_token(-1);
1876 throw new ParseException();
1877 }
1878 inMacro = inFunction = false;
1879 Macro result = new Macro(name, argNames, args, block);
1880 result.setCatchAll(catchAll);
1881 result.isFunction = isFunction;
1882 result.setLocation(template, start, end);
1883 template.addMacro(result);
1884 {if (true) return result;}
1885 throw new Error("Missing return statement in function");
1886 }
1887
1888 final public CompressedBlock Compress() throws ParseException {
1889 TemplateElement block;
1890 Token start, end;
1891 start = jj_consume_token(COMPRESS);
1892 block = OptionalBlock();
1893 end = jj_consume_token(END_COMPRESS);
1894 CompressedBlock cb = new CompressedBlock(block);
1895 cb.setLocation(template, start, end);
1896 {if (true) return cb;}
1897 throw new Error("Missing return statement in function");
1898 }
1899
1900 final public TemplateElement UnifiedMacroTransform() throws ParseException {
1901 Token start=null, end, t;
1902 HashMap namedArgs = null;
1903 ArrayList positionalArgs = null, bodyParameters = null;
1904 String directiveName = null;
1905 TemplateElement nestedBlock = null;
1906 Expression exp;
1907 start = jj_consume_token(UNIFIED_CALL);
1908 exp = Expression();
1909 if (exp instanceof Identifier || (exp instanceof Dot && ((Dot) exp).onlyHasIdentifiers())) {
1910 directiveName = exp.getCanonicalForm();
1911 }
1912 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1913 case TERMINATING_WHITESPACE:
1914 jj_consume_token(TERMINATING_WHITESPACE);
1915 break;
1916 default:
1917 jj_la1[48] = jj_gen;
1918 ;
1919 }
1920 if (jj_2_12(2147483647)) {
1921 namedArgs = NamedArgs();
1922 } else {
1923 positionalArgs = PositionalArgs();
1924 }
1925 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1926 case SEMICOLON:
1927 jj_consume_token(SEMICOLON);
1928 bodyParameters = new ArrayList();
1929 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1930 case ID:
1931 case TERMINATING_WHITESPACE:
1932 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1933 case TERMINATING_WHITESPACE:
1934 jj_consume_token(TERMINATING_WHITESPACE);
1935 break;
1936 default:
1937 jj_la1[49] = jj_gen;
1938 ;
1939 }
1940 t = jj_consume_token(ID);
1941 bodyParameters.add(t.image);
1942 label_12:
1943 while (true) {
1944 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1945 case COMMA:
1946 case TERMINATING_WHITESPACE:
1947 ;
1948 break;
1949 default:
1950 jj_la1[50] = jj_gen;
1951 break label_12;
1952 }
1953 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1954 case TERMINATING_WHITESPACE:
1955 jj_consume_token(TERMINATING_WHITESPACE);
1956 break;
1957 default:
1958 jj_la1[51] = jj_gen;
1959 ;
1960 }
1961 jj_consume_token(COMMA);
1962 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1963 case TERMINATING_WHITESPACE:
1964 jj_consume_token(TERMINATING_WHITESPACE);
1965 break;
1966 default:
1967 jj_la1[52] = jj_gen;
1968 ;
1969 }
1970 t = jj_consume_token(ID);
1971 bodyParameters.add(t.image);
1972 }
1973 break;
1974 default:
1975 jj_la1[53] = jj_gen;
1976 ;
1977 }
1978 break;
1979 default:
1980 jj_la1[54] = jj_gen;
1981 ;
1982 }
1983 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
1984 case EMPTY_DIRECTIVE_END:
1985 end = jj_consume_token(EMPTY_DIRECTIVE_END);
1986 break;
1987 case DIRECTIVE_END:
1988 jj_consume_token(DIRECTIVE_END);
1989 nestedBlock = OptionalBlock();
1990 end = jj_consume_token(UNIFIED_CALL_END);
1991 String s = end.image.substring(3);
1992 s = s.substring(0, s.length() -1).trim();
1993 if (s.length() >0 && !s.equals(directiveName)) {
1994 String msg = getErrorStart(end);
1995 if (directiveName == null) {
1996 {if (true) throw new ParseException(msg + "\nExpecting </@>", end.beginLine, end.beginColumn);}
1997 }
1998 else {
1999 {if (true) throw new ParseException(msg + "\nExpecting </@> or </@" + directiveName + ">", end.beginLine, end.beginColumn);}
2000 }
2001 }
2002 break;
2003 default:
2004 jj_la1[55] = jj_gen;
2005 jj_consume_token(-1);
2006 throw new ParseException();
2007 }
2008 TemplateElement result = (positionalArgs != null) ? new UnifiedCall(exp, positionalArgs, nestedBlock, bodyParameters)
2009 : new UnifiedCall(exp, namedArgs, nestedBlock, bodyParameters);
2010 result.setLocation(template, start, end);
2011 {if (true) return result;}
2012 throw new Error("Missing return statement in function");
2013 }
2014
2015 final public TemplateElement Call() throws ParseException {
2016 Token start, end, id;
2017 HashMap namedArgs = null;
2018 ArrayList positionalArgs = null;
2019 String macroName= null;
2020 start = jj_consume_token(CALL);
2021 id = jj_consume_token(ID);
2022 macroName = id.image;
2023 if (jj_2_14(2147483647)) {
2024 namedArgs = NamedArgs();
2025 } else {
2026 if (jj_2_13(2147483647)) {
2027 jj_consume_token(OPEN_PAREN);
2028 } else {
2029 ;
2030 }
2031 positionalArgs = PositionalArgs();
2032 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2033 case CLOSE_PAREN:
2034 jj_consume_token(CLOSE_PAREN);
2035 break;
2036 default:
2037 jj_la1[56] = jj_gen;
2038 ;
2039 }
2040 }
2041 end = LooseDirectiveEnd();
2042 UnifiedCall result = null;
2043 if (positionalArgs != null) {
2044 result = new UnifiedCall(new Identifier(macroName), positionalArgs, null, null);
2045 }
2046 else {
2047 result = new UnifiedCall(new Identifier(macroName), namedArgs, null, null);
2048 }
2049 result.legacySyntax = true;
2050 result.setLocation(template, start, end);
2051 {if (true) return result;}
2052 throw new Error("Missing return statement in function");
2053 }
2054
2055 final public HashMap NamedArgs() throws ParseException {
2056 HashMap result = new HashMap();
2057 Token t;
2058 Expression exp;
2059 label_13:
2060 while (true) {
2061 t = jj_consume_token(ID);
2062 jj_consume_token(EQUALS);
2063 token_source.SwitchTo(token_source.NAMED_PARAMETER_EXPRESSION);
2064 token_source.inInvocation = true;
2065 exp = Expression();
2066 result.put(t.image, exp);
2067 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2068 case ID:
2069 ;
2070 break;
2071 default:
2072 jj_la1[57] = jj_gen;
2073 break label_13;
2074 }
2075 }
2076 token_source.inInvocation = false;
2077 {if (true) return result;}
2078 throw new Error("Missing return statement in function");
2079 }
2080
2081 final public ArrayList PositionalArgs() throws ParseException {
2082 ArrayList result = new ArrayList();
2083 Expression arg;
2084 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2085 case STRING_LITERAL:
2086 case RAW_STRING:
2087 case FALSE:
2088 case TRUE:
2089 case INTEGER:
2090 case DECIMAL:
2091 case DOT:
2092 case PLUS:
2093 case MINUS:
2094 case EXCLAM:
2095 case OPEN_BRACKET:
2096 case OPEN_PAREN:
2097 case OPEN_BRACE:
2098 case ID:
2099 arg = Expression();
2100 result.add(arg);
2101 label_14:
2102 while (true) {
2103 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2104 case STRING_LITERAL:
2105 case RAW_STRING:
2106 case FALSE:
2107 case TRUE:
2108 case INTEGER:
2109 case DECIMAL:
2110 case DOT:
2111 case PLUS:
2112 case MINUS:
2113 case EXCLAM:
2114 case COMMA:
2115 case OPEN_BRACKET:
2116 case OPEN_PAREN:
2117 case OPEN_BRACE:
2118 case ID:
2119 ;
2120 break;
2121 default:
2122 jj_la1[58] = jj_gen;
2123 break label_14;
2124 }
2125 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2126 case COMMA:
2127 jj_consume_token(COMMA);
2128 break;
2129 default:
2130 jj_la1[59] = jj_gen;
2131 ;
2132 }
2133 arg = Expression();
2134 result.add(arg);
2135 }
2136 break;
2137 default:
2138 jj_la1[60] = jj_gen;
2139 ;
2140 }
2141 {if (true) return result;}
2142 throw new Error("Missing return statement in function");
2143 }
2144
2145 final public Comment Comment() throws ParseException {
2146 Token start, end;
2147 StringBuffer buf = new StringBuffer();
2148 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2149 case COMMENT:
2150 start = jj_consume_token(COMMENT);
2151 break;
2152 case TERSE_COMMENT:
2153 start = jj_consume_token(TERSE_COMMENT);
2154 break;
2155 default:
2156 jj_la1[61] = jj_gen;
2157 jj_consume_token(-1);
2158 throw new ParseException();
2159 }
2160 end = UnparsedContent(buf);
2161 Comment result = new Comment(buf.toString());
2162 result.setLocation(template, start, end);
2163 {if (true) return result;}
2164 throw new Error("Missing return statement in function");
2165 }
2166
2167 final public TextBlock NoParse() throws ParseException {
2168 Token start, end;
2169 StringBuffer buf = new StringBuffer();
2170 start = jj_consume_token(NOPARSE);
2171 end = UnparsedContent(buf);
2172 TextBlock result = new TextBlock(buf.toString(), true);
2173 result.setLocation(template, start, end);
2174 {if (true) return result;}
2175 throw new Error("Missing return statement in function");
2176 }
2177
2178 final public TransformBlock Transform() throws ParseException {
2179 Token start, end, argName;
2180 Expression exp, argExp;
2181 TemplateElement content = null;
2182 HashMap args = null;
2183 start = jj_consume_token(TRANSFORM);
2184 exp = Expression();
2185 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2186 case SEMICOLON:
2187 jj_consume_token(SEMICOLON);
2188 break;
2189 default:
2190 jj_la1[62] = jj_gen;
2191 ;
2192 }
2193 label_15:
2194 while (true) {
2195 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2196 case ID:
2197 ;
2198 break;
2199 default:
2200 jj_la1[63] = jj_gen;
2201 break label_15;
2202 }
2203 argName = jj_consume_token(ID);
2204 jj_consume_token(EQUALS);
2205 argExp = Expression();
2206 if (args == null) args = new HashMap();
2207 args.put(argName.image, argExp);
2208 }
2209 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2210 case EMPTY_DIRECTIVE_END:
2211 end = jj_consume_token(EMPTY_DIRECTIVE_END);
2212 break;
2213 case DIRECTIVE_END:
2214 jj_consume_token(DIRECTIVE_END);
2215 content = OptionalBlock();
2216 end = jj_consume_token(END_TRANSFORM);
2217 break;
2218 default:
2219 jj_la1[64] = jj_gen;
2220 jj_consume_token(-1);
2221 throw new ParseException();
2222 }
2223 TransformBlock result = new TransformBlock(exp, args, content);
2224 result.setLocation(template, start, end);
2225 {if (true) return result;}
2226 throw new Error("Missing return statement in function");
2227 }
2228
2229 final public SwitchBlock Switch() throws ParseException {
2230 SwitchBlock switchBlock;
2231 Case caseIns;
2232 Expression switchExp;
2233 Token start, end;
2234 boolean defaultFound = false;
2235 start = jj_consume_token(SWITCH);
2236 switchExp = Expression();
2237 jj_consume_token(DIRECTIVE_END);
2238 ++switchNesting;
2239 switchBlock = new SwitchBlock(switchExp);
2240 label_16:
2241 while (true) {
2242 if (jj_2_15(2)) {
2243 ;
2244 } else {
2245 break label_16;
2246 }
2247 caseIns = Case();
2248 if (caseIns.isDefault) {
2249 if (defaultFound) {
2250 String msg = getErrorStart(start)
2251 + "\nYou can only have one default case in a switch statement";
2252 {if (true) throw new ParseException(msg, start.beginLine, start.beginColumn);}
2253 }
2254 defaultFound = true;
2255 }
2256 switchBlock.addCase(caseIns);
2257 }
2258 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2259 case WHITESPACE:
2260 jj_consume_token(WHITESPACE);
2261 break;
2262 default:
2263 jj_la1[65] = jj_gen;
2264 ;
2265 }
2266 end = jj_consume_token(END_SWITCH);
2267 --switchNesting;
2268 switchBlock.setLocation(template, start, end);
2269 {if (true) return switchBlock;}
2270 throw new Error("Missing return statement in function");
2271 }
2272
2273 final public Case Case() throws ParseException {
2274 Expression exp = null;
2275 TemplateElement block;
2276 boolean isDefault = false;
2277 Token start;
2278 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2279 case WHITESPACE:
2280 jj_consume_token(WHITESPACE);
2281 break;
2282 default:
2283 jj_la1[66] = jj_gen;
2284 ;
2285 }
2286 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2287 case CASE:
2288 start = jj_consume_token(CASE);
2289 exp = Expression();
2290 jj_consume_token(DIRECTIVE_END);
2291 break;
2292 case DEFAUL:
2293 start = jj_consume_token(DEFAUL);
2294 isDefault = true;
2295 break;
2296 default:
2297 jj_la1[67] = jj_gen;
2298 jj_consume_token(-1);
2299 throw new ParseException();
2300 }
2301 block = OptionalBlock();
2302 Case result = new Case(exp, block, isDefault);
2303 result.setLocation(template, start, block);
2304 {if (true) return result;}
2305 throw new Error("Missing return statement in function");
2306 }
2307
2308 final public EscapeBlock Escape() throws ParseException {
2309 Token variable, start, end;
2310 Expression escapeExpr;
2311 TemplateElement content;
2312 start = jj_consume_token(ESCAPE);
2313 variable = jj_consume_token(ID);
2314 jj_consume_token(AS);
2315 escapeExpr = Expression();
2316 jj_consume_token(DIRECTIVE_END);
2317 EscapeBlock result = new EscapeBlock(variable.image, escapeExpr, escapedExpression(escapeExpr));
2318 escapes.addFirst(result);
2319 content = OptionalBlock();
2320 result.setContent(content);
2321 escapes.removeFirst();
2322 end = jj_consume_token(END_ESCAPE);
2323 result.setLocation(template, start, end);
2324 {if (true) return result;}
2325 throw new Error("Missing return statement in function");
2326 }
2327
2328 final public NoEscapeBlock NoEscape() throws ParseException {
2329 Token start, end;
2330 TemplateElement content;
2331 start = jj_consume_token(NOESCAPE);
2332 if(escapes.isEmpty()) {
2333 String msg = getErrorStart(start)
2334 + "\nnoescape with no matching escape encountered.";
2335 {if (true) throw new ParseException(msg, start.beginLine, start.beginColumn);}
2336 }
2337 Object escape = escapes.removeFirst();
2338 content = OptionalBlock();
2339 end = jj_consume_token(END_NOESCAPE);
2340 escapes.addFirst(escape);
2341 NoEscapeBlock result = new NoEscapeBlock(content);
2342 result.setLocation(template, start, end);
2343 {if (true) return result;}
2344 throw new Error("Missing return statement in function");
2345 }
2346
2347
2348
2349
2350 final public Token LooseDirectiveEnd() throws ParseException {
2351 Token t;
2352 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2353 case DIRECTIVE_END:
2354 t = jj_consume_token(DIRECTIVE_END);
2355 break;
2356 case EMPTY_DIRECTIVE_END:
2357 t = jj_consume_token(EMPTY_DIRECTIVE_END);
2358 break;
2359 default:
2360 jj_la1[68] = jj_gen;
2361 jj_consume_token(-1);
2362 throw new ParseException();
2363 }
2364 {if (true) return t;}
2365 throw new Error("Missing return statement in function");
2366 }
2367
2368 final public PropertySetting Setting() throws ParseException {
2369 Token start, end, key;
2370 Expression value;
2371 start = jj_consume_token(SETTING);
2372 key = jj_consume_token(ID);
2373 jj_consume_token(EQUALS);
2374 value = Expression();
2375 end = LooseDirectiveEnd();
2376 PropertySetting result = new PropertySetting(key.image, value);
2377 result.setLocation(template, start, end);
2378 {if (true) return result;}
2379 throw new Error("Missing return statement in function");
2380 }
2381
2382
2383
2384
2385 final public TemplateElement FreemarkerDirective() throws ParseException {
2386 TemplateElement tp;
2387 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2388 case IF:
2389 tp = If();
2390 break;
2391 case LIST:
2392 tp = List();
2393 break;
2394 case FOREACH:
2395 tp = ForEach();
2396 break;
2397 case ASSIGN:
2398 case GLOBALASSIGN:
2399 case LOCALASSIGN:
2400 tp = Assign();
2401 break;
2402 case _INCLUDE:
2403 tp = Include();
2404 break;
2405 case IMPORT:
2406 tp = Import();
2407 break;
2408 case FUNCTION:
2409 case MACRO:
2410 tp = Macro();
2411 break;
2412 case COMPRESS:
2413 tp = Compress();
2414 break;
2415 case UNIFIED_CALL:
2416 tp = UnifiedMacroTransform();
2417 break;
2418 case CALL:
2419 tp = Call();
2420 break;
2421 case COMMENT:
2422 case TERSE_COMMENT:
2423 tp = Comment();
2424 break;
2425 case NOPARSE:
2426 tp = NoParse();
2427 break;
2428 case TRANSFORM:
2429 tp = Transform();
2430 break;
2431 case SWITCH:
2432 tp = Switch();
2433 break;
2434 case SETTING:
2435 tp = Setting();
2436 break;
2437 case BREAK:
2438 tp = Break();
2439 break;
2440 case RETURN:
2441 case SIMPLE_RETURN:
2442 tp = Return();
2443 break;
2444 case STOP:
2445 case HALT:
2446 tp = Stop();
2447 break;
2448 case FLUSH:
2449 tp = Flush();
2450 break;
2451 case TRIM:
2452 case LTRIM:
2453 case RTRIM:
2454 case NOTRIM:
2455 tp = Trim();
2456 break;
2457 case SIMPLE_NESTED:
2458 case NESTED:
2459 tp = Nested();
2460 break;
2461 case ESCAPE:
2462 tp = Escape();
2463 break;
2464 case NOESCAPE:
2465 tp = NoEscape();
2466 break;
2467 case VISIT:
2468 tp = Visit();
2469 break;
2470 case SIMPLE_RECURSE:
2471 case RECURSE:
2472 tp = Recurse();
2473 break;
2474 case FALLBACK:
2475 tp = FallBack();
2476 break;
2477 case ATTEMPT:
2478 tp = Attempt();
2479 break;
2480 default:
2481 jj_la1[69] = jj_gen;
2482 jj_consume_token(-1);
2483 throw new ParseException();
2484 }
2485 {if (true) return tp;}
2486 throw new Error("Missing return statement in function");
2487 }
2488
2489
2490
2491
2492
2493
2494 final public TextBlock PCData() throws ParseException {
2495 StringBuffer buf = new StringBuffer();
2496 Token t=null, start=null, prevToken = null;
2497 label_17:
2498 while (true) {
2499 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2500 case WHITESPACE:
2501 prevToken = t;
2502 t = jj_consume_token(WHITESPACE);
2503 break;
2504 case PRINTABLE_CHARS:
2505 t = jj_consume_token(PRINTABLE_CHARS);
2506 break;
2507 case FALSE_ALERT:
2508 t = jj_consume_token(FALSE_ALERT);
2509 break;
2510 default:
2511 jj_la1[70] = jj_gen;
2512 jj_consume_token(-1);
2513 throw new ParseException();
2514 }
2515 buf.append(t.image);
2516 if (start == null) start = t;
2517 {if (prevToken != null) prevToken.next = null;}
2518 if (jj_2_16(2147483647)) {
2519 ;
2520 } else {
2521 break label_17;
2522 }
2523 }
2524 if (stripText && contentNesting == 1)
2525 {if (true) return TextBlock.EMPTY_BLOCK;}
2526
2527 TextBlock result = new TextBlock(buf.toString(), false);
2528 result.setLocation(template, start, t);
2529 {if (true) return result;}
2530 throw new Error("Missing return statement in function");
2531 }
2532
2533
2534
2535
2536
2537
2538
2539 final public Token UnparsedContent(StringBuffer buf) throws ParseException {
2540 Token t;
2541 label_18:
2542 while (true) {
2543 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2544 case KEEP_GOING:
2545 t = jj_consume_token(KEEP_GOING);
2546 break;
2547 case MAYBE_END:
2548 t = jj_consume_token(MAYBE_END);
2549 break;
2550 case TERSE_COMMENT_END:
2551 t = jj_consume_token(TERSE_COMMENT_END);
2552 break;
2553 case LONE_LESS_THAN_OR_DASH:
2554 t = jj_consume_token(LONE_LESS_THAN_OR_DASH);
2555 break;
2556 default:
2557 jj_la1[71] = jj_gen;
2558 jj_consume_token(-1);
2559 throw new ParseException();
2560 }
2561 buf.append(t.image);
2562 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2563 case TERSE_COMMENT_END:
2564 case MAYBE_END:
2565 case KEEP_GOING:
2566 case LONE_LESS_THAN_OR_DASH:
2567 ;
2568 break;
2569 default:
2570 jj_la1[72] = jj_gen;
2571 break label_18;
2572 }
2573 }
2574 buf.setLength(buf.length() - t.image.length());
2575 {if (true) return t;}
2576 throw new Error("Missing return statement in function");
2577 }
2578
2579 final public TemplateElement Content() throws ParseException {
2580 MixedContent nodes = new MixedContent();
2581 TemplateElement elem, begin=null;
2582 contentNesting++;
2583 label_19:
2584 while (true) {
2585 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2586 case WHITESPACE:
2587 case PRINTABLE_CHARS:
2588 case FALSE_ALERT:
2589 elem = PCData();
2590 break;
2591 case OUTPUT_ESCAPE:
2592 elem = StringOutput();
2593 break;
2594 case NUMERICAL_ESCAPE:
2595 elem = NumericalOutput();
2596 break;
2597 case ATTEMPT:
2598 case IF:
2599 case LIST:
2600 case FOREACH:
2601 case SWITCH:
2602 case ASSIGN:
2603 case GLOBALASSIGN:
2604 case LOCALASSIGN:
2605 case _INCLUDE:
2606 case IMPORT:
2607 case FUNCTION:
2608 case MACRO:
2609 case TRANSFORM:
2610 case VISIT:
2611 case STOP:
2612 case RETURN:
2613 case CALL:
2614 case SETTING:
2615 case COMPRESS:
2616 case COMMENT:
2617 case TERSE_COMMENT:
2618 case NOPARSE:
2619 case BREAK:
2620 case SIMPLE_RETURN:
2621 case HALT:
2622 case FLUSH:
2623 case TRIM:
2624 case LTRIM:
2625 case RTRIM:
2626 case NOTRIM:
2627 case SIMPLE_NESTED:
2628 case NESTED:
2629 case SIMPLE_RECURSE:
2630 case RECURSE:
2631 case FALLBACK:
2632 case ESCAPE:
2633 case NOESCAPE:
2634 case UNIFIED_CALL:
2635 elem = FreemarkerDirective();
2636 break;
2637 default:
2638 jj_la1[73] = jj_gen;
2639 jj_consume_token(-1);
2640 throw new ParseException();
2641 }
2642 if (begin == null) {
2643 begin = elem;
2644 }
2645 nodes.addElement(elem);
2646 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2647 case ATTEMPT:
2648 case IF:
2649 case LIST:
2650 case FOREACH:
2651 case SWITCH:
2652 case ASSIGN:
2653 case GLOBALASSIGN:
2654 case LOCALASSIGN:
2655 case _INCLUDE:
2656 case IMPORT:
2657 case FUNCTION:
2658 case MACRO:
2659 case TRANSFORM:
2660 case VISIT:
2661 case STOP:
2662 case RETURN:
2663 case CALL:
2664 case SETTING:
2665 case COMPRESS:
2666 case COMMENT:
2667 case TERSE_COMMENT:
2668 case NOPARSE:
2669 case BREAK:
2670 case SIMPLE_RETURN:
2671 case HALT:
2672 case FLUSH:
2673 case TRIM:
2674 case LTRIM:
2675 case RTRIM:
2676 case NOTRIM:
2677 case SIMPLE_NESTED:
2678 case NESTED:
2679 case SIMPLE_RECURSE:
2680 case RECURSE:
2681 case FALLBACK:
2682 case ESCAPE:
2683 case NOESCAPE:
2684 case UNIFIED_CALL:
2685 case WHITESPACE:
2686 case PRINTABLE_CHARS:
2687 case FALSE_ALERT:
2688 case OUTPUT_ESCAPE:
2689 case NUMERICAL_ESCAPE:
2690 ;
2691 break;
2692 default:
2693 jj_la1[74] = jj_gen;
2694 break label_19;
2695 }
2696 }
2697 contentNesting--;
2698 nodes.setLocation(template, begin, elem);
2699 {if (true) return nodes;}
2700 throw new Error("Missing return statement in function");
2701 }
2702
2703
2704
2705
2706
2707 final public TemplateElement FreeMarkerText() throws ParseException {
2708 MixedContent nodes = new MixedContent();
2709 TemplateElement elem, begin = null;
2710 label_20:
2711 while (true) {
2712 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2713 case WHITESPACE:
2714 case PRINTABLE_CHARS:
2715 case FALSE_ALERT:
2716 elem = PCData();
2717 break;
2718 case OUTPUT_ESCAPE:
2719 elem = StringOutput();
2720 break;
2721 case NUMERICAL_ESCAPE:
2722 elem = NumericalOutput();
2723 break;
2724 default:
2725 jj_la1[75] = jj_gen;
2726 jj_consume_token(-1);
2727 throw new ParseException();
2728 }
2729 if (begin == null) {
2730 begin = elem;
2731 }
2732 nodes.addElement(elem);
2733 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2734 case WHITESPACE:
2735 case PRINTABLE_CHARS:
2736 case FALSE_ALERT:
2737 case OUTPUT_ESCAPE:
2738 case NUMERICAL_ESCAPE:
2739 ;
2740 break;
2741 default:
2742 jj_la1[76] = jj_gen;
2743 break label_20;
2744 }
2745 }
2746 nodes.setLocation(template, begin, elem);
2747 {if (true) return nodes;}
2748 throw new Error("Missing return statement in function");
2749 }
2750
2751
2752
2753
2754
2755
2756 final public TemplateElement OptionalBlock() throws ParseException {
2757 TemplateElement tp = TextBlock.EMPTY_BLOCK;
2758 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2759 case ATTEMPT:
2760 case IF:
2761 case LIST:
2762 case FOREACH:
2763 case SWITCH:
2764 case ASSIGN:
2765 case GLOBALASSIGN:
2766 case LOCALASSIGN:
2767 case _INCLUDE:
2768 case IMPORT:
2769 case FUNCTION:
2770 case MACRO:
2771 case TRANSFORM:
2772 case VISIT:
2773 case STOP:
2774 case RETURN:
2775 case CALL:
2776 case SETTING:
2777 case COMPRESS:
2778 case COMMENT:
2779 case TERSE_COMMENT:
2780 case NOPARSE:
2781 case BREAK:
2782 case SIMPLE_RETURN:
2783 case HALT:
2784 case FLUSH:
2785 case TRIM:
2786 case LTRIM:
2787 case RTRIM:
2788 case NOTRIM:
2789 case SIMPLE_NESTED:
2790 case NESTED:
2791 case SIMPLE_RECURSE:
2792 case RECURSE:
2793 case FALLBACK:
2794 case ESCAPE:
2795 case NOESCAPE:
2796 case UNIFIED_CALL:
2797 case WHITESPACE:
2798 case PRINTABLE_CHARS:
2799 case FALSE_ALERT:
2800 case OUTPUT_ESCAPE:
2801 case NUMERICAL_ESCAPE:
2802
2803 tp = Content();
2804 break;
2805 default:
2806 jj_la1[77] = jj_gen;
2807 ;
2808 }
2809 {if (true) return tp;}
2810 throw new Error("Missing return statement in function");
2811 }
2812
2813 final public void HeaderElement() throws ParseException {
2814 Token key;
2815 Expression exp = null;
2816 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2817 case WHITESPACE:
2818 jj_consume_token(WHITESPACE);
2819 break;
2820 default:
2821 jj_la1[78] = jj_gen;
2822 ;
2823 }
2824 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2825 case TRIVIAL_FTL_HEADER:
2826 jj_consume_token(TRIVIAL_FTL_HEADER);
2827 break;
2828 case FTL_HEADER:
2829 jj_consume_token(FTL_HEADER);
2830 label_21:
2831 while (true) {
2832 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2833 case ID:
2834 ;
2835 break;
2836 default:
2837 jj_la1[79] = jj_gen;
2838 break label_21;
2839 }
2840 key = jj_consume_token(ID);
2841 jj_consume_token(EQUALS);
2842 exp = Expression();
2843 String ks = key.image;
2844 TemplateModel value = null;
2845 try {
2846 value = exp.getAsTemplateModel(null);
2847 } catch (Exception e) {
2848 {if (true) throw new ParseException("Could not evaluate expression: "
2849 + exp.getCanonicalForm() + " "
2850 + exp.getStartLocation()
2851 + "\nUnderlying cause: " +
2852 e.getMessage(), exp);}
2853 }
2854 String vs = null;
2855 if (value instanceof TemplateScalarModel) {
2856 try {
2857 vs = ((TemplateScalarModel) exp).getAsString();
2858 } catch (TemplateModelException tme) {}
2859 }
2860 if (template != null) {
2861 if (ks.equalsIgnoreCase("encoding")) {
2862 if (vs == null) {
2863 {if (true) throw new ParseException("expecting encoding string here: "
2864 + exp.getStartLocation(), exp);}
2865 }
2866 String encoding = template.getEncoding();
2867 if (encoding != null && !encoding.equals(vs)) {
2868 {if (true) throw new Template.WrongEncodingException(vs);}
2869 }
2870 }
2871 else if (ks.equalsIgnoreCase("STRIP_WHITESPACE")) {
2872 this.stripWhitespace = getBoolean(exp);
2873 }
2874 else if (ks.equalsIgnoreCase("STRIP_TEXT")) {
2875 this.stripText = getBoolean(exp);
2876 }
2877 else if (ks.equalsIgnoreCase("STRICT_SYNTAX")) {
2878 this.token_source.strictEscapeSyntax = getBoolean(exp);
2879 }
2880 else if (ks.equalsIgnoreCase("ns_prefixes")) {
2881 if (!(value instanceof TemplateHashModelEx)) {
2882 {if (true) throw new ParseException("Expecting a hash of prefixes to namespace URI's here. " + exp.getStartLocation(), exp);}
2883 }
2884 TemplateHashModelEx prefixMap = (TemplateHashModelEx) value;
2885 try {
2886 TemplateCollectionModel keys = prefixMap.keys();
2887 for (TemplateModelIterator it = keys.iterator(); it.hasNext();) {
2888 String prefix = ((TemplateScalarModel) it.next()).getAsString();
2889 TemplateModel valueModel = prefixMap.get(prefix);
2890 if (!(valueModel instanceof TemplateScalarModel)) {
2891 {if (true) throw new ParseException("Non-string value in prefix to namespace hash. " + exp.getStartLocation(), exp);}
2892 }
2893 String nsURI = ((TemplateScalarModel) valueModel).getAsString();
2894 try {
2895 template.addPrefixNSMapping(prefix, nsURI);
2896 } catch (IllegalArgumentException iae) {
2897 {if (true) throw new ParseException(iae.getMessage() + " " + exp.getStartLocation(), exp);}
2898 }
2899 }
2900 } catch (TemplateModelException tme) {
2901 }
2902 }
2903 else if (ks.equalsIgnoreCase("attributes")) {
2904 if (!(value instanceof TemplateHashModelEx)) {
2905 {if (true) throw new ParseException("Expecting a hash of attribute names to values here. " + exp.getStartLocation(), exp);}
2906 }
2907 TemplateHashModelEx attributeMap = (TemplateHashModelEx) value;
2908 try {
2909 TemplateCollectionModel keys = attributeMap.keys();
2910 for (TemplateModelIterator it = keys.iterator(); it.hasNext();) {
2911 String attName = ((TemplateScalarModel) it.next()).getAsString();
2912 Object attValue = DeepUnwrap.unwrap(attributeMap.get(attName));
2913 template.setCustomAttribute(attName, attValue);
2914 }
2915 } catch (TemplateModelException tme) {
2916 }
2917 }
2918 else {
2919 {if (true) throw new ParseException("Unknown FTL header parameter: " + key.image,
2920 key.beginLine, key.beginColumn);}
2921 }
2922 }
2923 }
2924 LooseDirectiveEnd();
2925 break;
2926 default:
2927 jj_la1[80] = jj_gen;
2928 jj_consume_token(-1);
2929 throw new ParseException();
2930 }
2931 }
2932
2933 final public Map ParamList() throws ParseException {
2934 Identifier id;
2935 Expression exp;
2936 Map result = new HashMap();
2937 label_22:
2938 while (true) {
2939 id = Identifier();
2940 jj_consume_token(EQUALS);
2941 exp = Expression();
2942 result.put(id.toString(), exp);
2943 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2944 case COMMA:
2945 jj_consume_token(COMMA);
2946 break;
2947 default:
2948 jj_la1[81] = jj_gen;
2949 ;
2950 }
2951 switch ((jj_ntk==-1)?jj_ntk():jj_ntk) {
2952 case ID:
2953 ;
2954 break;
2955 default:
2956 jj_la1[82] = jj_gen;
2957 break label_22;
2958 }
2959 }
2960 {if (true) return result;}
2961 throw new Error("Missing return statement in function");
2962 }
2963
2964
2965
2966
2967
2968 final public TemplateElement Root() throws ParseException {
2969 TemplateElement doc;
2970 if (jj_2_17(2147483647)) {
2971 HeaderElement();
2972 } else {
2973 ;
2974 }
2975 doc = OptionalBlock();
2976 jj_consume_token(0);
2977 doc.setParentRecursively(null);
2978 {if (true) return doc.postParseCleanup(stripWhitespace);}
2979 throw new Error("Missing return statement in function");
2980 }
2981
2982 final private boolean jj_2_1(int xla) {
2983 jj_la = xla; jj_lastpos = jj_scanpos = token;
2984 try { return !jj_3_1(); }
2985 catch(LookaheadSuccess ls) { return true; }
2986 finally { jj_save(0, xla); }
2987 }
2988
2989 final private boolean jj_2_2(int xla) {
2990 jj_la = xla; jj_lastpos = jj_scanpos = token;
2991 try { return !jj_3_2(); }
2992 catch(LookaheadSuccess ls) { return true; }
2993 finally { jj_save(1, xla); }
2994 }
2995
2996 final private boolean jj_2_3(int xla) {
2997 jj_la = xla; jj_lastpos = jj_scanpos = token;
2998 try { return !jj_3_3(); }
2999 catch(LookaheadSuccess ls) { return true; }
3000 finally { jj_save(2, xla); }
3001 }
3002
3003 final private boolean jj_2_4(int xla) {
3004 jj_la = xla; jj_lastpos = jj_scanpos = token;
3005 try { return !jj_3_4(); }
3006 catch(LookaheadSuccess ls) { return true; }
3007 finally { jj_save(3, xla); }
3008 }
3009
3010 final private boolean jj_2_5(int xla) {
3011 jj_la = xla; jj_lastpos = jj_scanpos = token;
3012 try { return !jj_3_5(); }
3013 catch(LookaheadSuccess ls) { return true; }
3014 finally { jj_save(4, xla); }
3015 }
3016
3017 final private boolean jj_2_6(int xla) {
3018 jj_la = xla; jj_lastpos = jj_scanpos = token;
3019 try { return !jj_3_6(); }
3020 catch(LookaheadSuccess ls) { return true; }
3021 finally { jj_save(5, xla); }
3022 }
3023
3024 final private boolean jj_2_7(int xla) {
3025 jj_la = xla; jj_lastpos = jj_scanpos = token;
3026 try { return !jj_3_7(); }
3027 catch(LookaheadSuccess ls) { return true; }
3028 finally { jj_save(6, xla); }
3029 }
3030
3031 final private boolean jj_2_8(int xla) {
3032 jj_la = xla; jj_lastpos = jj_scanpos = token;
3033 try { return !jj_3_8(); }
3034 catch(LookaheadSuccess ls) { return true; }
3035 finally { jj_save(7, xla); }
3036 }
3037
3038 final private boolean jj_2_9(int xla) {
3039 jj_la = xla; jj_lastpos = jj_scanpos = token;
3040 try { return !jj_3_9(); }
3041 catch(LookaheadSuccess ls) { return true; }
3042 finally { jj_save(8, xla); }
3043 }
3044
3045 final private boolean jj_2_10(int xla) {
3046 jj_la = xla; jj_lastpos = jj_scanpos = token;
3047 try { return !jj_3_10(); }
3048 catch(LookaheadSuccess ls) { return true; }
3049 finally { jj_save(9, xla); }
3050 }
3051
3052 final private boolean jj_2_11(int xla) {
3053 jj_la = xla; jj_lastpos = jj_scanpos = token;
3054 try { return !jj_3_11(); }
3055 catch(LookaheadSuccess ls) { return true; }
3056 finally { jj_save(10, xla); }
3057 }
3058
3059 final private boolean jj_2_12(int xla) {
3060 jj_la = xla; jj_lastpos = jj_scanpos = token;
3061 try { return !jj_3_12(); }
3062 catch(LookaheadSuccess ls) { return true; }
3063 finally { jj_save(11, xla); }
3064 }
3065
3066 final private boolean jj_2_13(int xla) {
3067 jj_la = xla; jj_lastpos = jj_scanpos = token;
3068 try { return !jj_3_13(); }
3069 catch(LookaheadSuccess ls) { return true; }
3070 finally { jj_save(12, xla); }
3071 }
3072
3073 final private boolean jj_2_14(int xla) {
3074 jj_la = xla; jj_lastpos = jj_scanpos = token;
3075 try { return !jj_3_14(); }
3076 catch(LookaheadSuccess ls) { return true; }
3077 finally { jj_save(13, xla); }
3078 }
3079
3080 final private boolean jj_2_15(int xla) {
3081 jj_la = xla; jj_lastpos = jj_scanpos = token;
3082 try { return !jj_3_15(); }
3083 catch(LookaheadSuccess ls) { return true; }
3084 finally { jj_save(14, xla); }
3085 }
3086
3087 final private boolean jj_2_16(int xla) {
3088 jj_la = xla; jj_lastpos = jj_scanpos = token;
3089 try { return !jj_3_16(); }
3090 catch(LookaheadSuccess ls) { return true; }
3091 finally { jj_save(15, xla); }
3092 }
3093
3094 final private boolean jj_2_17(int xla) {
3095 jj_la = xla; jj_lastpos = jj_scanpos = token;
3096 try { return !jj_3_17(); }
3097 catch(LookaheadSuccess ls) { return true; }
3098 finally { jj_save(16, xla); }
3099 }
3100
3101 final private boolean jj_3R_171() {
3102 if (jj_scan_token(OPEN_PAREN)) return true;
3103 if (jj_3R_160()) return true;
3104 if (jj_scan_token(CLOSE_PAREN)) return true;
3105 return false;
3106 }
3107
3108 final private boolean jj_3R_36() {
3109 Token xsp;
3110 xsp = jj_scanpos;
3111 if (jj_scan_token(93)) {
3112 jj_scanpos = xsp;
3113 if (jj_scan_token(91)) {
3114 jj_scanpos = xsp;
3115 if (jj_scan_token(92)) return true;
3116 }
3117 }
3118 if (jj_3R_35()) return true;
3119 return false;
3120 }
3121
3122 final private boolean jj_3R_132() {
3123 if (jj_scan_token(RECURSE)) return true;
3124 return false;
3125 }
3126
3127 final private boolean jj_3R_32() {
3128 if (jj_3R_35()) return true;
3129 Token xsp;
3130 xsp = jj_scanpos;
3131 if (jj_3R_36()) jj_scanpos = xsp;
3132 return false;
3133 }
3134
3135 final private boolean jj_3R_110() {
3136 Token xsp;
3137 xsp = jj_scanpos;
3138 if (jj_scan_token(56)) {
3139 jj_scanpos = xsp;
3140 if (jj_3R_132()) return true;
3141 }
3142 return false;
3143 }
3144
3145 final private boolean jj_3R_108() {
3146 if (jj_scan_token(NOESCAPE)) return true;
3147 return false;
3148 }
3149
3150 final private boolean jj_3R_170() {
3151 if (jj_scan_token(OPEN_BRACKET)) return true;
3152 if (jj_3R_23()) return true;
3153 if (jj_scan_token(CLOSE_BRACKET)) return true;
3154 return false;
3155 }
3156
3157 final private boolean jj_3R_122() {
3158 if (jj_scan_token(FUNCTION)) return true;
3159 return false;
3160 }
3161
3162 final private boolean jj_3_3() {
3163 Token xsp;
3164 xsp = jj_scanpos;
3165 if (jj_scan_token(100)) {
3166 jj_scanpos = xsp;
3167 if (jj_scan_token(103)) {
3168 jj_scanpos = xsp;
3169 if (jj_scan_token(104)) return true;
3170 }
3171 }
3172 return false;
3173 }
3174
3175 final private boolean jj_3R_118() {
3176 if (jj_scan_token(PERCENT)) return true;
3177 return false;
3178 }
3179
3180 final private boolean jj_3R_92() {
3181 Token xsp;
3182 xsp = jj_scanpos;
3183 if (jj_scan_token(20)) {
3184 jj_scanpos = xsp;
3185 if (jj_3R_122()) return true;
3186 }
3187 return false;
3188 }
3189
3190 final private boolean jj_3R_117() {
3191 if (jj_scan_token(DIVIDE)) return true;
3192 return false;
3193 }
3194
3195 final private boolean jj_3R_109() {
3196 if (jj_scan_token(VISIT)) return true;
3197 return false;
3198 }
3199
3200 final private boolean jj_3R_116() {
3201 if (jj_scan_token(TIMES)) return true;
3202 return false;
3203 }
3204
3205 final private boolean jj_3R_82() {
3206 Token xsp;
3207 xsp = jj_scanpos;
3208 if (jj_3R_116()) {
3209 jj_scanpos = xsp;
3210 if (jj_3R_117()) {
3211 jj_scanpos = xsp;
3212 if (jj_3R_118()) return true;
3213 }
3214 }
3215 if (jj_3R_81()) return true;
3216 return false;
3217 }
3218
3219 final private boolean jj_3R_107() {
3220 if (jj_scan_token(ESCAPE)) return true;
3221 return false;
3222 }
3223
3224 final private boolean jj_3R_50() {
3225 if (jj_3R_81()) return true;
3226 Token xsp;
3227 while (true) {
3228 xsp = jj_scanpos;
3229 if (jj_3R_82()) { jj_scanpos = xsp; break; }
3230 }
3231 return false;
3232 }
3233
3234 final private boolean jj_3R_88() {
3235 if (jj_scan_token(FOREACH)) return true;
3236 return false;
3237 }
3238
3239 final private boolean jj_3R_176() {
3240 Token xsp;
3241 xsp = jj_scanpos;
3242 if (jj_scan_token(94)) {
3243 jj_scanpos = xsp;
3244 if (jj_scan_token(95)) {
3245 jj_scanpos = xsp;
3246 if (jj_scan_token(96)) {
3247 jj_scanpos = xsp;
3248 if (jj_scan_token(97)) {
3249 jj_scanpos = xsp;
3250 if (jj_scan_token(83)) {
3251 jj_scanpos = xsp;
3252 if (jj_scan_token(84)) {
3253 jj_scanpos = xsp;
3254 if (jj_scan_token(117)) {
3255 jj_scanpos = xsp;
3256 if (jj_scan_token(118)) {
3257 jj_scanpos = xsp;
3258 if (jj_scan_token(119)) return true;
3259 }
3260 }
3261 }
3262 }
3263 }
3264 }
3265 }
3266 }
3267 return false;
3268 }
3269
3270 final private boolean jj_3R_27() {
3271 if (jj_scan_token(DEFAUL)) return true;
3272 return false;
3273 }
3274
3275 final private boolean jj_3R_26() {
3276 if (jj_scan_token(CASE)) return true;
3277 if (jj_3R_23()) return true;
3278 return false;
3279 }
3280
3281 final private boolean jj_3R_91() {
3282 if (jj_scan_token(IMPORT)) return true;
3283 return false;
3284 }
3285
3286 final private boolean jj_3R_169() {
3287 if (jj_scan_token(DOT)) return true;
3288 Token xsp;
3289 xsp = jj_scanpos;
3290 if (jj_scan_token(120)) {
3291 jj_scanpos = xsp;
3292 if (jj_scan_token(100)) {
3293 jj_scanpos = xsp;
3294 if (jj_scan_token(101)) {
3295 jj_scanpos = xsp;
3296 if (jj_3R_176()) return true;
3297 }
3298 }
3299 }
3300 return false;
3301 }
3302
3303 final private boolean jj_3R_24() {
3304 Token xsp;
3305 xsp = jj_scanpos;
3306 if (jj_scan_token(68)) jj_scanpos = xsp;
3307 xsp = jj_scanpos;
3308 if (jj_3R_26()) {
3309 jj_scanpos = xsp;
3310 if (jj_3R_27()) return true;
3311 }
3312 if (jj_3R_28()) return true;
3313 return false;
3314 }
3315
3316 final private boolean jj_3_2() {
3317 Token xsp;
3318 xsp = jj_scanpos;
3319 if (jj_scan_token(98)) {
3320 jj_scanpos = xsp;
3321 if (jj_scan_token(99)) return true;
3322 }
3323 return false;
3324 }
3325
3326 final private boolean jj_3R_84() {
3327 if (jj_scan_token(MINUS)) return true;
3328 return false;
3329 }
3330
3331 final private boolean jj_3R_83() {
3332 if (jj_scan_token(PLUS)) return true;
3333 return false;
3334 }
3335
3336 final private boolean jj_3R_87() {
3337 if (jj_scan_token(LIST)) return true;
3338 return false;
3339 }
3340
3341 final private boolean jj_3R_51() {
3342 Token xsp;
3343 xsp = jj_scanpos;
3344 if (jj_3R_83()) {
3345 jj_scanpos = xsp;
3346 if (jj_3R_84()) return true;
3347 }
3348 if (jj_3R_50()) return true;
3349 return false;
3350 }
3351
3352 final private boolean jj_3R_44() {
3353 if (jj_3R_50()) return true;
3354 Token xsp;
3355 while (true) {
3356 xsp = jj_scanpos;
3357 if (jj_3R_51()) { jj_scanpos = xsp; break; }
3358 }
3359 return false;
3360 }
3361
3362 final private boolean jj_3R_172() {
3363 if (jj_scan_token(BUILT_IN)) return true;
3364 if (jj_scan_token(ID)) return true;
3365 return false;
3366 }
3367
3368 final private boolean jj_3_15() {
3369 if (jj_3R_24()) return true;
3370 return false;
3371 }
3372
3373 final private boolean jj_3R_90() {
3374 if (jj_scan_token(_INCLUDE)) return true;
3375 return false;
3376 }
3377
3378 final private boolean jj_3R_136() {
3379 if (jj_scan_token(MINUS)) return true;
3380 return false;
3381 }
3382
3383 final private boolean jj_3R_99() {
3384 if (jj_scan_token(SWITCH)) return true;
3385 return false;
3386 }
3387
3388 final private boolean jj_3R_174() {
3389 if (jj_scan_token(EXISTS)) return true;
3390 return false;
3391 }
3392
3393 final private boolean jj_3R_133() {
3394 Token xsp;
3395 xsp = jj_scanpos;
3396 if (jj_scan_token(98)) {
3397 jj_scanpos = xsp;
3398 if (jj_3R_136()) return true;
3399 }
3400 if (jj_3R_135()) return true;
3401 return false;
3402 }
3403
3404 final private boolean jj_3_10() {
3405 if (jj_3R_23()) return true;
3406 return false;
3407 }
3408
3409 final private boolean jj_3R_112() {
3410 if (jj_scan_token(ATTEMPT)) return true;
3411 return false;
3412 }
3413
3414 final private boolean jj_3R_178() {
3415 if (jj_3R_23()) return true;
3416 return false;
3417 }
3418
3419 final private boolean jj_3R_137() {
3420 if (jj_scan_token(EXCLAM)) return true;
3421 return false;
3422 }
3423
3424 final private boolean jj_3R_177() {
3425 if (jj_scan_token(EXCLAM)) return true;
3426 Token xsp;
3427 xsp = jj_scanpos;
3428 if (jj_3R_178()) jj_scanpos = xsp;
3429 return false;
3430 }
3431
3432 final private boolean jj_3R_134() {
3433 Token xsp;
3434 if (jj_3R_137()) return true;
3435 while (true) {
3436 xsp = jj_scanpos;
3437 if (jj_3R_137()) { jj_scanpos = xsp; break; }
3438 }
3439 if (jj_3R_135()) return true;
3440 return false;
3441 }
3442
3443 final private boolean jj_3R_173() {
3444 Token xsp;
3445 xsp = jj_scanpos;
3446 if (jj_scan_token(128)) {
3447 jj_scanpos = xsp;
3448 if (jj_3R_177()) return true;
3449 }
3450 return false;
3451 }
3452
3453 final private boolean jj_3R_98() {
3454 if (jj_scan_token(TRANSFORM)) return true;
3455 return false;
3456 }
3457
3458 final private boolean jj_3R_31() {
3459 if (jj_3R_34()) return true;
3460 return false;
3461 }
3462
3463 final private boolean jj_3_11() {
3464 Token xsp;
3465 xsp = jj_scanpos;
3466 if (jj_scan_token(108)) jj_scanpos = xsp;
3467 xsp = jj_scanpos;
3468 if (jj_scan_token(120)) {
3469 jj_scanpos = xsp;
3470 if (jj_scan_token(81)) return true;
3471 }
3472 if (jj_scan_token(EQUALS)) return true;
3473 return false;
3474 }
3475
3476 final private boolean jj_3R_28() {
3477 Token xsp;
3478 xsp = jj_scanpos;
3479 if (jj_3R_31()) jj_scanpos = xsp;
3480 return false;
3481 }
3482
3483 final private boolean jj_3R_166() {
3484 if (jj_3R_174()) return true;
3485 return false;
3486 }
3487
3488 final private boolean jj_3R_165() {
3489 if (jj_3R_173()) return true;
3490 return false;
3491 }
3492
3493 final private boolean jj_3R_164() {
3494 if (jj_3R_172()) return true;
3495 return false;
3496 }
3497
3498 final private boolean jj_3R_163() {
3499 if (jj_3R_171()) return true;
3500 return false;
3501 }
3502
3503 final private boolean jj_3R_162() {
3504 if (jj_3R_170()) return true;
3505 return false;
3506 }
3507
3508 final private boolean jj_3R_161() {
3509 if (jj_3R_169()) return true;
3510 return false;
3511 }
3512
3513 final private boolean jj_3R_97() {
3514 if (jj_scan_token(NOPARSE)) return true;
3515 return false;
3516 }
3517
3518 final private boolean jj_3R_155() {
3519 Token xsp;
3520 xsp = jj_scanpos;
3521 if (jj_3R_161()) {
3522 jj_scanpos = xsp;
3523 if (jj_3R_162()) {
3524 jj_scanpos = xsp;
3525 if (jj_3R_163()) {
3526 jj_scanpos = xsp;
3527 if (jj_3R_164()) {
3528 jj_scanpos = xsp;
3529 if (jj_3R_165()) {
3530 jj_scanpos = xsp;
3531 if (jj_3R_166()) return true;
3532 }
3533 }
3534 }
3535 }
3536 }
3537 return false;
3538 }
3539
3540 final private boolean jj_3R_86() {
3541 if (jj_scan_token(IF)) return true;
3542 return false;
3543 }
3544
3545 final private boolean jj_3R_115() {
3546 if (jj_3R_135()) return true;
3547 return false;
3548 }
3549
3550 final private boolean jj_3R_114() {
3551 if (jj_3R_134()) return true;
3552 return false;
3553 }
3554
3555 final private boolean jj_3R_113() {
3556 if (jj_3R_133()) return true;
3557 return false;
3558 }
3559
3560 final private boolean jj_3R_81() {
3561 Token xsp;
3562 xsp = jj_scanpos;
3563 if (jj_3R_113()) {
3564 jj_scanpos = xsp;
3565 if (jj_3R_114()) {
3566 jj_scanpos = xsp;
3567 if (jj_3R_115()) return true;
3568 }
3569 }
3570 return false;
3571 }
3572
3573 final private boolean jj_3R_96() {
3574 Token xsp;
3575 xsp = jj_scanpos;
3576 if (jj_scan_token(28)) {
3577 jj_scanpos = xsp;
3578 if (jj_scan_token(29)) return true;
3579 }
3580 return false;
3581 }
3582
3583 final private boolean jj_3R_121() {
3584 if (jj_scan_token(LOCALASSIGN)) return true;
3585 return false;
3586 }
3587
3588 final private boolean jj_3R_120() {
3589 if (jj_scan_token(GLOBALASSIGN)) return true;
3590 return false;
3591 }
3592
3593 final private boolean jj_3R_119() {
3594 if (jj_scan_token(ASSIGN)) return true;
3595 return false;
3596 }
3597
3598 final private boolean jj_3R_154() {
3599 if (jj_scan_token(DOT)) return true;
3600 if (jj_scan_token(ID)) return true;
3601 return false;
3602 }
3603
3604 final private boolean jj_3R_89() {
3605 Token xsp;
3606 xsp = jj_scanpos;
3607 if (jj_3R_119()) {
3608 jj_scanpos = xsp;
3609 if (jj_3R_120()) {
3610 jj_scanpos = xsp;
3611 if (jj_3R_121()) return true;
3612 }
3613 }
3614 return false;
3615 }
3616
3617 final private boolean jj_3R_175() {
3618 Token xsp;
3619 xsp = jj_scanpos;
3620 if (jj_scan_token(108)) jj_scanpos = xsp;
3621 if (jj_3R_23()) return true;
3622 return false;
3623 }
3624
3625 final private boolean jj_3R_168() {
3626 if (jj_3R_23()) return true;
3627 Token xsp;
3628 while (true) {
3629 xsp = jj_scanpos;
3630 if (jj_3R_175()) { jj_scanpos = xsp; break; }
3631 }
3632 return false;
3633 }
3634
3635 final private boolean jj_3R_153() {
3636 if (jj_scan_token(OPEN_PAREN)) return true;
3637 if (jj_3R_23()) return true;
3638 if (jj_scan_token(CLOSE_PAREN)) return true;
3639 return false;
3640 }
3641
3642 final private boolean jj_3R_160() {
3643 Token xsp;
3644 xsp = jj_scanpos;
3645 if (jj_3R_168()) jj_scanpos = xsp;
3646 return false;
3647 }
3648
3649 final private boolean jj_3R_43() {
3650 if (jj_3R_49()) return true;
3651 return false;
3652 }
3653
3654 final private boolean jj_3R_42() {
3655 if (jj_3R_48()) return true;
3656 return false;
3657 }
3658
3659 final private boolean jj_3_1() {
3660 Token xsp;
3661 xsp = jj_scanpos;
3662 if (jj_scan_token(87)) {
3663 jj_scanpos = xsp;
3664 if (jj_scan_token(111)) {
3665 jj_scanpos = xsp;
3666 if (jj_scan_token(113)) {
3667 jj_scanpos = xsp;
3668 if (jj_scan_token(89)) {
3669 jj_scanpos = xsp;
3670 if (jj_scan_token(107)) {
3671 jj_scanpos = xsp;
3672 if (jj_scan_token(128)) {
3673 jj_scanpos = xsp;
3674 if (jj_scan_token(90)) return true;
3675 }
3676 }
3677 }
3678 }
3679 }
3680 }
3681 return false;
3682 }
3683
3684 final private boolean jj_3R_41() {
3685 if (jj_3R_47()) return true;
3686 return false;
3687 }
3688
3689 final private boolean jj_3R_40() {
3690 if (jj_3R_46()) return true;
3691 return false;
3692 }
3693
3694 final private boolean jj_3R_129() {
3695 if (jj_scan_token(NOTRIM)) return true;
3696 return false;
3697 }
3698
3699 final private boolean jj_3R_128() {
3700 if (jj_scan_token(RTRIM)) return true;
3701 return false;
3702 }
3703
3704 final private boolean jj_3R_37() {
3705 Token xsp;
3706 xsp = jj_scanpos;
3707 if (jj_3R_40()) {
3708 jj_scanpos = xsp;
3709 if (jj_3R_41()) {
3710 jj_scanpos = xsp;
3711 if (jj_3R_42()) {
3712 jj_scanpos = xsp;
3713 if (jj_3R_43()) return true;
3714 }
3715 }
3716 }
3717 return false;
3718 }
3719
3720 final private boolean jj_3R_127() {
3721 if (jj_scan_token(LTRIM)) return true;
3722 return false;
3723 }
3724
3725 final private boolean jj_3R_146() {
3726 if (jj_3R_155()) return true;
3727 return false;
3728 }
3729
3730 final private boolean jj_3R_34() {
3731 Token xsp;
3732 if (jj_3R_37()) return true;
3733 while (true) {
3734 xsp = jj_scanpos;
3735 if (jj_3R_37()) { jj_scanpos = xsp; break; }
3736 }
3737 return false;
3738 }
3739
3740 final private boolean jj_3R_126() {
3741 if (jj_scan_token(TRIM)) return true;
3742 return false;
3743 }
3744
3745 final private boolean jj_3R_152() {
3746 if (jj_scan_token(ID)) return true;
3747 return false;
3748 }
3749
3750 final private boolean jj_3R_145() {
3751 if (jj_3R_154()) return true;
3752 return false;
3753 }
3754
3755 final private boolean jj_3R_105() {
3756 Token xsp;
3757 xsp = jj_scanpos;
3758 if (jj_3R_126()) {
3759 jj_scanpos = xsp;
3760 if (jj_3R_127()) {
3761 jj_scanpos = xsp;
3762 if (jj_3R_128()) {
3763 jj_scanpos = xsp;
3764 if (jj_3R_129()) return true;
3765 }
3766 }
3767 }
3768 return false;
3769 }
3770
3771 final private boolean jj_3R_144() {
3772 if (jj_3R_153()) return true;
3773 return false;
3774 }
3775
3776 final private boolean jj_3R_143() {
3777 if (jj_3R_152()) return true;
3778 return false;
3779 }
3780
3781 final private boolean jj_3R_142() {
3782 if (jj_3R_151()) return true;
3783 return false;
3784 }
3785
3786 final private boolean jj_3R_141() {
3787 if (jj_3R_150()) return true;
3788 return false;
3789 }
3790
3791 final private boolean jj_3R_140() {
3792 if (jj_3R_149()) return true;
3793 return false;
3794 }
3795
3796 final private boolean jj_3R_139() {
3797 if (jj_3R_148()) return true;
3798 return false;
3799 }
3800
3801 final private boolean jj_3R_138() {
3802 if (jj_3R_147()) return true;
3803 return false;
3804 }
3805
3806 final private boolean jj_3R_104() {
3807 if (jj_scan_token(FLUSH)) return true;
3808 return false;
3809 }
3810
3811 final private boolean jj_3_13() {
3812 if (jj_scan_token(OPEN_PAREN)) return true;
3813 return false;
3814 }
3815
3816 final private boolean jj_3R_135() {
3817 Token xsp;
3818 xsp = jj_scanpos;
3819 if (jj_3R_138()) {
3820 jj_scanpos = xsp;
3821 if (jj_3R_139()) {
3822 jj_scanpos = xsp;
3823 if (jj_3R_140()) {
3824 jj_scanpos = xsp;
3825 if (jj_3R_141()) {
3826 jj_scanpos = xsp;
3827 if (jj_3R_142()) {
3828 jj_scanpos = xsp;
3829 if (jj_3R_143()) {
3830 jj_scanpos = xsp;
3831 if (jj_3R_144()) {
3832 jj_scanpos = xsp;
3833 if (jj_3R_145()) return true;
3834 }
3835 }
3836 }
3837 }
3838 }
3839 }
3840 }
3841 while (true) {
3842 xsp = jj_scanpos;
3843 if (jj_3R_146()) { jj_scanpos = xsp; break; }
3844 }
3845 return false;
3846 }
3847
3848 final private boolean jj_3R_147() {
3849 Token xsp;
3850 xsp = jj_scanpos;
3851 if (jj_scan_token(85)) {
3852 jj_scanpos = xsp;
3853 if (jj_scan_token(86)) return true;
3854 }
3855 return false;
3856 }
3857
3858 final private boolean jj_3_14() {
3859 if (jj_scan_token(ID)) return true;
3860 if (jj_scan_token(EQUALS)) return true;
3861 return false;
3862 }
3863
3864 final private boolean jj_3R_151() {
3865 if (jj_scan_token(OPEN_BRACKET)) return true;
3866 if (jj_3R_160()) return true;
3867 if (jj_scan_token(CLOSE_BRACKET)) return true;
3868 return false;
3869 }
3870
3871 final private boolean jj_3R_23() {
3872 if (jj_3R_25()) return true;
3873 return false;
3874 }
3875
3876 final private boolean jj_3R_131() {
3877 if (jj_scan_token(NESTED)) return true;
3878 return false;
3879 }
3880
3881 final private boolean jj_3_16() {
3882 Token xsp;
3883 xsp = jj_scanpos;
3884 if (jj_scan_token(68)) {
3885 jj_scanpos = xsp;
3886 if (jj_scan_token(69)) {
3887 jj_scanpos = xsp;
3888 if (jj_scan_token(70)) return true;
3889 }
3890 }
3891 return false;
3892 }
3893
3894 final private boolean jj_3R_48() {
3895 if (jj_scan_token(NUMERICAL_ESCAPE)) return true;
3896 return false;
3897 }
3898
3899 final private boolean jj_3R_95() {
3900 if (jj_scan_token(CALL)) return true;
3901 return false;
3902 }
3903
3904 final private boolean jj_3_9() {
3905 if (jj_scan_token(OR)) return true;
3906 return false;
3907 }
3908
3909 final private boolean jj_3R_85() {
3910 if (jj_scan_token(WHITESPACE)) return true;
3911 return false;
3912 }
3913
3914 final private boolean jj_3R_130() {
3915 if (jj_scan_token(SIMPLE_NESTED)) return true;
3916 return false;
3917 }
3918
3919 final private boolean jj_3R_53() {
3920 Token xsp;
3921 xsp = jj_scanpos;
3922 if (jj_3R_85()) {
3923 jj_scanpos = xsp;
3924 if (jj_scan_token(69)) {
3925 jj_scanpos = xsp;
3926 if (jj_scan_token(70)) return true;
3927 }
3928 }
3929 return false;
3930 }
3931
3932 final private boolean jj_3R_106() {
3933 Token xsp;
3934 xsp = jj_scanpos;
3935 if (jj_3R_130()) {
3936 jj_scanpos = xsp;
3937 if (jj_3R_131()) return true;
3938 }
3939 return false;
3940 }
3941
3942 final private boolean jj_3R_46() {
3943 Token xsp;
3944 if (jj_3R_53()) return true;
3945 while (true) {
3946 xsp = jj_scanpos;
3947 if (jj_3R_53()) { jj_scanpos = xsp; break; }
3948 }
3949 return false;
3950 }
3951
3952 final private boolean jj_3R_30() {
3953 if (jj_scan_token(OR)) return true;
3954 if (jj_3R_29()) return true;
3955 return false;
3956 }
3957
3958 final private boolean jj_3R_25() {
3959 if (jj_3R_29()) return true;
3960 Token xsp;
3961 while (true) {
3962 xsp = jj_scanpos;
3963 if (jj_3R_30()) { jj_scanpos = xsp; break; }
3964 }
3965 return false;
3966 }
3967
3968 final private boolean jj_3R_47() {
3969 if (jj_scan_token(OUTPUT_ESCAPE)) return true;
3970 return false;
3971 }
3972
3973 final private boolean jj_3R_125() {
3974 if (jj_scan_token(STOP)) return true;
3975 return false;
3976 }
3977
3978 final private boolean jj_3_8() {
3979 if (jj_scan_token(AND)) return true;
3980 return false;
3981 }
3982
3983 final private boolean jj_3R_103() {
3984 Token xsp;
3985 xsp = jj_scanpos;
3986 if (jj_scan_token(47)) {
3987 jj_scanpos = xsp;
3988 if (jj_3R_125()) return true;
3989 }
3990 return false;
3991 }
3992
3993 final private boolean jj_3R_80() {
3994 if (jj_3R_112()) return true;
3995 return false;
3996 }
3997
3998 final private boolean jj_3R_79() {
3999 if (jj_3R_111()) return true;
4000 return false;
4001 }
4002
4003 final private boolean jj_3R_78() {
4004 if (jj_3R_110()) return true;
4005 return false;
4006 }
4007
4008 final private boolean jj_3R_33() {
4009 if (jj_scan_token(AND)) return true;
4010 if (jj_3R_32()) return true;
4011 return false;
4012 }
4013
4014 final private boolean jj_3R_77() {
4015 if (jj_3R_109()) return true;
4016 return false;
4017 }
4018
4019 final private boolean jj_3R_76() {
4020 if (jj_3R_108()) return true;
4021 return false;
4022 }
4023
4024 final private boolean jj_3R_75() {
4025 if (jj_3R_107()) return true;
4026 return false;
4027 }
4028
4029 final private boolean jj_3R_29() {
4030 if (jj_3R_32()) return true;
4031 Token xsp;
4032 while (true) {
4033 xsp = jj_scanpos;
4034 if (jj_3R_33()) { jj_scanpos = xsp; break; }
4035 }
4036 return false;
4037 }
4038
4039 final private boolean jj_3_12() {
4040 if (jj_scan_token(ID)) return true;
4041 if (jj_scan_token(EQUALS)) return true;
4042 return false;
4043 }
4044
4045 final private boolean jj_3R_74() {
4046 if (jj_3R_106()) return true;
4047 return false;
4048 }
4049
4050 final private boolean jj_3R_73() {
4051 if (jj_3R_105()) return true;
4052 return false;
4053 }
4054
4055 final private boolean jj_3R_167() {
4056 if (jj_scan_token(COMMA)) return true;
4057 if (jj_3R_23()) return true;
4058 Token xsp;
4059 xsp = jj_scanpos;
4060 if (jj_scan_token(108)) {
4061 jj_scanpos = xsp;
4062 if (jj_scan_token(110)) return true;
4063 }
4064 if (jj_3R_23()) return true;
4065 return false;
4066 }
4067
4068 final private boolean jj_3R_72() {
4069 if (jj_3R_104()) return true;
4070 return false;
4071 }
4072
4073 final private boolean jj_3R_71() {
4074 if (jj_3R_103()) return true;
4075 return false;
4076 }
4077
4078 final private boolean jj_3R_70() {
4079 if (jj_3R_102()) return true;
4080 return false;
4081 }
4082
4083 final private boolean jj_3R_69() {
4084 if (jj_3R_101()) return true;
4085 return false;
4086 }
4087
4088 final private boolean jj_3R_68() {
4089 if (jj_3R_100()) return true;
4090 return false;
4091 }
4092
4093 final private boolean jj_3_6() {
4094 if (jj_3R_23()) return true;
4095 return false;
4096 }
4097
4098 final private boolean jj_3R_67() {
4099 if (jj_3R_99()) return true;
4100 return false;
4101 }
4102
4103 final private boolean jj_3R_156() {
4104 if (jj_3R_23()) return true;
4105 Token xsp;
4106 xsp = jj_scanpos;
4107 if (jj_scan_token(108)) {
4108 jj_scanpos = xsp;
4109 if (jj_scan_token(110)) return true;
4110 }
4111 if (jj_3R_23()) return true;
4112 while (true) {
4113 xsp = jj_scanpos;
4114 if (jj_3R_167()) { jj_scanpos = xsp; break; }
4115 }
4116 return false;
4117 }
4118
4119 final private boolean jj_3R_66() {
4120 if (jj_3R_98()) return true;
4121 return false;
4122 }
4123
4124 final private boolean jj_3R_65() {
4125 if (jj_3R_97()) return true;
4126 return false;
4127 }
4128
4129 final private boolean jj_3_7() {
4130 if (jj_scan_token(DOT_DOT)) return true;
4131 return false;
4132 }
4133
4134 final private boolean jj_3R_64() {
4135 if (jj_3R_96()) return true;
4136 return false;
4137 }
4138
4139 final private boolean jj_3R_148() {
4140 if (jj_scan_token(OPEN_BRACE)) return true;
4141 Token xsp;
4142 xsp = jj_scanpos;
4143 if (jj_3R_156()) jj_scanpos = xsp;
4144 if (jj_scan_token(CLOSE_BRACE)) return true;
4145 return false;
4146 }
4147
4148 final private boolean jj_3R_124() {
4149 if (jj_scan_token(RETURN)) return true;
4150 return false;
4151 }
4152
4153 final private boolean jj_3R_94() {
4154 if (jj_scan_token(UNIFIED_CALL)) return true;
4155 return false;
4156 }
4157
4158 final private boolean jj_3R_63() {
4159 if (jj_3R_95()) return true;
4160 return false;
4161 }
4162
4163 final private boolean jj_3R_123() {
4164 if (jj_scan_token(SIMPLE_RETURN)) return true;
4165 return false;
4166 }
4167
4168 final private boolean jj_3R_52() {
4169 if (jj_3R_44()) return true;
4170 return false;
4171 }
4172
4173 final private boolean jj_3R_62() {
4174 if (jj_3R_94()) return true;
4175 return false;
4176 }
4177
4178 final private boolean jj_3R_61() {
4179 if (jj_3R_93()) return true;
4180 return false;
4181 }
4182
4183 final private boolean jj_3R_102() {
4184 Token xsp;
4185 xsp = jj_scanpos;
4186 if (jj_3R_123()) {
4187 jj_scanpos = xsp;
4188 if (jj_3R_124()) return true;
4189 }
4190 return false;
4191 }
4192
4193 final private boolean jj_3R_60() {
4194 if (jj_3R_92()) return true;
4195 return false;
4196 }
4197
4198 final private boolean jj_3R_45() {
4199 if (jj_scan_token(DOT_DOT)) return true;
4200 Token xsp;
4201 xsp = jj_scanpos;
4202 if (jj_3R_52()) jj_scanpos = xsp;
4203 return false;
4204 }
4205
4206 final private boolean jj_3R_59() {
4207 if (jj_3R_91()) return true;
4208 return false;
4209 }
4210
4211 final private boolean jj_3R_58() {
4212 if (jj_3R_90()) return true;
4213 return false;
4214 }
4215
4216 final private boolean jj_3R_38() {
4217 if (jj_3R_44()) return true;
4218 Token xsp;
4219 xsp = jj_scanpos;
4220 if (jj_3R_45()) jj_scanpos = xsp;
4221 return false;
4222 }
4223
4224 final private boolean jj_3R_159() {
4225 if (jj_scan_token(TRUE)) return true;
4226 return false;
4227 }
4228
4229 final private boolean jj_3R_57() {
4230 if (jj_3R_89()) return true;
4231 return false;
4232 }
4233
4234 final private boolean jj_3R_158() {
4235 if (jj_scan_token(FALSE)) return true;
4236 return false;
4237 }
4238
4239 final private boolean jj_3R_56() {
4240 if (jj_3R_88()) return true;
4241 return false;
4242 }
4243
4244 final private boolean jj_3R_55() {
4245 if (jj_3R_87()) return true;
4246 return false;
4247 }
4248
4249 final private boolean jj_3R_54() {
4250 if (jj_3R_86()) return true;
4251 return false;
4252 }
4253
4254 final private boolean jj_3R_150() {
4255 Token xsp;
4256 xsp = jj_scanpos;
4257 if (jj_3R_158()) {
4258 jj_scanpos = xsp;
4259 if (jj_3R_159()) return true;
4260 }
4261 return false;
4262 }
4263
4264 final private boolean jj_3R_93() {
4265 if (jj_scan_token(COMPRESS)) return true;
4266 return false;
4267 }
4268
4269 final private boolean jj_3R_49() {
4270 Token xsp;
4271 xsp = jj_scanpos;
4272 if (jj_3R_54()) {
4273 jj_scanpos = xsp;
4274 if (jj_3R_55()) {
4275 jj_scanpos = xsp;
4276 if (jj_3R_56()) {
4277 jj_scanpos = xsp;
4278 if (jj_3R_57()) {
4279 jj_scanpos = xsp;
4280 if (jj_3R_58()) {
4281 jj_scanpos = xsp;
4282 if (jj_3R_59()) {
4283 jj_scanpos = xsp;
4284 if (jj_3R_60()) {
4285 jj_scanpos = xsp;
4286 if (jj_3R_61()) {
4287 jj_scanpos = xsp;
4288 if (jj_3R_62()) {
4289 jj_scanpos = xsp;
4290 if (jj_3R_63()) {
4291 jj_scanpos = xsp;
4292 if (jj_3R_64()) {
4293 jj_scanpos = xsp;
4294 if (jj_3R_65()) {
4295 jj_scanpos = xsp;
4296 if (jj_3R_66()) {
4297 jj_scanpos = xsp;
4298 if (jj_3R_67()) {
4299 jj_scanpos = xsp;
4300 if (jj_3R_68()) {
4301 jj_scanpos = xsp;
4302 if (jj_3R_69()) {
4303 jj_scanpos = xsp;
4304 if (jj_3R_70()) {
4305 jj_scanpos = xsp;
4306 if (jj_3R_71()) {
4307 jj_scanpos = xsp;
4308 if (jj_3R_72()) {
4309 jj_scanpos = xsp;
4310 if (jj_3R_73()) {
4311 jj_scanpos = xsp;
4312 if (jj_3R_74()) {
4313 jj_scanpos = xsp;
4314 if (jj_3R_75()) {
4315 jj_scanpos = xsp;
4316 if (jj_3R_76()) {
4317 jj_scanpos = xsp;
4318 if (jj_3R_77()) {
4319 jj_scanpos = xsp;
4320 if (jj_3R_78()) {
4321 jj_scanpos = xsp;
4322 if (jj_3R_79()) {
4323 jj_scanpos = xsp;
4324 if (jj_3R_80()) return true;
4325 }
4326 }
4327 }
4328 }
4329 }
4330 }
4331 }
4332 }
4333 }
4334 }
4335 }
4336 }
4337 }
4338 }
4339 }
4340 }
4341 }
4342 }
4343 }
4344 }
4345 }
4346 }
4347 }
4348 }
4349 }
4350 }
4351 return false;
4352 }
4353
4354 final private boolean jj_3R_101() {
4355 if (jj_scan_token(BREAK)) return true;
4356 return false;
4357 }
4358
4359 final private boolean jj_3_5() {
4360 Token xsp;
4361 xsp = jj_scanpos;
4362 if (jj_scan_token(126)) {
4363 jj_scanpos = xsp;
4364 if (jj_scan_token(97)) {
4365 jj_scanpos = xsp;
4366 if (jj_scan_token(125)) {
4367 jj_scanpos = xsp;
4368 if (jj_scan_token(96)) {
4369 jj_scanpos = xsp;
4370 if (jj_scan_token(95)) {
4371 jj_scanpos = xsp;
4372 if (jj_scan_token(95)) {
4373 jj_scanpos = xsp;
4374 if (jj_scan_token(94)) return true;
4375 }
4376 }
4377 }
4378 }
4379 }
4380 }
4381 return false;
4382 }
4383
4384 final private boolean jj_3R_100() {
4385 if (jj_scan_token(SETTING)) return true;
4386 return false;
4387 }
4388
4389 final private boolean jj_3R_39() {
4390 Token xsp;
4391 xsp = jj_scanpos;
4392 if (jj_scan_token(126)) {
4393 jj_scanpos = xsp;
4394 if (jj_scan_token(97)) {
4395 jj_scanpos = xsp;
4396 if (jj_scan_token(125)) {
4397 jj_scanpos = xsp;
4398 if (jj_scan_token(96)) {
4399 jj_scanpos = xsp;
4400 if (jj_scan_token(95)) {
4401 jj_scanpos = xsp;
4402 if (jj_scan_token(94)) return true;
4403 }
4404 }
4405 }
4406 }
4407 }
4408 if (jj_3R_38()) return true;
4409 return false;
4410 }
4411
4412 final private boolean jj_3R_157() {
4413 if (jj_scan_token(RAW_STRING)) return true;
4414 return false;
4415 }
4416
4417 final private boolean jj_3R_35() {
4418 if (jj_3R_38()) return true;
4419 Token xsp;
4420 xsp = jj_scanpos;
4421 if (jj_3R_39()) jj_scanpos = xsp;
4422 return false;
4423 }
4424
4425 final private boolean jj_3R_111() {
4426 if (jj_scan_token(FALLBACK)) return true;
4427 return false;
4428 }
4429
4430 final private boolean jj_3R_149() {
4431 Token xsp;
4432 xsp = jj_scanpos;
4433 if (jj_scan_token(81)) {
4434 jj_scanpos = xsp;
4435 if (jj_3R_157()) return true;
4436 }
4437 return false;
4438 }
4439
4440 final private boolean jj_3_17() {
4441 Token xsp;
4442 xsp = jj_scanpos;
4443 if (jj_scan_token(68)) jj_scanpos = xsp;
4444 xsp = jj_scanpos;
4445 if (jj_scan_token(66)) {
4446 jj_scanpos = xsp;
4447 if (jj_scan_token(65)) return true;
4448 }
4449 return false;
4450 }
4451
4452 final private boolean jj_3_4() {
4453 Token xsp;
4454 xsp = jj_scanpos;
4455 if (jj_scan_token(93)) {
4456 jj_scanpos = xsp;
4457 if (jj_scan_token(91)) {
4458 jj_scanpos = xsp;
4459 if (jj_scan_token(92)) return true;
4460 }
4461 }
4462 return false;
4463 }
4464
4465 public FMParserTokenManager token_source;
4466 SimpleCharStream jj_input_stream;
4467 public Token token, jj_nt;
4468 private int jj_ntk;
4469 private Token jj_scanpos, jj_lastpos;
4470 private int jj_la;
4471 public boolean lookingAhead = false;
4472 private boolean jj_semLA;
4473 private int jj_gen;
4474 final private int[] jj_la1 = new int[83];
4475 static private int[] jj_la1_0;
4476 static private int[] jj_la1_1;
4477 static private int[] jj_la1_2;
4478 static private int[] jj_la1_3;
4479 static private int[] jj_la1_4;
4480 static {
4481 jj_la1_0();
4482 jj_la1_1();
4483 jj_la1_2();
4484 jj_la1_3();
4485 jj_la1_4();
4486 }
4487 private static void jj_la1_0() {
4488 jj_la1_0 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x200,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x800000,0x0,0x0,0x1c000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x30000000,0x0,0x0,0x0,0x0,0x0,0x2000,0x0,0x7fffdd40,0x0,0x0,0x0,0x7fffdd40,0x7fffdd40,0x0,0x0,0x7fffdd40,0x0,0x0,0x0,0x0,0x0,};
4489 }
4490 private static void jj_la1_1() {
4491 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,0x1000,0x6,0x0,0x0,0x0,0x3000000,0x4000,0x8000,0xc00000,0x1e0000,0x0,0x0,0x0,0x0,0x70,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x180,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x200000,0x0,0xafdfe000,0x0,0x0,0x0,0xafdfe000,0xafdfe000,0x0,0x0,0xafdfe000,0x0,0x0,0x0,0x0,0x0,};
4492 }
4493 private static void jj_la1_2() {
4494 jj_la1_2 = new int[] {0xfe0000,0xfe0000,0x0,0x0,0x0,0x0,0x38000000,0xc0000000,0x600000,0x60000,0x6800000,0x0,0xc0180000,0xc0180000,0x60000,0x180000,0x0,0x0,0x0,0xfe0000,0x0,0x0,0x0,0x0,0x0,0xfe0000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000,0x0,0x0,0x0,0x0,0x0,0x0,0x8000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xfe0000,0x0,0xfe0000,0x0,0x0,0x0,0x0,0x10,0x10,0x0,0x0,0x0,0x70,0x0,0x0,0x1f0,0x1f0,0x1f0,0x1f0,0x1f0,0x10,0x0,0x6,0x0,0x0,};
4495 }
4496 private static void jj_la1_3() {
4497 jj_la1_3 = new int[] {0x10a8000,0x10a880c,0x800,0xc,0xc,0x190,0x0,0x60000003,0x0,0x1000000,0x28800,0x800,0xe00003,0x1e00033,0x0,0x0,0x5000,0x1000,0x5000,0x10a880c,0x2000,0x0,0x0,0x0,0x800000,0x10a880c,0x800000,0x0,0x0,0x0,0x0,0x0,0x0,0x1000,0x200000,0x200000,0x0,0x8200000,0x2000,0x1000000,0x0,0x20000,0x1000000,0x40,0x0,0x1000,0x40000,0x0,0x80000000,0x80000000,0x80001000,0x80000000,0x80000000,0x81000000,0x2000,0x18000000,0x40000,0x1000000,0x10a980c,0x1000,0x10a880c,0x0,0x2000,0x1000000,0x18000000,0x0,0x0,0x0,0x18000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1000000,0x0,0x1000,0x1000000,};
4498 }
4499 private static void jj_la1_4() {
4500 jj_la1_4 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1e,0x1e,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,};
4501 }
4502 final private JJCalls[] jj_2_rtns = new JJCalls[17];
4503 private boolean jj_rescan = false;
4504 private int jj_gc = 0;
4505
4506 public FMParser(InputStream stream) {
4507 jj_input_stream = new SimpleCharStream(stream, 1, 1);
4508 token_source = new FMParserTokenManager(jj_input_stream);
4509 token = new Token();
4510 jj_ntk = -1;
4511 jj_gen = 0;
4512 for (int i = 0; i < 83; i++) jj_la1[i] = -1;
4513 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
4514 }
4515
4516 public void ReInit(InputStream stream) {
4517 jj_input_stream.ReInit(stream, 1, 1);
4518 token_source.ReInit(jj_input_stream);
4519 token = new Token();
4520 jj_ntk = -1;
4521 jj_gen = 0;
4522 for (int i = 0; i < 83; i++) jj_la1[i] = -1;
4523 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
4524 }
4525
4526 public FMParser(Reader stream) {
4527 jj_input_stream = new SimpleCharStream(stream, 1, 1);
4528 token_source = new FMParserTokenManager(jj_input_stream);
4529 token = new Token();
4530 jj_ntk = -1;
4531 jj_gen = 0;
4532 for (int i = 0; i < 83; i++) jj_la1[i] = -1;
4533 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
4534 }
4535
4536 public void ReInit(Reader stream) {
4537 jj_input_stream.ReInit(stream, 1, 1);
4538 token_source.ReInit(jj_input_stream);
4539 token = new Token();
4540 jj_ntk = -1;
4541 jj_gen = 0;
4542 for (int i = 0; i < 83; i++) jj_la1[i] = -1;
4543 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
4544 }
4545
4546 public FMParser(FMParserTokenManager tm) {
4547 token_source = tm;
4548 token = new Token();
4549 jj_ntk = -1;
4550 jj_gen = 0;
4551 for (int i = 0; i < 83; i++) jj_la1[i] = -1;
4552 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
4553 }
4554
4555 public void ReInit(FMParserTokenManager tm) {
4556 token_source = tm;
4557 token = new Token();
4558 jj_ntk = -1;
4559 jj_gen = 0;
4560 for (int i = 0; i < 83; i++) jj_la1[i] = -1;
4561 for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
4562 }
4563
4564 final private Token jj_consume_token(int kind) throws ParseException {
4565 Token oldToken;
4566 if ((oldToken = token).next != null) token = token.next;
4567 else token = token.next = token_source.getNextToken();
4568 jj_ntk = -1;
4569 if (token.kind == kind) {
4570 jj_gen++;
4571 if (++jj_gc > 100) {
4572 jj_gc = 0;
4573 for (int i = 0; i < jj_2_rtns.length; i++) {
4574 JJCalls c = jj_2_rtns[i];
4575 while (c != null) {
4576 if (c.gen < jj_gen) c.first = null;
4577 c = c.next;
4578 }
4579 }
4580 }
4581 return token;
4582 }
4583 token = oldToken;
4584 jj_kind = kind;
4585 throw generateParseException();
4586 }
4587
4588 static private final class LookaheadSuccess extends Error { }
4589 static final private LookaheadSuccess jj_ls = new LookaheadSuccess();
4590 final private boolean jj_scan_token(int kind) {
4591 if (jj_scanpos == jj_lastpos) {
4592 jj_la--;
4593 if (jj_scanpos.next == null) {
4594 jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken();
4595 } else {
4596 jj_lastpos = jj_scanpos = jj_scanpos.next;
4597 }
4598 } else {
4599 jj_scanpos = jj_scanpos.next;
4600 }
4601 if (jj_rescan) {
4602 int i = 0; Token tok = token;
4603 while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; }
4604 if (tok != null) jj_add_error_token(kind, i);
4605 }
4606 if (jj_scanpos.kind != kind) return true;
4607 if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls;
4608 return false;
4609 }
4610
4611 final public Token getNextToken() {
4612 if (token.next != null) token = token.next;
4613 else token = token.next = token_source.getNextToken();
4614 jj_ntk = -1;
4615 jj_gen++;
4616 return token;
4617 }
4618
4619 final public Token getToken(int index) {
4620 Token t = lookingAhead ? jj_scanpos : token;
4621 for (int i = 0; i < index; i++) {
4622 if (t.next != null) t = t.next;
4623 else t = t.next = token_source.getNextToken();
4624 }
4625 return t;
4626 }
4627
4628 final private int jj_ntk() {
4629 if ((jj_nt=token.next) == null)
4630 return (jj_ntk = (token.next=token_source.getNextToken()).kind);
4631 else
4632 return (jj_ntk = jj_nt.kind);
4633 }
4634
4635 private Vector jj_expentries = new Vector();
4636 private int[] jj_expentry;
4637 private int jj_kind = -1;
4638 private int[] jj_lasttokens = new int[100];
4639 private int jj_endpos;
4640
4641 private void jj_add_error_token(int kind, int pos) {
4642 if (pos >= 100) return;
4643 if (pos == jj_endpos + 1) {
4644 jj_lasttokens[jj_endpos++] = kind;
4645 } else if (jj_endpos != 0) {
4646 jj_expentry = new int[jj_endpos];
4647 for (int i = 0; i < jj_endpos; i++) {
4648 jj_expentry[i] = jj_lasttokens[i];
4649 }
4650 boolean exists = false;
4651 for (Enumeration e = jj_expentries.elements(); e.hasMoreElements();) {
4652 int[] oldentry = (int[])(e.nextElement());
4653 if (oldentry.length == jj_expentry.length) {
4654 exists = true;
4655 for (int i = 0; i < jj_expentry.length; i++) {
4656 if (oldentry[i] != jj_expentry[i]) {
4657 exists = false;
4658 break;
4659 }
4660 }
4661 if (exists) break;
4662 }
4663 }
4664 if (!exists) jj_expentries.addElement(jj_expentry);
4665 if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind;
4666 }
4667 }
4668
4669 public ParseException generateParseException() {
4670 jj_expentries.removeAllElements();
4671 boolean[] la1tokens = new boolean[133];
4672 for (int i = 0; i < 133; i++) {
4673 la1tokens[i] = false;
4674 }
4675 if (jj_kind >= 0) {
4676 la1tokens[jj_kind] = true;
4677 jj_kind = -1;
4678 }
4679 for (int i = 0; i < 83; i++) {
4680 if (jj_la1[i] == jj_gen) {
4681 for (int j = 0; j < 32; j++) {
4682 if ((jj_la1_0[i] & (1<<j)) != 0) {
4683 la1tokens[j] = true;
4684 }
4685 if ((jj_la1_1[i] & (1<<j)) != 0) {
4686 la1tokens[32+j] = true;
4687 }
4688 if ((jj_la1_2[i] & (1<<j)) != 0) {
4689 la1tokens[64+j] = true;
4690 }
4691 if ((jj_la1_3[i] & (1<<j)) != 0) {
4692 la1tokens[96+j] = true;
4693 }
4694 if ((jj_la1_4[i] & (1<<j)) != 0) {
4695 la1tokens[128+j] = true;
4696 }
4697 }
4698 }
4699 }
4700 for (int i = 0; i < 133; i++) {
4701 if (la1tokens[i]) {
4702 jj_expentry = new int[1];
4703 jj_expentry[0] = i;
4704 jj_expentries.addElement(jj_expentry);
4705 }
4706 }
4707 jj_endpos = 0;
4708 jj_rescan_token();
4709 jj_add_error_token(0, 0);
4710 int[][] exptokseq = new int[jj_expentries.size()][];
4711 for (int i = 0; i < jj_expentries.size(); i++) {
4712 exptokseq[i] = (int[])jj_expentries.elementAt(i);
4713 }
4714 return new ParseException(token, exptokseq, tokenImage);
4715 }
4716
4717 final public void enable_tracing() {
4718 }
4719
4720 final public void disable_tracing() {
4721 }
4722
4723 final private void jj_rescan_token() {
4724 jj_rescan = true;
4725 for (int i = 0; i < 17; i++) {
4726 JJCalls p = jj_2_rtns[i];
4727 do {
4728 if (p.gen > jj_gen) {
4729 jj_la = p.arg; jj_lastpos = jj_scanpos = p.first;
4730 switch (i) {
4731 case 0: jj_3_1(); break;
4732 case 1: jj_3_2(); break;
4733 case 2: jj_3_3(); break;
4734 case 3: jj_3_4(); break;
4735 case 4: jj_3_5(); break;
4736 case 5: jj_3_6(); break;
4737 case 6: jj_3_7(); break;
4738 case 7: jj_3_8(); break;
4739 case 8: jj_3_9(); break;
4740 case 9: jj_3_10(); break;
4741 case 10: jj_3_11(); break;
4742 case 11: jj_3_12(); break;
4743 case 12: jj_3_13(); break;
4744 case 13: jj_3_14(); break;
4745 case 14: jj_3_15(); break;
4746 case 15: jj_3_16(); break;
4747 case 16: jj_3_17(); break;
4748 }
4749 }
4750 p = p.next;
4751 } while (p != null);
4752 }
4753 jj_rescan = false;
4754 }
4755
4756 final private void jj_save(int index, int xla) {
4757 JJCalls p = jj_2_rtns[index];
4758 while (p.gen > jj_gen) {
4759 if (p.next == null) { p = p.next = new JJCalls(); break; }
4760 p = p.next;
4761 }
4762 p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla;
4763 }
4764
4765 static final class JJCalls {
4766 int gen;
4767 Token first;
4768 int arg;
4769 JJCalls next;
4770 }
4771
4772 }