001/* Generated By:JavaCC: Do not edit this line. FMParser.java */
002package freemarker.core;
003
004import freemarker.template.Configuration;
005import freemarker.template.Template;
006import freemarker.template.TemplateBooleanModel;
007import freemarker.template.TemplateCollectionModel;
008import freemarker.template.TemplateHashModelEx;
009import freemarker.template.TemplateModel;
010import freemarker.template.TemplateModelException;
011import freemarker.template.TemplateModelIterator;
012import freemarker.template.TemplateScalarModel;
013import freemarker.template.utility.DeepUnwrap;
014import freemarker.template.utility.StringUtil;
015
016import java.io.InputStream;
017import java.io.Reader;
018import java.io.StringReader;
019import java.util.ArrayList;
020import java.util.Enumeration;
021import java.util.HashMap;
022import java.util.LinkedList;
023import java.util.Map;
024import java.util.StringTokenizer;
025import java.util.Vector;
026
027/**
028 * This class is generated by JavaCC from a grammar file.
029 */
030public class FMParser implements FMParserConstants {
031
032// Necessary for adding macros and setting location info.
033  Template template;
034  private String templateName;
035
036// variables that keep track of whether we are in a loop or a switch.
037  private int loopNesting, switchNesting;
038  private boolean inMacro, inFunction, stripWhitespace, stripText;
039  private LinkedList escapes = new LinkedList();
040  private int contentNesting; // for stripText
041
042  /**
043   * Create an FM expression parser using a string.
044   */
045  static public FMParser createExpressionParser(String s) {
046      SimpleCharStream scs = new SimpleCharStream(new StringReader(s), 1, 1, s.length());
047      FMParserTokenManager token_source = new FMParserTokenManager(scs);
048      token_source.SwitchTo(FMParserConstants.FM_EXPRESSION);
049      return new FMParser(token_source);
050  }
051
052  /**
053   * Constructs a new parser object.
054   * @param template The template associated with this parser.
055   * @param reader The character stream to use as input
056   * @param strictEscapeSyntax Whether FreeMarker directives must start with a #
057   */
058  public FMParser(Template template, Reader reader, boolean strictEscapeSyntax, boolean stripWhitespace) {
059      this(reader);
060      this.template = template;
061      token_source.strictEscapeSyntax = strictEscapeSyntax;
062      this.templateName = template != null ? template.getName() : "";
063      token_source.templateName = templateName;
064      this.stripWhitespace = stripWhitespace;
065  }
066
067  public FMParser(Template template, Reader reader, boolean strictEscapeSyntax, boolean stripWhitespace, int tagSyntax) {
068      this(template, reader, strictEscapeSyntax, stripWhitespace);
069      switch (tagSyntax) {
070          case Configuration.AUTO_DETECT_TAG_SYNTAX :
071             token_source.autodetectTagSyntax = true;
072             break;
073          case Configuration.ANGLE_BRACKET_TAG_SYNTAX :
074             token_source.altDirectiveSyntax = false;
075             break;
076          case Configuration.SQUARE_BRACKET_TAG_SYNTAX :
077             token_source.altDirectiveSyntax = true;
078             break;
079          default : throw new IllegalArgumentException("Illegal argument for tagSyntax");
080      }
081  }
082
083  public FMParser(String template) {
084      this(null, new StringReader(template), true, true);
085  }
086
087  private String getErrorStart(Token t) {
088      return "Error in template: " + template.getName()
089            + "\non line " + t.beginLine + ", column " + t.beginColumn;
090  }
091
092  /**
093   * Throw an exception if the expression passed in is a String
094   * Literal
095   */
096  private void notStringLiteral(Expression exp, String expected) throws ParseException {
097      if (exp instanceof StringLiteral) {
098         String msg = "Error " + exp.getStartLocation()
099                     + "\nFound string literal: " + exp
100                     + "\nExpecting: " + expected;
101         throw new ParseException(msg, exp);
102      }
103  }
104
105  /**
106   * Throw an exception if the expression passed in is a Number
107   * Literal
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   * Throw an exception if the expression passed in is a boolean
120   * Literal
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   * Throw an exception if the expression passed in is a Hash
133   * Literal
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   * Throw an exception if the expression passed in is a List
146   * Literal
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   * Throw an exception if the expression passed in is a literal
161   * other than of the numerical type
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   * Throw an exception if the expression passed in is
172   * not a string.
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   * Throw an exception if the expression passed in is a literal
183   * other than of the boolean type
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// Now the actual parsing code, starting
228// with the productions for FreeMarker's
229// expression syntax.
230
231/**
232 * This is the same as OrExpression, since
233 * the OR is the operator with the lowest
234 * precedence.
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 * Lowest level expression, a literal, a variable,
245 * or a possibly more complex expression bounded
246 * by parentheses.
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 * A primary expression preceded by zero or
310 * more unary operators. (The only unary operator we
311 * currently have is the NOT.)
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           // plus is treated separately, since it is also
428           // used for concatenation.
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 * A unary expression followed by zero or more
447 * unary expressions with operators in between.
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 * Production that builds up an expression
727 * using the dot or dynamic key name
728 * or the args list if this is a method invocation.
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 * production for when a key is specified by <DOT> + keyname
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 * production for when the key is specified
898 * in brackets.
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 * production for an arglist part of a method invocation.
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       // Get rid of the quotes.
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 * A production representing the ${...}
1072 * that outputs a variable.
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;  // -1 indicates that the value has not been set
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) {// sanity check
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 {  // if format != null
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 * Production used to break out of a loop or a switch block.
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 * Production used to jump out of a macro.
1419 * The stop instruction terminates the rendering of the template.
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 * Production to terminate potentially empty elements. Either a ">" or "/>"
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 * A production for FreeMarker directives.
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 * Production for a block of raw text
2491 * i.e. text that contains no
2492 * FreeMarker directives.
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 * Production for dealing with unparsed content,
2535 * i.e. what is inside a comment or noparse tag.
2536 * It returns the ending token. The content
2537 * of the tag is put in buf.
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 * A production freemarker text that may contain
2705 * ${...} and #{...} but no directives.
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 * A production for a block of optional content.
2753 * Returns an empty Text block if there is no
2754 * content.
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      // has no effect but to get rid of a spurious warning.
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 * Root production to be used when parsing
2966 * an entire file.
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}