/* Generated By:JavaCC: Do not edit this line. FMParserWS.java */ package freemarker.core; import freemarker.template.*; import freemarker.template.utility.StringUtil; import freemarker.template.utility.DeepUnwrap; import java.io.*; import java.util.*; /** * This class is generated by JavaCC from a grammar file. */ @SuppressWarnings({"deprecation", "rawtypes", "unchecked", "static"}) public class FMParserWS implements FMParserConstants { private static final int ITERATOR_BLOCK_KIND_LIST = 0; private static final int ITERATOR_BLOCK_KIND_FOREACH = 1; private static final int ITERATOR_BLOCK_KIND_ITEMS = 2; private static final int ITERATOR_BLOCK_KIND_USER_DIRECTIVE = 3; private static class ParserIteratorBlockContext { private String loopVarName; private int kind; } /** Necessary for adding macros and setting location info. */ private Template template; private boolean stripWhitespace, stripText; /** Keeps track of #list and #foreach nesting. */ private List/*<ParserIteratorBlockContext>*/ iteratorBlockContexts; /** * Keeps track of the nesting depth of directives that support #break. */ private int breakableDirectiveNesting; /** * Keeps track of the flags of the innermost parent #list or #foreach directive. */ private int parentListAndForeachFlags; private boolean inMacro, inFunction; private LinkedList escapes = new LinkedList(); private int mixedContentNesting; // for stripText private int incompatibleImprovements; /** * Create an FM expression parser using a string. * * @Deprecated This is an internal API of FreeMarker; can be removed any time. */ static public FMParserWS createExpressionParser(String s) { SimpleCharStream scs = new SimpleCharStream(new StringReader(s), 1, 1, s.length()); FMParserWSTokenManager token_source = new FMParserWSTokenManager(scs); token_source.SwitchTo(FMParserConstants.FM_EXPRESSION); FMParserWS parser = new FMParserWS(token_source); token_source.setParser(parser); return parser; } /** * Constructs a new parser object. * * @param template * The template associated with this parser. * @param reader * The character stream to use as input * @param strictEscapeSyntax * Whether FreeMarker directives must start with a # * * @Deprecated This is an internal API of FreeMarker; will be removed in 2.4. */ public FMParserWS(Template template, Reader reader, boolean strictEscapeSyntax, boolean stripWhitespace) { this(reader); setTemplate(template); token_source.setParser(this); token_source.strictEscapeSyntax = strictEscapeSyntax; this.stripWhitespace = stripWhitespace; } /** * @Deprecated This is an internal API of FreeMarker; will be changed in 2.4. */ public FMParserWS(Template template, Reader reader, boolean strictEscapeSyntax, boolean stripWhitespace, int tagSyntax) { this(template, reader, strictEscapeSyntax, stripWhitespace, tagSyntax, Configuration.PARSED_DEFAULT_INCOMPATIBLE_ENHANCEMENTS); } /** * @Deprecated This is an internal API of FreeMarker; will be changed in 2.4. */ public FMParserWS(Template template, Reader reader, boolean strictEscapeSyntax, boolean stripWhitespace, int tagSyntax, int incompatibleImprovements) { this(template, reader, strictEscapeSyntax, stripWhitespace, tagSyntax, Configuration.AUTO_DETECT_NAMING_CONVENTION, incompatibleImprovements); } /** * @Deprecated This is an internal API of FreeMarker; will be changed in 2.4. */ public FMParserWS(Template template, Reader reader, boolean strictEscapeSyntax, boolean stripWhitespace, int tagSyntax, int namingConvention, int incompatibleImprovements) { this(template, reader, strictEscapeSyntax, stripWhitespace); switch (tagSyntax) { case Configuration.AUTO_DETECT_TAG_SYNTAX: token_source.autodetectTagSyntax = true; break; case Configuration.ANGLE_BRACKET_TAG_SYNTAX: token_source.squBracTagSyntax = false; break; case Configuration.SQUARE_BRACKET_TAG_SYNTAX: token_source.squBracTagSyntax = true; break; default: throw new IllegalArgumentException("Illegal argument for tagSyntax"); } switch (namingConvention) { case Configuration.AUTO_DETECT_NAMING_CONVENTION: case Configuration.CAMEL_CASE_NAMING_CONVENTION: case Configuration.LEGACY_NAMING_CONVENTION: token_source.initialNamingConvention = namingConvention; token_source.namingConvention = namingConvention; break; default: throw new IllegalArgumentException("Illegal argument for namingConvention"); } token_source.incompatibleImprovements = incompatibleImprovements; this.incompatibleImprovements = incompatibleImprovements; } /** * @Deprecated This is an internal API of FreeMarker; will be changed in 2.4. */ public FMParserWS(String template) { this(null, new StringReader(template), true, true); } void setTemplate(Template template) { this.template = template; } Template getTemplate() { return template; } /** * Don't use it, unless you are developing FreeMarker itself. */ public int _getLastTagSyntax() { return token_source.squBracTagSyntax ? Configuration.SQUARE_BRACKET_TAG_SYNTAX : Configuration.ANGLE_BRACKET_TAG_SYNTAX; } /** * Don't use it, unless you are developing FreeMarker itself. * The naming convention used by this template; if it couldn't be detected so far, it will be the most probable one. * This could be used for formatting error messages, but not for anything serious. */ public int _getLastNamingConvention() { return token_source.namingConvention; } /** * Throw an exception if the expression passed in is a String Literal */ private void notStringLiteral(Expression exp, String expected) throws ParseException { if (exp instanceof StringLiteral) { throw new ParseException( "Found string literal: " + exp + ". Expecting: " + expected, exp); } } /** * Throw an exception if the expression passed in is a Number Literal */ private void notNumberLiteral(Expression exp, String expected) throws ParseException { if (exp instanceof NumberLiteral) { throw new ParseException( "Found number literal: " + exp.getCanonicalForm() + ". Expecting " + expected, exp); } } /** * Throw an exception if the expression passed in is a boolean Literal */ private void notBooleanLiteral(Expression exp, String expected) throws ParseException { if (exp instanceof BooleanLiteral) { throw new ParseException("Found: " + exp.getCanonicalForm() + ". Expecting " + expected, exp); } } /** * Throw an exception if the expression passed in is a Hash Literal */ private void notHashLiteral(Expression exp, String expected) throws ParseException { if (exp instanceof HashLiteral) { throw new ParseException( "Found hash literal: " + exp.getCanonicalForm() + ". Expecting " + expected, exp); } } /** * Throw an exception if the expression passed in is a List Literal */ private void notListLiteral(Expression exp, String expected) throws ParseException { if (exp instanceof ListLiteral) { throw new ParseException( "Found list literal: " + exp.getCanonicalForm() + ". Expecting " + expected, exp); } } /** * Throw an exception if the expression passed in is a literal other than of the numerical type */ private void numberLiteralOnly(Expression exp) throws ParseException { notStringLiteral(exp, "number"); notListLiteral(exp, "number"); notHashLiteral(exp, "number"); notBooleanLiteral(exp, "number"); } /** * Throw an exception if the expression passed in is not a string. */ private void stringLiteralOnly(Expression exp) throws ParseException { notNumberLiteral(exp, "string"); notListLiteral(exp, "string"); notHashLiteral(exp, "string"); notBooleanLiteral(exp, "string"); } /** * Throw an exception if the expression passed in is a literal other than of the boolean type */ private void booleanLiteralOnly(Expression exp) throws ParseException { notStringLiteral(exp, "boolean (true/false)"); notListLiteral(exp, "boolean (true/false)"); notHashLiteral(exp, "boolean (true/false)"); notNumberLiteral(exp, "boolean (true/false)"); } private Expression escapedExpression(Expression exp) { if (!escapes.isEmpty()) { return ((EscapeBlock) escapes.getFirst()).doEscape(exp); } else { return exp; } } private boolean getBoolean(Expression exp) throws ParseException { TemplateModel tm = null; try { tm = exp.eval(null); } catch (Exception e) { throw new ParseException(e.getMessage() + "\nCould not evaluate expression: " + exp.getCanonicalForm(), exp, e); } if (tm instanceof TemplateBooleanModel) { try { return ((TemplateBooleanModel) tm).getAsBoolean(); } catch (TemplateModelException tme) { } } if (tm instanceof TemplateScalarModel) { try { return StringUtil.getYesNo(((TemplateScalarModel) tm).getAsString()); } catch (Exception e) { throw new ParseException(e.getMessage() + "\nExpecting boolean (true/false), found: " + exp.getCanonicalForm(), exp); } } throw new ParseException("Expecting boolean (true/false) parameter", exp); } private ParserIteratorBlockContext pushIteratorBlockContext() { if (iteratorBlockContexts == null) { iteratorBlockContexts = new ArrayList(4); } ParserIteratorBlockContext newCtx = new ParserIteratorBlockContext(); iteratorBlockContexts.add(newCtx); return newCtx; } private void popIteratorBlockContext() { iteratorBlockContexts.remove(iteratorBlockContexts.size() - 1); } private ParserIteratorBlockContext peekIteratorBlockContext() { int size = iteratorBlockContexts != null ? iteratorBlockContexts.size() : 0; return size != 0 ? (ParserIteratorBlockContext) iteratorBlockContexts.get(size - 1) : null; } private void checkLoopVariableBuiltInLHO(String loopVarName, Expression lhoExp, Token biName) throws ParseException { int size = iteratorBlockContexts != null ? iteratorBlockContexts.size() : 0; for (int i = size - 1; i >= 0; i--) { ParserIteratorBlockContext ctx = (ParserIteratorBlockContext) iteratorBlockContexts.get(i); if (loopVarName.equals(ctx.loopVarName)) { if (ctx.kind == ITERATOR_BLOCK_KIND_USER_DIRECTIVE) { throw new ParseException( "The left hand operand of ?" + biName.image + " can't be the loop variable of an user defined directive: " + loopVarName, lhoExp); } return; // success } } throw new ParseException( "The left hand operand of ?" + biName.image + " must be a loop variable, " + "but there's no loop variable in scope with this name: " + loopVarName, lhoExp); } private String forEachDirectiveSymbol() { // [2.4] Use camel case as the default return token_source.namingConvention == Configuration.CAMEL_CASE_NAMING_CONVENTION ? "#forEach" : "#foreach"; } // Now the actual parsing code, starting // with the productions for FreeMarker's // expression syntax. /** * This is the same as OrExpression, since * the OR is the operator with the lowest * precedence. */ final public Expression Expression() throws ParseException { Expression exp; exp = OrExpression(); {if (true) return exp;} throw new Error("Missing return statement in function"); } /** * Lowest level expression, a literal, a variable, * or a possibly more complex expression bounded * by parentheses. */ final public Expression PrimaryExpression() throws ParseException { Expression exp; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case INTEGER: case DECIMAL: exp = NumberLiteral(); break; case OPENING_CURLY_BRACKET: exp = HashLiteral(); break; case STRING_LITERAL: case RAW_STRING: exp = StringLiteral(true); break; case FALSE: case TRUE: exp = BooleanLiteral(); break; case OPEN_BRACKET: exp = ListLiteral(); break; case ID: exp = Identifier(); break; case OPEN_PAREN: exp = Parenthesis(); break; case DOT: exp = BuiltinVariable(); break; default: jj_la1[0] = jj_gen; jj_consume_token(-1); throw new ParseException(); } label_1: while (true) { if (jj_2_1(2147483647)) { ; } else { break label_1; } exp = AddSubExpression(exp); } {if (true) return exp;} throw new Error("Missing return statement in function"); } final public Expression Parenthesis() throws ParseException { Expression exp, result; Token start, end; start = jj_consume_token(OPEN_PAREN); exp = Expression(); end = jj_consume_token(CLOSE_PAREN); result = new ParentheticalExpression(exp); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } /** * A primary expression preceded by zero or * more unary operators. (The only unary operator we * currently have is the NOT.) */ final public Expression UnaryExpression() throws ParseException { Expression exp, result; boolean haveNot = false; Token t = null, start = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PLUS: case MINUS: result = UnaryPlusMinusExpression(); break; case EXCLAM: result = NotExpression(); break; case STRING_LITERAL: case RAW_STRING: case FALSE: case TRUE: case INTEGER: case DECIMAL: case DOT: case OPEN_BRACKET: case OPEN_PAREN: case OPENING_CURLY_BRACKET: case ID: result = PrimaryExpression(); break; default: jj_la1[1] = jj_gen; jj_consume_token(-1); throw new ParseException(); } {if (true) return result;} throw new Error("Missing return statement in function"); } final public Expression NotExpression() throws ParseException { Token t; Expression exp, result = null; ArrayList nots = new ArrayList(); label_2: while (true) { t = jj_consume_token(EXCLAM); nots.add(t); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case EXCLAM: ; break; default: jj_la1[2] = jj_gen; break label_2; } } exp = PrimaryExpression(); for (int i = 0; i < nots.size(); i++) { result = new NotExpression(exp); Token tok = (Token) nots.get(nots.size() -i -1); result.setLocation(template, tok, exp); exp = result; } {if (true) return result;} throw new Error("Missing return statement in function"); } final public Expression UnaryPlusMinusExpression() throws ParseException { Expression exp, result; boolean isMinus = false; Token t; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PLUS: t = jj_consume_token(PLUS); break; case MINUS: t = jj_consume_token(MINUS); isMinus = true; break; default: jj_la1[3] = jj_gen; jj_consume_token(-1); throw new ParseException(); } exp = PrimaryExpression(); result = new UnaryPlusMinusExpression(exp, isMinus); result.setLocation(template, t, exp); {if (true) return result;} throw new Error("Missing return statement in function"); } final public Expression AdditiveExpression() throws ParseException { Expression lhs, rhs, result; boolean plus; lhs = MultiplicativeExpression(); result = lhs; label_3: while (true) { if (jj_2_2(2147483647)) { ; } else { break label_3; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PLUS: jj_consume_token(PLUS); plus = true; break; case MINUS: jj_consume_token(MINUS); plus = false; break; default: jj_la1[4] = jj_gen; jj_consume_token(-1); throw new ParseException(); } rhs = MultiplicativeExpression(); if (plus) { // plus is treated separately, since it is also // used for concatenation. result = new AddConcatExpression(lhs, rhs); } else { numberLiteralOnly(lhs); numberLiteralOnly(rhs); result = new ArithmeticExpression(lhs, rhs, ArithmeticExpression.TYPE_SUBSTRACTION); } result.setLocation(template, lhs, rhs); lhs = result; } {if (true) return result;} throw new Error("Missing return statement in function"); } /** * A unary expression followed by zero or more * unary expressions with operators in between. */ final public Expression MultiplicativeExpression() throws ParseException { Expression lhs, rhs, result; int operation = ArithmeticExpression.TYPE_MULTIPLICATION; lhs = UnaryExpression(); result = lhs; label_4: while (true) { if (jj_2_3(2147483647)) { ; } else { break label_4; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case TIMES: jj_consume_token(TIMES); operation = ArithmeticExpression.TYPE_MULTIPLICATION; break; case DIVIDE: jj_consume_token(DIVIDE); operation = ArithmeticExpression.TYPE_DIVISION; break; case PERCENT: jj_consume_token(PERCENT); operation = ArithmeticExpression.TYPE_MODULO; break; default: jj_la1[5] = jj_gen; jj_consume_token(-1); throw new ParseException(); } rhs = UnaryExpression(); numberLiteralOnly(lhs); numberLiteralOnly(rhs); result = new ArithmeticExpression(lhs, rhs, operation); result.setLocation(template, lhs, rhs); lhs = result; } {if (true) return result;} throw new Error("Missing return statement in function"); } final public Expression EqualityExpression() throws ParseException { Expression lhs, rhs, result; Token t; lhs = RelationalExpression(); result = lhs; if (jj_2_4(2147483647)) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case NOT_EQUALS: t = jj_consume_token(NOT_EQUALS); break; case EQUALS: t = jj_consume_token(EQUALS); break; case DOUBLE_EQUALS: t = jj_consume_token(DOUBLE_EQUALS); break; default: jj_la1[6] = jj_gen; jj_consume_token(-1); throw new ParseException(); } rhs = RelationalExpression(); notHashLiteral(lhs, "scalar"); notHashLiteral(rhs, "scalar"); notListLiteral(lhs, "scalar"); notListLiteral(rhs, "scalar"); result = new ComparisonExpression(lhs, rhs, t.image); result.setLocation(template, lhs, rhs); } else { ; } {if (true) return result;} throw new Error("Missing return statement in function"); } final public Expression RelationalExpression() throws ParseException { Expression lhs, rhs, result; Token t; lhs = RangeExpression(); result = lhs; if (jj_2_5(2147483647)) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case NATURAL_GTE: t = jj_consume_token(NATURAL_GTE); break; case ESCAPED_GTE: t = jj_consume_token(ESCAPED_GTE); break; case NATURAL_GT: t = jj_consume_token(NATURAL_GT); break; case ESCAPED_GT: t = jj_consume_token(ESCAPED_GT); break; case LESS_THAN_EQUALS: t = jj_consume_token(LESS_THAN_EQUALS); break; case LESS_THAN: t = jj_consume_token(LESS_THAN); break; default: jj_la1[7] = jj_gen; jj_consume_token(-1); throw new ParseException(); } rhs = RangeExpression(); notHashLiteral(lhs, "scalar"); notHashLiteral(rhs, "scalar"); notListLiteral(lhs, "scalar"); notListLiteral(rhs, "scalar"); notStringLiteral(lhs, "number"); notStringLiteral(rhs, "number"); result = new ComparisonExpression(lhs, rhs, t.image); result.setLocation(template, lhs, rhs); } else { ; } {if (true) return result;} throw new Error("Missing return statement in function"); } final public Expression RangeExpression() throws ParseException { Expression lhs, rhs = null, result; int endType; Token dotDot = null; lhs = AdditiveExpression(); result = lhs; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DOT_DOT: case DOT_DOT_LESS: case DOT_DOT_ASTERISK: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DOT_DOT_LESS: case DOT_DOT_ASTERISK: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DOT_DOT_LESS: jj_consume_token(DOT_DOT_LESS); endType = Range.END_EXCLUSIVE; break; case DOT_DOT_ASTERISK: jj_consume_token(DOT_DOT_ASTERISK); endType = Range.END_SIZE_LIMITED; break; default: jj_la1[8] = jj_gen; jj_consume_token(-1); throw new ParseException(); } rhs = AdditiveExpression(); break; case DOT_DOT: dotDot = jj_consume_token(DOT_DOT); endType = Range.END_UNBOUND; if (jj_2_6(2147483647)) { rhs = AdditiveExpression(); endType = Range.END_INCLUSIVE; } else { ; } break; default: jj_la1[9] = jj_gen; jj_consume_token(-1); throw new ParseException(); } numberLiteralOnly(lhs); if (rhs != null) { numberLiteralOnly(rhs); } Range range = new Range(lhs, rhs, endType); if (rhs != null) { range.setLocation(template, lhs, rhs); } else { range.setLocation(template, lhs, dotDot); } result = range; break; default: jj_la1[10] = jj_gen; ; } {if (true) return result;} throw new Error("Missing return statement in function"); } final public Expression AndExpression() throws ParseException { Expression lhs, rhs, result; lhs = EqualityExpression(); result = lhs; label_5: while (true) { if (jj_2_7(2147483647)) { ; } else { break label_5; } jj_consume_token(AND); rhs = EqualityExpression(); booleanLiteralOnly(lhs); booleanLiteralOnly(rhs); result = new AndExpression(lhs, rhs); result.setLocation(template, lhs, rhs); lhs = result; } {if (true) return result;} throw new Error("Missing return statement in function"); } final public Expression OrExpression() throws ParseException { Expression lhs, rhs, result; lhs = AndExpression(); result = lhs; label_6: while (true) { if (jj_2_8(2147483647)) { ; } else { break label_6; } jj_consume_token(OR); rhs = AndExpression(); booleanLiteralOnly(lhs); booleanLiteralOnly(rhs); result = new OrExpression(lhs, rhs); result.setLocation(template, lhs, rhs); lhs = result; } {if (true) return result;} throw new Error("Missing return statement in function"); } final public ListLiteral ListLiteral() throws ParseException { ArrayList values = new ArrayList(); Token begin, end; begin = jj_consume_token(OPEN_BRACKET); values = PositionalArgs(); end = jj_consume_token(CLOSE_BRACKET); ListLiteral result = new ListLiteral(values); result.setLocation(template, begin, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public Expression NumberLiteral() throws ParseException { Token op = null, t; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case INTEGER: t = jj_consume_token(INTEGER); break; case DECIMAL: t = jj_consume_token(DECIMAL); break; default: jj_la1[11] = jj_gen; jj_consume_token(-1); throw new ParseException(); } String s = t.image; Expression result = new NumberLiteral(template.getArithmeticEngine().toNumber(s)); Token startToken = (op != null) ? op : t; result.setLocation(template, startToken, t); {if (true) return result;} throw new Error("Missing return statement in function"); } final public Identifier Identifier() throws ParseException { Token t; t = jj_consume_token(ID); Identifier id = new Identifier(t.image); id.setLocation(template, t, t); {if (true) return id;} throw new Error("Missing return statement in function"); } final public Expression IdentifierOrStringLiteral() throws ParseException { Expression exp; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ID: exp = Identifier(); break; case STRING_LITERAL: case RAW_STRING: exp = StringLiteral(false); break; default: jj_la1[12] = jj_gen; jj_consume_token(-1); throw new ParseException(); } {if (true) return exp;} throw new Error("Missing return statement in function"); } final public BuiltinVariable BuiltinVariable() throws ParseException { Token dot, name; dot = jj_consume_token(DOT); name = jj_consume_token(ID); BuiltinVariable result = null; token_source.checkNamingConvention(name); result = new BuiltinVariable(name, token_source); result.setLocation(template, dot, name); {if (true) return result;} throw new Error("Missing return statement in function"); } /** * Production that builds up an expression * using the dot or dynamic key name * or the args list if this is a method invocation. */ final public Expression AddSubExpression(Expression exp) throws ParseException { Expression result = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DOT: result = DotVariable(exp); break; case OPEN_BRACKET: result = DynamicKey(exp); break; case OPEN_PAREN: result = MethodArgs(exp); break; case BUILT_IN: result = BuiltIn(exp); break; case EXCLAM: case TERMINATING_EXCLAM: result = DefaultTo(exp); break; case EXISTS: result = Exists(exp); break; default: jj_la1[13] = jj_gen; jj_consume_token(-1); throw new ParseException(); } {if (true) return result;} throw new Error("Missing return statement in function"); } final public Expression DefaultTo(Expression exp) throws ParseException { Expression rhs = null; Token t; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case TERMINATING_EXCLAM: t = jj_consume_token(TERMINATING_EXCLAM); break; case EXCLAM: t = jj_consume_token(EXCLAM); if (jj_2_9(2147483647)) { rhs = Expression(); } else { ; } break; default: jj_la1[14] = jj_gen; jj_consume_token(-1); throw new ParseException(); } DefaultToExpression result = new DefaultToExpression(exp, rhs); if (rhs == null) { result.setLocation(template, exp, t); } else { result.setLocation(template, exp, rhs); } {if (true) return result;} throw new Error("Missing return statement in function"); } final public Expression Exists(Expression exp) throws ParseException { Token t; t = jj_consume_token(EXISTS); ExistsExpression result = new ExistsExpression(exp); result.setLocation(template, exp, t); {if (true) return result;} throw new Error("Missing return statement in function"); } final public Expression BuiltIn(Expression lhoExp) throws ParseException { Token t = null; BuiltIn result; ArrayList/*<Expression>*/ args = null; Token openParen; Token closeParen; jj_consume_token(BUILT_IN); t = jj_consume_token(ID); token_source.checkNamingConvention(t); result = BuiltIn.newBuiltIn(incompatibleImprovements, lhoExp, t, token_source); result.setLocation(template, lhoExp, t); if (!(result instanceof SpecialBuiltIn)) { {if (true) return result;} } if (result instanceof BuiltInForLoopVariable) { if (!(lhoExp instanceof Identifier)) { {if (true) throw new ParseException( "Expression used as the left hand operand of ?" + t.image + " must be a simple loop variable name.", lhoExp);} } String loopVarName = ((Identifier) lhoExp).getName(); checkLoopVariableBuiltInLHO(loopVarName, lhoExp, t); ((BuiltInForLoopVariable) result).bindToLoopVariable(loopVarName); {if (true) return result;} } if (result instanceof BuiltInWithParseTimeParameters) { openParen = jj_consume_token(OPEN_PAREN); args = PositionalArgs(); closeParen = jj_consume_token(CLOSE_PAREN); result.setLocation(template, lhoExp, closeParen); ((BuiltInWithParseTimeParameters) result).bindToParameters(args, openParen, closeParen); {if (true) return result;} } else { ; } // Should have already return-ed {if (true) throw new AssertionError("Unhandled " + SpecialBuiltIn.class.getName() + " subclass: " + result.getClass());} throw new Error("Missing return statement in function"); } /** * production for when a key is specified by <DOT> + keyname */ final public Expression DotVariable(Expression exp) throws ParseException { Token t; jj_consume_token(DOT); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ID: t = jj_consume_token(ID); break; case TIMES: t = jj_consume_token(TIMES); break; case DOUBLE_STAR: t = jj_consume_token(DOUBLE_STAR); break; case FALSE: case TRUE: case LESS_THAN: case LESS_THAN_EQUALS: case ESCAPED_GT: case ESCAPED_GTE: case IN: case AS: case USING: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case LESS_THAN: t = jj_consume_token(LESS_THAN); break; case LESS_THAN_EQUALS: t = jj_consume_token(LESS_THAN_EQUALS); break; case ESCAPED_GT: t = jj_consume_token(ESCAPED_GT); break; case ESCAPED_GTE: t = jj_consume_token(ESCAPED_GTE); break; case FALSE: t = jj_consume_token(FALSE); break; case TRUE: t = jj_consume_token(TRUE); break; case IN: t = jj_consume_token(IN); break; case AS: t = jj_consume_token(AS); break; case USING: t = jj_consume_token(USING); break; default: jj_la1[15] = jj_gen; jj_consume_token(-1); throw new ParseException(); } if (!Character.isLetter(t.image.charAt(0))) { {if (true) throw new ParseException(t.image + " is not a valid identifier.", template, t);} } break; default: jj_la1[16] = jj_gen; jj_consume_token(-1); throw new ParseException(); } notListLiteral(exp, "hash"); notStringLiteral(exp, "hash"); notBooleanLiteral(exp, "hash"); Dot dot = new Dot(exp, t.image); dot.setLocation(template, exp, t); {if (true) return dot;} throw new Error("Missing return statement in function"); } /** * production for when the key is specified * in brackets. */ final public Expression DynamicKey(Expression exp) throws ParseException { Expression arg; Token t; jj_consume_token(OPEN_BRACKET); arg = Expression(); t = jj_consume_token(CLOSE_BRACKET); notBooleanLiteral(exp, "list or hash"); notNumberLiteral(exp, "list or hash"); DynamicKeyName dkn = new DynamicKeyName(exp, arg); dkn.setLocation(template, exp, t); {if (true) return dkn;} throw new Error("Missing return statement in function"); } /** * production for an arglist part of a method invocation. */ final public MethodCall MethodArgs(Expression exp) throws ParseException { ArrayList args = new ArrayList(); Token end; jj_consume_token(OPEN_PAREN); args = PositionalArgs(); end = jj_consume_token(CLOSE_PAREN); args.trimToSize(); MethodCall result = new MethodCall(exp, args); result.setLocation(template, exp, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public StringLiteral StringLiteral(boolean interpolate) throws ParseException { Token t; boolean raw = false; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STRING_LITERAL: t = jj_consume_token(STRING_LITERAL); break; case RAW_STRING: t = jj_consume_token(RAW_STRING); raw = true; break; default: jj_la1[17] = jj_gen; jj_consume_token(-1); throw new ParseException(); } String s = t.image; // Get rid of the quotes. s = s.substring(1, s.length() -1); if (raw) { s = s.substring(1); } else try { s = StringUtil.FTLStringLiteralDec(s); } catch (ParseException pe) { pe.lineNumber = t.beginLine; pe.columnNumber = t.beginColumn; pe.endLineNumber = t.endLine; pe.endColumnNumber = t.endColumn; {if (true) throw pe;} } StringLiteral result = new StringLiteral(s); result.setLocation(template, t, t); if (interpolate && !raw) { // TODO: This logic is broken. It can't handle literals that contains both ${...} and $\{...}. if (t.image.indexOf("${") >= 0 || t.image.indexOf("#{") >= 0) result.parseValue(token_source); } {if (true) return result;} throw new Error("Missing return statement in function"); } final public Expression BooleanLiteral() throws ParseException { Token t; Expression result; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case FALSE: t = jj_consume_token(FALSE); result = new BooleanLiteral(false); break; case TRUE: t = jj_consume_token(TRUE); result = new BooleanLiteral(true); break; default: jj_la1[18] = jj_gen; jj_consume_token(-1); throw new ParseException(); } result.setLocation(template, t, t); {if (true) return result;} throw new Error("Missing return statement in function"); } final public HashLiteral HashLiteral() throws ParseException { Token begin, end; Expression key, value; ArrayList keys = new ArrayList(); ArrayList values = new ArrayList(); begin = jj_consume_token(OPENING_CURLY_BRACKET); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STRING_LITERAL: case RAW_STRING: case FALSE: case TRUE: case INTEGER: case DECIMAL: case DOT: case PLUS: case MINUS: case EXCLAM: case OPEN_BRACKET: case OPEN_PAREN: case OPENING_CURLY_BRACKET: case ID: key = Expression(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: jj_consume_token(COMMA); break; case COLON: jj_consume_token(COLON); break; default: jj_la1[19] = jj_gen; jj_consume_token(-1); throw new ParseException(); } value = Expression(); stringLiteralOnly(key); keys.add(key); values.add(value); label_7: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: ; break; default: jj_la1[20] = jj_gen; break label_7; } jj_consume_token(COMMA); key = Expression(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: jj_consume_token(COMMA); break; case COLON: jj_consume_token(COLON); break; default: jj_la1[21] = jj_gen; jj_consume_token(-1); throw new ParseException(); } value = Expression(); stringLiteralOnly(key); keys.add(key); values.add(value); } break; default: jj_la1[22] = jj_gen; ; } end = jj_consume_token(CLOSING_CURLY_BRACKET); HashLiteral result = new HashLiteral(keys, values); result.setLocation(template, begin, end); {if (true) return result;} throw new Error("Missing return statement in function"); } /** * A production representing the ${...} * that outputs a variable. */ final public DollarVariable StringOutput() throws ParseException { Expression exp; Token begin, end; begin = jj_consume_token(DOLLAR_INTERPOLATION_OPENING); exp = Expression(); notHashLiteral(exp, NonStringException.STRING_COERCABLE_TYPES_DESC); notListLiteral(exp, NonStringException.STRING_COERCABLE_TYPES_DESC); end = jj_consume_token(CLOSING_CURLY_BRACKET); DollarVariable result = new DollarVariable(exp, escapedExpression(exp)); result.setLocation(template, begin, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public NumericalOutput NumericalOutput() throws ParseException { Expression exp; Token fmt = null, begin, end; begin = jj_consume_token(HASH_INTERPOLATION_OPENING); exp = Expression(); numberLiteralOnly(exp); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case SEMICOLON: jj_consume_token(SEMICOLON); fmt = jj_consume_token(ID); break; default: jj_la1[23] = jj_gen; ; } end = jj_consume_token(CLOSING_CURLY_BRACKET); NumericalOutput result; if (fmt != null) { int minFrac = -1; // -1 indicates that the value has not been set int maxFrac = -1; StringTokenizer st = new StringTokenizer(fmt.image, "mM", true); char type = '-'; while (st.hasMoreTokens()) { String token = st.nextToken(); try { if (type != '-') { switch (type) { case 'm': if (minFrac != -1) {if (true) throw new ParseException("Invalid formatting string", template, fmt);} minFrac = Integer.parseInt(token); break; case 'M': if (maxFrac != -1) {if (true) throw new ParseException("Invalid formatting string", template, fmt);} maxFrac = Integer.parseInt(token); break; default: {if (true) throw new ParseException("Invalid formatting string", template, fmt);} } type = '-'; } else if (token.equals("m")) { type = 'm'; } else if (token.equals("M")) { type = 'M'; } else { {if (true) throw new ParseException();} } } catch (ParseException e) { {if (true) throw new ParseException("Invalid format specifier " + fmt.image, template, fmt);} } catch (NumberFormatException e) { {if (true) throw new ParseException("Invalid number in the format specifier " + fmt.image, template, fmt);} } } if (maxFrac == -1) { if (minFrac == -1) { {if (true) throw new ParseException( "Invalid format specification, at least one of m and M must be specified!", template, fmt);} } maxFrac = minFrac; } else if (minFrac == -1) { minFrac = 0; } if (minFrac > maxFrac) { {if (true) throw new ParseException( "Invalid format specification, min cannot be greater than max!", template, fmt);} } if (minFrac > 50 || maxFrac > 50) {// sanity check {if (true) throw new ParseException("Cannot specify more than 50 fraction digits", template, fmt);} } result = new NumericalOutput(exp, minFrac, maxFrac); } else { // if format != null result = new NumericalOutput(exp); } result.setLocation(template, begin, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public TemplateElement If() throws ParseException { Token start, end, t; Expression condition; TemplateElement block; IfBlock ifBlock; ConditionalBlock cblock; start = jj_consume_token(IF); condition = Expression(); jj_consume_token(DIRECTIVE_END); block = OptionalBlock(); cblock = new ConditionalBlock(condition, block, ConditionalBlock.TYPE_IF); cblock.setLocation(template, start, block); ifBlock = new IfBlock(cblock); label_8: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ELSE_IF: ; break; default: jj_la1[24] = jj_gen; break label_8; } t = jj_consume_token(ELSE_IF); condition = Expression(); LooseDirectiveEnd(); block = OptionalBlock(); cblock = new ConditionalBlock(condition, block, ConditionalBlock.TYPE_ELSE_IF); cblock.setLocation(template, t, block); ifBlock.addBlock(cblock); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ELSE: t = jj_consume_token(ELSE); block = OptionalBlock(); cblock = new ConditionalBlock(null, block, ConditionalBlock.TYPE_ELSE); cblock.setLocation(template, t, block); ifBlock.addBlock(cblock); break; default: jj_la1[25] = jj_gen; ; } end = jj_consume_token(END_IF); ifBlock.setLocation(template, start, end); {if (true) return ifBlock;} throw new Error("Missing return statement in function"); } final public AttemptBlock Attempt() throws ParseException { Token start, end; TemplateElement block; RecoveryBlock recoveryBlock; start = jj_consume_token(ATTEMPT); block = OptionalBlock(); recoveryBlock = Recover(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case END_RECOVER: end = jj_consume_token(END_RECOVER); break; case END_ATTEMPT: end = jj_consume_token(END_ATTEMPT); break; default: jj_la1[26] = jj_gen; jj_consume_token(-1); throw new ParseException(); } AttemptBlock result = new AttemptBlock(block, recoveryBlock); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public RecoveryBlock Recover() throws ParseException { Token start; TemplateElement block; start = jj_consume_token(RECOVER); block = OptionalBlock(); RecoveryBlock result = new RecoveryBlock(block); result.setLocation(template, start, block); {if (true) return result;} throw new Error("Missing return statement in function"); } final public TemplateElement List() throws ParseException { Expression exp; Token loopVar = null, start, end; TemplateElement mainBlock; ElseOfList elseOfList = null; ParserIteratorBlockContext iterCtx; start = jj_consume_token(LIST); exp = Expression(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case AS: jj_consume_token(AS); loopVar = jj_consume_token(ID); break; default: jj_la1[27] = jj_gen; ; } jj_consume_token(DIRECTIVE_END); iterCtx = pushIteratorBlockContext(); if (loopVar != null) { iterCtx.loopVarName = loopVar.image; breakableDirectiveNesting++; } mainBlock = OptionalBlock(); if (loopVar != null) { breakableDirectiveNesting--; } else if (iterCtx.kind != ITERATOR_BLOCK_KIND_ITEMS) { {if (true) throw new ParseException( "#list must have either \"as loopVar\" parameter or nested #items that belongs to it.", template, start);} } popIteratorBlockContext(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ELSE: elseOfList = ElseOfList(); break; default: jj_la1[28] = jj_gen; ; } end = jj_consume_token(END_LIST); IteratorBlock list = new IteratorBlock(exp, loopVar != null ? loopVar.image : null, mainBlock, false); list.setLocation(template, start, end); TemplateElement result; if (elseOfList == null) { result = list; } else { result = new ListElseContainer(list, elseOfList); result.setLocation(template, start, end); } {if (true) return result;} throw new Error("Missing return statement in function"); } final public ElseOfList ElseOfList() throws ParseException { Token start; TemplateElement block; start = jj_consume_token(ELSE); block = OptionalBlock(); ElseOfList result = new ElseOfList(block); result.setLocation(template, start, block); {if (true) return result;} throw new Error("Missing return statement in function"); } final public IteratorBlock ForEach() throws ParseException { Expression exp; Token loopVar, start, end; TemplateElement block; start = jj_consume_token(FOREACH); loopVar = jj_consume_token(ID); jj_consume_token(IN); exp = Expression(); jj_consume_token(DIRECTIVE_END); ParserIteratorBlockContext iterCtx = pushIteratorBlockContext(); iterCtx.loopVarName = loopVar.image; iterCtx.kind = ITERATOR_BLOCK_KIND_FOREACH; breakableDirectiveNesting++; block = OptionalBlock(); end = jj_consume_token(END_FOREACH); breakableDirectiveNesting--; popIteratorBlockContext(); IteratorBlock result = new IteratorBlock(exp, loopVar.image, block, true); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public Items Items() throws ParseException { Token loopVar, start, end; TemplateElement block; ParserIteratorBlockContext iterCtx; start = jj_consume_token(ITEMS); loopVar = jj_consume_token(ID); jj_consume_token(DIRECTIVE_END); iterCtx = peekIteratorBlockContext(); if (iterCtx == null) { {if (true) throw new ParseException("#items must be inside a #list block.", template, start);} } if (iterCtx.loopVarName != null) { String msg; if (iterCtx.kind == ITERATOR_BLOCK_KIND_FOREACH) { msg = forEachDirectiveSymbol() + " doesn't support nested #items."; } else if (iterCtx.kind == ITERATOR_BLOCK_KIND_ITEMS) { msg = "Can't nest #items into each other that belong to the same #list."; } else { msg = "The parent #list of the #items must not have \"as loopVar\" parameter."; } {if (true) throw new ParseException(msg, template, start);} } iterCtx.kind = ITERATOR_BLOCK_KIND_ITEMS; iterCtx.loopVarName = loopVar.image; breakableDirectiveNesting++; block = OptionalBlock(); end = jj_consume_token(END_ITEMS); breakableDirectiveNesting--; iterCtx.loopVarName = null; Items result = new Items(loopVar.image, block); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public Sep Sep() throws ParseException { Token loopVar, start, end = null; TemplateElement block; start = jj_consume_token(SEP); if (peekIteratorBlockContext() == null) { {if (true) throw new ParseException( "#sep must be inside a #list (or " + forEachDirectiveSymbol() + ") block.", template, start);} } block = OptionalBlock(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case END_SEP: end = jj_consume_token(END_SEP); break; default: jj_la1[29] = jj_gen; ; } Sep result = new Sep(block); if (end != null) { result.setLocation(template, start, end); // Template, Token, Token } else { result.setLocation(template, start, block); // Template, Token, TemplateObject } {if (true) return result;} throw new Error("Missing return statement in function"); } final public VisitNode Visit() throws ParseException { Token start, end; Expression targetNode, namespaces = null; start = jj_consume_token(VISIT); targetNode = Expression(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case USING: jj_consume_token(USING); namespaces = Expression(); break; default: jj_la1[30] = jj_gen; ; } end = LooseDirectiveEnd(); VisitNode result = new VisitNode(targetNode, namespaces); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public RecurseNode Recurse() throws ParseException { Token start, end = null; Expression node = null, namespaces = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case SIMPLE_RECURSE: start = jj_consume_token(SIMPLE_RECURSE); break; case RECURSE: start = jj_consume_token(RECURSE); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STRING_LITERAL: case RAW_STRING: case FALSE: case TRUE: case INTEGER: case DECIMAL: case DOT: case PLUS: case MINUS: case EXCLAM: case OPEN_BRACKET: case OPEN_PAREN: case OPENING_CURLY_BRACKET: case ID: node = Expression(); break; default: jj_la1[31] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case USING: jj_consume_token(USING); namespaces = Expression(); break; default: jj_la1[32] = jj_gen; ; } end = LooseDirectiveEnd(); break; default: jj_la1[33] = jj_gen; jj_consume_token(-1); throw new ParseException(); } if (end == null) end = start; RecurseNode result = new RecurseNode(node, namespaces); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public FallbackInstruction FallBack() throws ParseException { Token tok; tok = jj_consume_token(FALLBACK); if (!inMacro) { {if (true) throw new ParseException("Cannot fall back outside a macro.", template, tok);} } FallbackInstruction result = new FallbackInstruction(); result.setLocation(template, tok, tok); {if (true) return result;} throw new Error("Missing return statement in function"); } /** * Production used to break out of a loop or a switch block. */ final public BreakInstruction Break() throws ParseException { Token start; start = jj_consume_token(BREAK); if (breakableDirectiveNesting < 1) { {if (true) throw new ParseException(start.image + " must be nested inside a directive that supports it: " + " #list with \"as\", #items, #switch (or the deprecated " + forEachDirectiveSymbol() + ")", template, start);} } BreakInstruction result = new BreakInstruction(); result.setLocation(template, start, start); {if (true) return result;} throw new Error("Missing return statement in function"); } /** * Production used to jump out of a macro. * The stop instruction terminates the rendering of the template. */ final public ReturnInstruction Return() throws ParseException { Token start, end = null; Expression exp = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case SIMPLE_RETURN: start = jj_consume_token(SIMPLE_RETURN); end = start; break; case RETURN: start = jj_consume_token(RETURN); exp = Expression(); end = LooseDirectiveEnd(); break; default: jj_la1[34] = jj_gen; jj_consume_token(-1); throw new ParseException(); } if (inMacro) { if (exp != null) { {if (true) throw new ParseException("A macro cannot return a value", template, start);} } } else if (inFunction) { if (exp == null) { {if (true) throw new ParseException("A function must return a value", template, start);} } } else { if (exp == null) { {if (true) throw new ParseException( "A return instruction can only occur inside a macro or function", template, start);} } } ReturnInstruction result = new ReturnInstruction(exp); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public StopInstruction Stop() throws ParseException { Token start = null; Expression exp = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case HALT: start = jj_consume_token(HALT); break; case STOP: start = jj_consume_token(STOP); exp = Expression(); LooseDirectiveEnd(); break; default: jj_la1[35] = jj_gen; jj_consume_token(-1); throw new ParseException(); } StopInstruction result = new StopInstruction(exp); result.setLocation(template, start, start); {if (true) return result;} throw new Error("Missing return statement in function"); } final public TemplateElement Nested() throws ParseException { Token t, end; ArrayList bodyParameters; BodyInstruction result = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case SIMPLE_NESTED: t = jj_consume_token(SIMPLE_NESTED); result = new BodyInstruction(null); result.setLocation(template, t, t); break; case NESTED: t = jj_consume_token(NESTED); bodyParameters = PositionalArgs(); end = LooseDirectiveEnd(); result = new BodyInstruction(bodyParameters); result.setLocation(template, t, end); break; default: jj_la1[36] = jj_gen; jj_consume_token(-1); throw new ParseException(); } if (!inMacro) { {if (true) throw new ParseException("Cannot use a " + t.image + " instruction outside a macro.", template, t);} } {if (true) return result;} throw new Error("Missing return statement in function"); } final public TemplateElement Flush() throws ParseException { Token t; t = jj_consume_token(FLUSH); FlushInstruction result = new FlushInstruction(); result.setLocation(template, t, t); {if (true) return result;} throw new Error("Missing return statement in function"); } final public TemplateElement Trim() throws ParseException { Token t; TrimInstruction result = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case TRIM: t = jj_consume_token(TRIM); result = new TrimInstruction(true, true); break; case LTRIM: t = jj_consume_token(LTRIM); result = new TrimInstruction(true, false); break; case RTRIM: t = jj_consume_token(RTRIM); result = new TrimInstruction(false, true); break; case NOTRIM: t = jj_consume_token(NOTRIM); result = new TrimInstruction(false, false); break; default: jj_la1[37] = jj_gen; jj_consume_token(-1); throw new ParseException(); } result.setLocation(template, t, t); {if (true) return result;} throw new Error("Missing return statement in function"); } final public TemplateElement Assign() throws ParseException { Token start, end; int scope; Token id = null; Token equalsOp; Expression nameExp, exp, nsExp = null; String varName; ArrayList assignments = new ArrayList(); Assignment ass; TemplateElement block; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ASSIGN: start = jj_consume_token(ASSIGN); scope = Assignment.NAMESPACE; break; case GLOBALASSIGN: start = jj_consume_token(GLOBALASSIGN); scope = Assignment.GLOBAL; break; case LOCALASSIGN: start = jj_consume_token(LOCALASSIGN); scope = Assignment.LOCAL; scope = Assignment.LOCAL; if (!inMacro && !inFunction) { {if (true) throw new ParseException("Local variable assigned outside a macro.", template, start);} } break; default: jj_la1[38] = jj_gen; jj_consume_token(-1); throw new ParseException(); } nameExp = IdentifierOrStringLiteral(); varName = (nameExp instanceof StringLiteral) ? ((StringLiteral) nameExp).getAsString() : ((Identifier) nameExp).getName(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case EQUALS: case PLUS_EQUALS: case MINUS_EQUALS: case TIMES_EQUALS: case DIV_EQUALS: case MOD_EQUALS: case PLUS_PLUS: case MINUS_MINUS: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case EQUALS: case PLUS_EQUALS: case MINUS_EQUALS: case TIMES_EQUALS: case DIV_EQUALS: case MOD_EQUALS: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case EQUALS: jj_consume_token(EQUALS); break; case PLUS_EQUALS: jj_consume_token(PLUS_EQUALS); break; case MINUS_EQUALS: jj_consume_token(MINUS_EQUALS); break; case TIMES_EQUALS: jj_consume_token(TIMES_EQUALS); break; case DIV_EQUALS: jj_consume_token(DIV_EQUALS); break; case MOD_EQUALS: jj_consume_token(MOD_EQUALS); break; default: jj_la1[39] = jj_gen; jj_consume_token(-1); throw new ParseException(); } equalsOp = token; exp = Expression(); break; case PLUS_PLUS: case MINUS_MINUS: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PLUS_PLUS: jj_consume_token(PLUS_PLUS); break; case MINUS_MINUS: jj_consume_token(MINUS_MINUS); break; default: jj_la1[40] = jj_gen; jj_consume_token(-1); throw new ParseException(); } equalsOp = token; exp = null; break; default: jj_la1[41] = jj_gen; jj_consume_token(-1); throw new ParseException(); } ass = new Assignment(varName, equalsOp.kind, exp, scope); if (exp != null) { ass.setLocation(template, nameExp, exp); } else { ass.setLocation(template, nameExp, equalsOp); } assignments.add(ass); label_9: while (true) { if (jj_2_10(2147483647)) { ; } else { break label_9; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: jj_consume_token(COMMA); break; default: jj_la1[42] = jj_gen; ; } nameExp = IdentifierOrStringLiteral(); varName = (nameExp instanceof StringLiteral) ? ((StringLiteral) nameExp).getAsString() : ((Identifier) nameExp).getName(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case EQUALS: case PLUS_EQUALS: case MINUS_EQUALS: case TIMES_EQUALS: case DIV_EQUALS: case MOD_EQUALS: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case EQUALS: jj_consume_token(EQUALS); break; case PLUS_EQUALS: jj_consume_token(PLUS_EQUALS); break; case MINUS_EQUALS: jj_consume_token(MINUS_EQUALS); break; case TIMES_EQUALS: jj_consume_token(TIMES_EQUALS); break; case DIV_EQUALS: jj_consume_token(DIV_EQUALS); break; case MOD_EQUALS: jj_consume_token(MOD_EQUALS); break; default: jj_la1[43] = jj_gen; jj_consume_token(-1); throw new ParseException(); } equalsOp = token; exp = Expression(); break; case PLUS_PLUS: case MINUS_MINUS: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case PLUS_PLUS: jj_consume_token(PLUS_PLUS); break; case MINUS_MINUS: jj_consume_token(MINUS_MINUS); break; default: jj_la1[44] = jj_gen; jj_consume_token(-1); throw new ParseException(); } equalsOp = token; exp = null; break; default: jj_la1[45] = jj_gen; jj_consume_token(-1); throw new ParseException(); } ass = new Assignment(varName, equalsOp.kind, exp, scope); if (exp != null) { ass.setLocation(template, nameExp, exp); } else { ass.setLocation(template, nameExp, equalsOp); } assignments.add(ass); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IN: id = jj_consume_token(IN); nsExp = Expression(); if (scope != Assignment.NAMESPACE) { {if (true) throw new ParseException("Cannot assign to namespace here.", template, id);} } break; default: jj_la1[46] = jj_gen; ; } end = LooseDirectiveEnd(); if (assignments.size() == 1) { Assignment a = (Assignment) assignments.get(0); a.setNamespaceExp(nsExp); a.setLocation(template, start, end); {if (true) return a;} } else { AssignmentInstruction ai = new AssignmentInstruction(scope); for (int i = 0; i< assignments.size(); i++) { ai.addAssignment((Assignment) assignments.get(i)); } ai.setNamespaceExp(nsExp); ai.setLocation(template, start, end); {if (true) return ai;} } break; case IN: case DIRECTIVE_END: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IN: id = jj_consume_token(IN); nsExp = Expression(); if (scope != Assignment.NAMESPACE) { {if (true) throw new ParseException("Cannot assign to namespace here.", template, id);} } break; default: jj_la1[47] = jj_gen; ; } jj_consume_token(DIRECTIVE_END); block = OptionalBlock(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case END_LOCAL: end = jj_consume_token(END_LOCAL); if (scope != Assignment.LOCAL) { {if (true) throw new ParseException("Mismatched assignment tags.", template, end);} } break; case END_ASSIGN: end = jj_consume_token(END_ASSIGN); if (scope != Assignment.NAMESPACE) { {if (true) throw new ParseException("Mismatched assignment tags.", template, end);} } break; case END_GLOBAL: end = jj_consume_token(END_GLOBAL); if (scope != Assignment.GLOBAL) {if (true) throw new ParseException( "Mismatched assignment tags", template, end);} break; default: jj_la1[48] = jj_gen; jj_consume_token(-1); throw new ParseException(); } BlockAssignment ba = new BlockAssignment(block, varName, scope, nsExp); ba.setLocation(template, start, end); {if (true) return ba;} break; default: jj_la1[49] = jj_gen; jj_consume_token(-1); throw new ParseException(); } throw new Error("Missing return statement in function"); } final public Include Include() throws ParseException { Expression nameExp; Token att, start, end; Expression exp, parseExp = null, encodingExp = null, ignoreMissingExp = null; start = jj_consume_token(_INCLUDE); nameExp = Expression(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case SEMICOLON: jj_consume_token(SEMICOLON); break; default: jj_la1[50] = jj_gen; ; } label_10: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ID: ; break; default: jj_la1[51] = jj_gen; break label_10; } att = jj_consume_token(ID); jj_consume_token(EQUALS); exp = Expression(); String attString = att.image; if (attString.equalsIgnoreCase("parse")) { parseExp = exp; } else if (attString.equalsIgnoreCase("encoding")) { encodingExp = exp; } else if (attString.equalsIgnoreCase("ignore_missing") || attString.equals("ignoreMissing")) { token_source.checkNamingConvention(att); ignoreMissingExp = exp; } else { String correctedName = attString.equals("ignoreMissing") ? "ignore_missing" : null; {if (true) throw new ParseException( "Unsupported named #include parameter: \"" + attString + "\". Supported parameters are: " + "\"parse\", \"encoding\", \"ignore_missing\"." + (correctedName == null ? "" : " Supporting camelCase parameter names is planned for FreeMarker 2.4.0; " + "check if an update is available, and if it indeed supports camel " + "case."), template, att);} } } end = LooseDirectiveEnd(); Include result = new Include(template, nameExp, encodingExp, parseExp, ignoreMissingExp); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public LibraryLoad Import() throws ParseException { Token start, end, ns; Expression nameExp; start = jj_consume_token(IMPORT); nameExp = Expression(); jj_consume_token(AS); ns = jj_consume_token(ID); end = LooseDirectiveEnd(); LibraryLoad result = new LibraryLoad(template, nameExp, ns.image); result.setLocation(template, start, end); template.addImport(result); {if (true) return result;} throw new Error("Missing return statement in function"); } final public Macro Macro() throws ParseException { Token arg, start, end; Expression nameExp; String name; ArrayList argNames = new ArrayList(); HashMap args = new HashMap(); ArrayList defNames = new ArrayList(); Expression defValue = null; List lastIteratorBlockContexts; int lastBreakableDirectiveNesting; TemplateElement block; boolean isFunction = false, hasDefaults = false; boolean isCatchAll = false; String catchAll = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case MACRO: start = jj_consume_token(MACRO); break; case FUNCTION: start = jj_consume_token(FUNCTION); isFunction = true; break; default: jj_la1[52] = jj_gen; jj_consume_token(-1); throw new ParseException(); } if (inMacro || inFunction) { {if (true) throw new ParseException("Macros cannot be nested.", template, start);} } if (isFunction) inFunction = true; else inMacro = true; nameExp = IdentifierOrStringLiteral(); name = (nameExp instanceof StringLiteral) ? ((StringLiteral) nameExp).getAsString() : ((Identifier) nameExp).getName(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case OPEN_PAREN: jj_consume_token(OPEN_PAREN); break; default: jj_la1[53] = jj_gen; ; } label_11: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ID: ; break; default: jj_la1[54] = jj_gen; break label_11; } arg = jj_consume_token(ID); defValue = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ELLIPSIS: jj_consume_token(ELLIPSIS); isCatchAll = true; break; default: jj_la1[55] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case EQUALS: jj_consume_token(EQUALS); defValue = Expression(); defNames.add(arg.image); hasDefaults = true; break; default: jj_la1[56] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: jj_consume_token(COMMA); break; default: jj_la1[57] = jj_gen; ; } if (catchAll != null) { {if (true) throw new ParseException( "There may only be one \"catch-all\" parameter in a macro declaration, and it must be the last parameter.", template, arg);} } if (isCatchAll) { if (defValue != null) { {if (true) throw new ParseException( "\"Catch-all\" macro parameter may not have a default value.", template, arg);} } catchAll = arg.image; } else { argNames.add(arg.image); if (hasDefaults && defValue == null) { {if (true) throw new ParseException( "In a macro declaration, parameters without a default value " + "must all occur before the parameters with default values.", template, arg);} } args.put(arg.image, defValue); } } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case CLOSE_PAREN: jj_consume_token(CLOSE_PAREN); break; default: jj_la1[58] = jj_gen; ; } jj_consume_token(DIRECTIVE_END); // To prevent parser check loopholes like <#list ...><#macro ...><#break></#macro></#list>. lastIteratorBlockContexts = iteratorBlockContexts; iteratorBlockContexts = null; if (incompatibleImprovements >= _TemplateAPI.VERSION_INT_2_3_23) { lastBreakableDirectiveNesting = breakableDirectiveNesting; breakableDirectiveNesting = 0; } else { lastBreakableDirectiveNesting = 0; // Just to prevent uninitialized local variable error later } block = OptionalBlock(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case END_MACRO: end = jj_consume_token(END_MACRO); if(isFunction) {if (true) throw new ParseException("Expected function end tag here.", template, start);} break; case END_FUNCTION: end = jj_consume_token(END_FUNCTION); if(!isFunction) {if (true) throw new ParseException("Expected macro end tag here.", template, start);} break; default: jj_la1[59] = jj_gen; jj_consume_token(-1); throw new ParseException(); } iteratorBlockContexts = lastIteratorBlockContexts; if (incompatibleImprovements >= _TemplateAPI.VERSION_INT_2_3_23) { breakableDirectiveNesting = lastBreakableDirectiveNesting; } inMacro = inFunction = false; Macro result = new Macro(name, argNames, args, catchAll, isFunction, block); result.setLocation(template, start, end); template.addMacro(result); {if (true) return result;} throw new Error("Missing return statement in function"); } final public CompressedBlock Compress() throws ParseException { TemplateElement block; Token start, end; start = jj_consume_token(COMPRESS); block = OptionalBlock(); end = jj_consume_token(END_COMPRESS); CompressedBlock cb = new CompressedBlock(block); cb.setLocation(template, start, end); {if (true) return cb;} throw new Error("Missing return statement in function"); } final public TemplateElement UnifiedMacroTransform() throws ParseException { Token start = null, end, t; HashMap namedArgs = null; ArrayList positionalArgs = null, bodyParameters = null; Expression startTagNameExp; TemplateElement nestedBlock = null; Expression exp; int pushedCtxCount = 0; start = jj_consume_token(UNIFIED_CALL); exp = Expression(); if (exp instanceof Identifier || (exp instanceof Dot && ((Dot) exp).onlyHasIdentifiers())) { startTagNameExp = exp; } else { startTagNameExp = null; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case TERMINATING_WHITESPACE: jj_consume_token(TERMINATING_WHITESPACE); break; default: jj_la1[60] = jj_gen; ; } if (jj_2_11(2147483647)) { namedArgs = NamedArgs(); } else { positionalArgs = PositionalArgs(); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case SEMICOLON: jj_consume_token(SEMICOLON); bodyParameters = new ArrayList(4); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ID: case TERMINATING_WHITESPACE: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case TERMINATING_WHITESPACE: jj_consume_token(TERMINATING_WHITESPACE); break; default: jj_la1[61] = jj_gen; ; } t = jj_consume_token(ID); bodyParameters.add(t.image); label_12: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: case TERMINATING_WHITESPACE: ; break; default: jj_la1[62] = jj_gen; break label_12; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case TERMINATING_WHITESPACE: jj_consume_token(TERMINATING_WHITESPACE); break; default: jj_la1[63] = jj_gen; ; } jj_consume_token(COMMA); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case TERMINATING_WHITESPACE: jj_consume_token(TERMINATING_WHITESPACE); break; default: jj_la1[64] = jj_gen; ; } t = jj_consume_token(ID); bodyParameters.add(t.image); } break; default: jj_la1[65] = jj_gen; ; } break; default: jj_la1[66] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case EMPTY_DIRECTIVE_END: end = jj_consume_token(EMPTY_DIRECTIVE_END); break; case DIRECTIVE_END: jj_consume_token(DIRECTIVE_END); if (bodyParameters != null && iteratorBlockContexts != null && !iteratorBlockContexts.isEmpty()) { // It's possible that we shadow a #list/#items loop variable, in which case that must be noted. int ctxsLen = iteratorBlockContexts.size(); int bodyParsLen = bodyParameters.size(); for (int bodyParIdx = 0; bodyParIdx < bodyParsLen; bodyParIdx++) { String bodyParName = (String) bodyParameters.get(bodyParIdx); walkCtxSack: for (int ctxIdx = ctxsLen - 1; ctxIdx >= 0; ctxIdx--) { ParserIteratorBlockContext ctx = (ParserIteratorBlockContext) iteratorBlockContexts.get(ctxIdx); if (ctx.loopVarName != null && ctx.loopVarName.equals(bodyParName)) { // If it wasn't already shadowed, shadow it: if (ctx.kind != ITERATOR_BLOCK_KIND_USER_DIRECTIVE) { ParserIteratorBlockContext shadowingCtx = pushIteratorBlockContext(); shadowingCtx.loopVarName = bodyParName; shadowingCtx.kind = ITERATOR_BLOCK_KIND_USER_DIRECTIVE; pushedCtxCount++; } break walkCtxSack; } } } } nestedBlock = OptionalBlock(); end = jj_consume_token(UNIFIED_CALL_END); for (int i = 0; i < pushedCtxCount; i++) { popIteratorBlockContext(); } String endTagName = end.image.substring(3, end.image.length() - 1).trim(); if (endTagName.length() > 0) { if (startTagNameExp == null) { {if (true) throw new ParseException("Expecting </@>", template, end);} } else { String startTagName = startTagNameExp.getCanonicalForm(); if (!endTagName.equals(startTagName)) { {if (true) throw new ParseException("Expecting </@> or </@" + startTagName + ">", template, end);} } } } break; default: jj_la1[67] = jj_gen; jj_consume_token(-1); throw new ParseException(); } TemplateElement result = (positionalArgs != null) ? new UnifiedCall(exp, positionalArgs, nestedBlock, bodyParameters) : new UnifiedCall(exp, namedArgs, nestedBlock, bodyParameters); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public TemplateElement Call() throws ParseException { Token start, end, id; HashMap namedArgs = null; ArrayList positionalArgs = null; String macroName= null; start = jj_consume_token(CALL); id = jj_consume_token(ID); macroName = id.image; if (jj_2_13(2147483647)) { namedArgs = NamedArgs(); } else { if (jj_2_12(2147483647)) { jj_consume_token(OPEN_PAREN); } else { ; } positionalArgs = PositionalArgs(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case CLOSE_PAREN: jj_consume_token(CLOSE_PAREN); break; default: jj_la1[68] = jj_gen; ; } } end = LooseDirectiveEnd(); UnifiedCall result = null; if (positionalArgs != null) { result = new UnifiedCall(new Identifier(macroName), positionalArgs, null, null); } else { result = new UnifiedCall(new Identifier(macroName), namedArgs, null, null); } result.legacySyntax = true; result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public HashMap NamedArgs() throws ParseException { HashMap result = new HashMap(); Token t; Expression exp; label_13: while (true) { t = jj_consume_token(ID); jj_consume_token(EQUALS); token_source.SwitchTo(token_source.NAMED_PARAMETER_EXPRESSION); token_source.inInvocation = true; exp = Expression(); result.put(t.image, exp); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ID: ; break; default: jj_la1[69] = jj_gen; break label_13; } } token_source.inInvocation = false; {if (true) return result;} throw new Error("Missing return statement in function"); } final public ArrayList PositionalArgs() throws ParseException { ArrayList result = new ArrayList(); Expression arg; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STRING_LITERAL: case RAW_STRING: case FALSE: case TRUE: case INTEGER: case DECIMAL: case DOT: case PLUS: case MINUS: case EXCLAM: case OPEN_BRACKET: case OPEN_PAREN: case OPENING_CURLY_BRACKET: case ID: arg = Expression(); result.add(arg); label_14: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STRING_LITERAL: case RAW_STRING: case FALSE: case TRUE: case INTEGER: case DECIMAL: case DOT: case PLUS: case MINUS: case EXCLAM: case COMMA: case OPEN_BRACKET: case OPEN_PAREN: case OPENING_CURLY_BRACKET: case ID: ; break; default: jj_la1[70] = jj_gen; break label_14; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: jj_consume_token(COMMA); break; default: jj_la1[71] = jj_gen; ; } arg = Expression(); result.add(arg); } break; default: jj_la1[72] = jj_gen; ; } {if (true) return result;} throw new Error("Missing return statement in function"); } final public Comment Comment() throws ParseException { Token start, end; StringBuffer buf = new StringBuffer(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMENT: start = jj_consume_token(COMMENT); break; case TERSE_COMMENT: start = jj_consume_token(TERSE_COMMENT); break; default: jj_la1[73] = jj_gen; jj_consume_token(-1); throw new ParseException(); } end = UnparsedContent(start, buf); Comment result = new Comment(buf.toString()); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public TextBlock NoParse() throws ParseException { Token start, end; StringBuffer buf = new StringBuffer(); start = jj_consume_token(NOPARSE); end = UnparsedContent(start, buf); TextBlock result = new TextBlock(buf.toString(), true); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public TransformBlock Transform() throws ParseException { Token start, end, argName; Expression exp, argExp; TemplateElement content = null; HashMap args = null; start = jj_consume_token(TRANSFORM); exp = Expression(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case SEMICOLON: jj_consume_token(SEMICOLON); break; default: jj_la1[74] = jj_gen; ; } label_15: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ID: ; break; default: jj_la1[75] = jj_gen; break label_15; } argName = jj_consume_token(ID); jj_consume_token(EQUALS); argExp = Expression(); if (args == null) args = new HashMap(); args.put(argName.image, argExp); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case EMPTY_DIRECTIVE_END: end = jj_consume_token(EMPTY_DIRECTIVE_END); break; case DIRECTIVE_END: jj_consume_token(DIRECTIVE_END); content = OptionalBlock(); end = jj_consume_token(END_TRANSFORM); break; default: jj_la1[76] = jj_gen; jj_consume_token(-1); throw new ParseException(); } TransformBlock result = new TransformBlock(exp, args, content); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public SwitchBlock Switch() throws ParseException { SwitchBlock switchBlock; Case caseIns; Expression switchExp; Token start, end; boolean defaultFound = false; start = jj_consume_token(SWITCH); switchExp = Expression(); jj_consume_token(DIRECTIVE_END); breakableDirectiveNesting++; switchBlock = new SwitchBlock(switchExp); label_16: while (true) { if (jj_2_14(2)) { ; } else { break label_16; } caseIns = Case(); if (caseIns.condition == null) { if (defaultFound) { {if (true) throw new ParseException( "You can only have one default case in a switch statement", template, start);} } defaultFound = true; } switchBlock.addCase(caseIns); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STATIC_TEXT_WS: jj_consume_token(STATIC_TEXT_WS); break; default: jj_la1[77] = jj_gen; ; } end = jj_consume_token(END_SWITCH); breakableDirectiveNesting--; switchBlock.setLocation(template, start, end); {if (true) return switchBlock;} throw new Error("Missing return statement in function"); } final public Case Case() throws ParseException { Expression exp; TemplateElement block; Token start; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STATIC_TEXT_WS: jj_consume_token(STATIC_TEXT_WS); break; default: jj_la1[78] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case CASE: start = jj_consume_token(CASE); exp = Expression(); jj_consume_token(DIRECTIVE_END); break; case DEFAUL: start = jj_consume_token(DEFAUL); exp = null; break; default: jj_la1[79] = jj_gen; jj_consume_token(-1); throw new ParseException(); } block = OptionalBlock(); Case result = new Case(exp, block); result.setLocation(template, start, block); {if (true) return result;} throw new Error("Missing return statement in function"); } final public EscapeBlock Escape() throws ParseException { Token variable, start, end; Expression escapeExpr; TemplateElement content; start = jj_consume_token(ESCAPE); variable = jj_consume_token(ID); jj_consume_token(AS); escapeExpr = Expression(); jj_consume_token(DIRECTIVE_END); EscapeBlock result = new EscapeBlock(variable.image, escapeExpr, escapedExpression(escapeExpr)); escapes.addFirst(result); content = OptionalBlock(); result.setContent(content); escapes.removeFirst(); end = jj_consume_token(END_ESCAPE); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } final public NoEscapeBlock NoEscape() throws ParseException { Token start, end; TemplateElement content; start = jj_consume_token(NOESCAPE); if (escapes.isEmpty()) { {if (true) throw new ParseException("#noescape with no matching #escape encountered.", template, start);} } Object escape = escapes.removeFirst(); content = OptionalBlock(); end = jj_consume_token(END_NOESCAPE); escapes.addFirst(escape); NoEscapeBlock result = new NoEscapeBlock(content); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } /** * Production to terminate potentially empty elements. Either a ">" or "/>" */ final public Token LooseDirectiveEnd() throws ParseException { Token t; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DIRECTIVE_END: t = jj_consume_token(DIRECTIVE_END); break; case EMPTY_DIRECTIVE_END: t = jj_consume_token(EMPTY_DIRECTIVE_END); break; default: jj_la1[80] = jj_gen; jj_consume_token(-1); throw new ParseException(); } {if (true) return t;} throw new Error("Missing return statement in function"); } final public PropertySetting Setting() throws ParseException { Token start, end, key; Expression value; start = jj_consume_token(SETTING); key = jj_consume_token(ID); jj_consume_token(EQUALS); value = Expression(); end = LooseDirectiveEnd(); token_source.checkNamingConvention(key); PropertySetting result = new PropertySetting(key, token_source, value, template.getConfiguration()); result.setLocation(template, start, end); {if (true) return result;} throw new Error("Missing return statement in function"); } /** * A production for FreeMarker directives. */ final public TemplateElement FreemarkerDirective() throws ParseException { TemplateElement tp; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case IF: tp = If(); break; case LIST: tp = List(); break; case FOREACH: tp = ForEach(); break; case ASSIGN: case GLOBALASSIGN: case LOCALASSIGN: tp = Assign(); break; case _INCLUDE: tp = Include(); break; case IMPORT: tp = Import(); break; case FUNCTION: case MACRO: tp = Macro(); break; case COMPRESS: tp = Compress(); break; case UNIFIED_CALL: tp = UnifiedMacroTransform(); break; case ITEMS: tp = Items(); break; case SEP: tp = Sep(); break; case CALL: tp = Call(); break; case COMMENT: case TERSE_COMMENT: tp = Comment(); break; case NOPARSE: tp = NoParse(); break; case TRANSFORM: tp = Transform(); break; case SWITCH: tp = Switch(); break; case SETTING: tp = Setting(); break; case BREAK: tp = Break(); break; case RETURN: case SIMPLE_RETURN: tp = Return(); break; case STOP: case HALT: tp = Stop(); break; case FLUSH: tp = Flush(); break; case TRIM: case LTRIM: case RTRIM: case NOTRIM: tp = Trim(); break; case SIMPLE_NESTED: case NESTED: tp = Nested(); break; case ESCAPE: tp = Escape(); break; case NOESCAPE: tp = NoEscape(); break; case VISIT: tp = Visit(); break; case SIMPLE_RECURSE: case RECURSE: tp = Recurse(); break; case FALLBACK: tp = FallBack(); break; case ATTEMPT: tp = Attempt(); break; default: jj_la1[81] = jj_gen; jj_consume_token(-1); throw new ParseException(); } {if (true) return tp;} throw new Error("Missing return statement in function"); } /** * Production for a block of raw text * i.e. text that contains no * FreeMarker directives. */ final public TextBlock PCData() throws ParseException { StringBuffer buf = new StringBuffer(); Token t = null, start = null, prevToken = null; label_17: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STATIC_TEXT_WS: prevToken = t; t = jj_consume_token(STATIC_TEXT_WS); break; case STATIC_TEXT_NON_WS: t = jj_consume_token(STATIC_TEXT_NON_WS); break; case STATIC_TEXT_FALSE_ALARM: t = jj_consume_token(STATIC_TEXT_FALSE_ALARM); break; default: jj_la1[82] = jj_gen; jj_consume_token(-1); throw new ParseException(); } buf.append(t.image); if (start == null) start = t; if (prevToken != null) prevToken.next = null; if (jj_2_15(2147483647)) { ; } else { break label_17; } } if (stripText && mixedContentNesting == 1) {if (true) return TextBlock.EMPTY_BLOCK;} TextBlock result = new TextBlock(buf.toString(), false); result.setLocation(template, start, t); {if (true) return result;} throw new Error("Missing return statement in function"); } /** * Production for dealing with unparsed content, * i.e. what is inside a comment or noparse tag. * It returns the ending token. The content * of the tag is put in buf. */ final public Token UnparsedContent(Token start, StringBuffer buf) throws ParseException { Token t; label_18: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case KEEP_GOING: t = jj_consume_token(KEEP_GOING); break; case MAYBE_END: t = jj_consume_token(MAYBE_END); break; case TERSE_COMMENT_END: t = jj_consume_token(TERSE_COMMENT_END); break; case LONE_LESS_THAN_OR_DASH: t = jj_consume_token(LONE_LESS_THAN_OR_DASH); break; default: jj_la1[83] = jj_gen; jj_consume_token(-1); throw new ParseException(); } buf.append(t.image); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case TERSE_COMMENT_END: case MAYBE_END: case KEEP_GOING: case LONE_LESS_THAN_OR_DASH: ; break; default: jj_la1[84] = jj_gen; break label_18; } } buf.setLength(buf.length() - t.image.length()); if (!t.image.endsWith(";") && _TemplateAPI.getTemplateLanguageVersionAsInt(template) >= _TemplateAPI.VERSION_INT_2_3_21) { {if (true) throw new ParseException("Unclosed \"" + start.image + "\"", template, start);} } {if (true) return t;} throw new Error("Missing return statement in function"); } final public MixedContent MixedContent() throws ParseException { MixedContent mixedContent = new MixedContent(); TemplateElement elem, begin = null; mixedContentNesting++; label_19: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STATIC_TEXT_WS: case STATIC_TEXT_NON_WS: case STATIC_TEXT_FALSE_ALARM: elem = PCData(); break; case DOLLAR_INTERPOLATION_OPENING: elem = StringOutput(); break; case HASH_INTERPOLATION_OPENING: elem = NumericalOutput(); break; case ATTEMPT: case IF: case LIST: case ITEMS: case SEP: case FOREACH: case SWITCH: case ASSIGN: case GLOBALASSIGN: case LOCALASSIGN: case _INCLUDE: case IMPORT: case FUNCTION: case MACRO: case TRANSFORM: case VISIT: case STOP: case RETURN: case CALL: case SETTING: case COMPRESS: case COMMENT: case TERSE_COMMENT: case NOPARSE: case BREAK: case SIMPLE_RETURN: case HALT: case FLUSH: case TRIM: case LTRIM: case RTRIM: case NOTRIM: case SIMPLE_NESTED: case NESTED: case SIMPLE_RECURSE: case RECURSE: case FALLBACK: case ESCAPE: case NOESCAPE: case UNIFIED_CALL: elem = FreemarkerDirective(); break; default: jj_la1[85] = jj_gen; jj_consume_token(-1); throw new ParseException(); } if (begin == null) { begin = elem; } mixedContent.addElement(elem); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ATTEMPT: case IF: case LIST: case ITEMS: case SEP: case FOREACH: case SWITCH: case ASSIGN: case GLOBALASSIGN: case LOCALASSIGN: case _INCLUDE: case IMPORT: case FUNCTION: case MACRO: case TRANSFORM: case VISIT: case STOP: case RETURN: case CALL: case SETTING: case COMPRESS: case COMMENT: case TERSE_COMMENT: case NOPARSE: case BREAK: case SIMPLE_RETURN: case HALT: case FLUSH: case TRIM: case LTRIM: case RTRIM: case NOTRIM: case SIMPLE_NESTED: case NESTED: case SIMPLE_RECURSE: case RECURSE: case FALLBACK: case ESCAPE: case NOESCAPE: case UNIFIED_CALL: case STATIC_TEXT_WS: case STATIC_TEXT_NON_WS: case STATIC_TEXT_FALSE_ALARM: case DOLLAR_INTERPOLATION_OPENING: case HASH_INTERPOLATION_OPENING: ; break; default: jj_la1[86] = jj_gen; break label_19; } } mixedContentNesting--; mixedContent.setLocation(template, begin, elem); {if (true) return mixedContent;} throw new Error("Missing return statement in function"); } /** * A production freemarker text that may contain * ${...} and #{...} but no directives. */ final public TemplateElement FreeMarkerText() throws ParseException { MixedContent nodes = new MixedContent(); TemplateElement elem, begin = null; label_20: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STATIC_TEXT_WS: case STATIC_TEXT_NON_WS: case STATIC_TEXT_FALSE_ALARM: elem = PCData(); break; case DOLLAR_INTERPOLATION_OPENING: elem = StringOutput(); break; case HASH_INTERPOLATION_OPENING: elem = NumericalOutput(); break; default: jj_la1[87] = jj_gen; jj_consume_token(-1); throw new ParseException(); } if (begin == null) { begin = elem; } nodes.addElement(elem); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STATIC_TEXT_WS: case STATIC_TEXT_NON_WS: case STATIC_TEXT_FALSE_ALARM: case DOLLAR_INTERPOLATION_OPENING: case HASH_INTERPOLATION_OPENING: ; break; default: jj_la1[88] = jj_gen; break label_20; } } nodes.setLocation(template, begin, elem); {if (true) return nodes;} throw new Error("Missing return statement in function"); } /** * A production for a block of optional content. * Returns an empty Text block if there is no * content. */ final public TemplateElement OptionalBlock() throws ParseException { TemplateElement tp = TextBlock.EMPTY_BLOCK; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ATTEMPT: case IF: case LIST: case ITEMS: case SEP: case FOREACH: case SWITCH: case ASSIGN: case GLOBALASSIGN: case LOCALASSIGN: case _INCLUDE: case IMPORT: case FUNCTION: case MACRO: case TRANSFORM: case VISIT: case STOP: case RETURN: case CALL: case SETTING: case COMPRESS: case COMMENT: case TERSE_COMMENT: case NOPARSE: case BREAK: case SIMPLE_RETURN: case HALT: case FLUSH: case TRIM: case LTRIM: case RTRIM: case NOTRIM: case SIMPLE_NESTED: case NESTED: case SIMPLE_RECURSE: case RECURSE: case FALLBACK: case ESCAPE: case NOESCAPE: case UNIFIED_CALL: case STATIC_TEXT_WS: case STATIC_TEXT_NON_WS: case STATIC_TEXT_FALSE_ALARM: case DOLLAR_INTERPOLATION_OPENING: case HASH_INTERPOLATION_OPENING: // has no effect but to get rid of a spurious warning. tp = MixedContent(); break; default: jj_la1[89] = jj_gen; ; } {if (true) return tp;} throw new Error("Missing return statement in function"); } final public void HeaderElement() throws ParseException { Token key; Expression exp = null; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case STATIC_TEXT_WS: jj_consume_token(STATIC_TEXT_WS); break; default: jj_la1[90] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case TRIVIAL_FTL_HEADER: jj_consume_token(TRIVIAL_FTL_HEADER); break; case FTL_HEADER: jj_consume_token(FTL_HEADER); label_21: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ID: ; break; default: jj_la1[91] = jj_gen; break label_21; } key = jj_consume_token(ID); jj_consume_token(EQUALS); exp = Expression(); token_source.checkNamingConvention(key); String ks = key.image; TemplateModel value = null; try { value = exp.eval(null); } catch (Exception e) { {if (true) throw new ParseException( "Could not evaluate expression: " + exp.getCanonicalForm() + " \nUnderlying cause: " + e.getMessage(), exp, e);} } String vs = null; if (value instanceof TemplateScalarModel) { try { vs = ((TemplateScalarModel) exp).getAsString(); } catch (TemplateModelException tme) {} } if (template != null) { if (ks.equalsIgnoreCase("encoding")) { if (vs == null) { {if (true) throw new ParseException("Expecting an encoding string.", exp);} } String encoding = template.getEncoding(); if (encoding != null && !encoding.equalsIgnoreCase(vs)) { {if (true) throw new Template.WrongEncodingException(vs, encoding);} } } else if (ks.equalsIgnoreCase("STRIP_WHITESPACE") || ks.equals("stripWhitespace")) { this.stripWhitespace = getBoolean(exp); } else if (ks.equalsIgnoreCase("STRIP_TEXT") || ks.equals("stripText")) { this.stripText = getBoolean(exp); } else if (ks.equalsIgnoreCase("STRICT_SYNTAX") || ks.equals("strictSyntax")) { this.token_source.strictEscapeSyntax = getBoolean(exp); } else if (ks.equalsIgnoreCase("ns_prefixes") || ks.equals("nsPrefixes")) { if (!(value instanceof TemplateHashModelEx)) { {if (true) throw new ParseException("Expecting a hash of prefixes to namespace URI's.", exp);} } TemplateHashModelEx prefixMap = (TemplateHashModelEx) value; try { TemplateCollectionModel keys = prefixMap.keys(); for (TemplateModelIterator it = keys.iterator(); it.hasNext();) { String prefix = ((TemplateScalarModel) it.next()).getAsString(); TemplateModel valueModel = prefixMap.get(prefix); if (!(valueModel instanceof TemplateScalarModel)) { {if (true) throw new ParseException("Non-string value in prefix to namespace hash.", exp);} } String nsURI = ((TemplateScalarModel) valueModel).getAsString(); try { template.addPrefixNSMapping(prefix, nsURI); } catch (IllegalArgumentException iae) { {if (true) throw new ParseException(iae.getMessage(), exp);} } } } catch (TemplateModelException tme) { } } else if (ks.equalsIgnoreCase("attributes")) { if (!(value instanceof TemplateHashModelEx)) { {if (true) throw new ParseException("Expecting a hash of attribute names to values.", exp);} } TemplateHashModelEx attributeMap = (TemplateHashModelEx) value; try { TemplateCollectionModel keys = attributeMap.keys(); for (TemplateModelIterator it = keys.iterator(); it.hasNext();) { String attName = ((TemplateScalarModel) it.next()).getAsString(); Object attValue = DeepUnwrap.unwrap(attributeMap.get(attName)); template.setCustomAttribute(attName, attValue); } } catch (TemplateModelException tme) { } } else { String correctName; if (ks.equals("charset")) { correctName = "encoding"; } else if (ks.equals("xmlns")) { // [2.4] If came case will be the default, update this correctName = token_source.namingConvention == Configuration.CAMEL_CASE_NAMING_CONVENTION ? "nsPrefixes" : "ns_prefixes"; } else { correctName = null; } {if (true) throw new ParseException( "Unknown FTL header parameter: " + key.image + (correctName == null ? "" : ". Did you mean " + correctName + "?"), template, key);} } } } LooseDirectiveEnd(); break; default: jj_la1[92] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } final public Map ParamList() throws ParseException { Identifier id; Expression exp; Map result = new HashMap(); label_22: while (true) { id = Identifier(); jj_consume_token(EQUALS); exp = Expression(); result.put(id.toString(), exp); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case COMMA: jj_consume_token(COMMA); break; default: jj_la1[93] = jj_gen; ; } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ID: ; break; default: jj_la1[94] = jj_gen; break label_22; } } {if (true) return result;} throw new Error("Missing return statement in function"); } /** * Root production to be used when parsing * an entire file. */ final public TemplateElement Root() throws ParseException { TemplateElement doc; if (jj_2_16(2147483647)) { HeaderElement(); } else { ; } doc = OptionalBlock(); jj_consume_token(0); doc.setFieldsForRootElement(); doc = doc.postParseCleanup(stripWhitespace); // The cleanup result is possibly an element from deeper: doc.setFieldsForRootElement(); {if (true) return doc;} throw new Error("Missing return statement in function"); } final private boolean jj_2_1(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_1(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(0, xla); } } final private boolean jj_2_2(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_2(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(1, xla); } } final private boolean jj_2_3(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_3(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(2, xla); } } final private boolean jj_2_4(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_4(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(3, xla); } } final private boolean jj_2_5(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_5(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(4, xla); } } final private boolean jj_2_6(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_6(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(5, xla); } } final private boolean jj_2_7(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_7(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(6, xla); } } final private boolean jj_2_8(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_8(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(7, xla); } } final private boolean jj_2_9(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_9(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(8, xla); } } final private boolean jj_2_10(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_10(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(9, xla); } } final private boolean jj_2_11(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_11(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(10, xla); } } final private boolean jj_2_12(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_12(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(11, xla); } } final private boolean jj_2_13(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_13(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(12, xla); } } final private boolean jj_2_14(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_14(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(13, xla); } } final private boolean jj_2_15(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_15(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(14, xla); } } final private boolean jj_2_16(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_16(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(15, xla); } } final private boolean jj_3R_171() { if (jj_scan_token(OPEN_PAREN)) return true; if (jj_3R_89()) return true; if (jj_scan_token(CLOSE_PAREN)) return true; return false; } final private boolean jj_3R_26() { if (jj_3R_32()) return true; Token xsp; while (true) { xsp = jj_scanpos; if (jj_3R_33()) { jj_scanpos = xsp; break; } } return false; } final private boolean jj_3R_84() { Token xsp; xsp = jj_scanpos; if (jj_3R_99()) { jj_scanpos = xsp; if (jj_3R_100()) { jj_scanpos = xsp; if (jj_3R_101()) { jj_scanpos = xsp; if (jj_3R_102()) { jj_scanpos = xsp; if (jj_3R_103()) { jj_scanpos = xsp; if (jj_3R_104()) { jj_scanpos = xsp; if (jj_3R_105()) { jj_scanpos = xsp; if (jj_3R_106()) { jj_scanpos = xsp; if (jj_3R_107()) { jj_scanpos = xsp; if (jj_3R_108()) { jj_scanpos = xsp; if (jj_3R_109()) { jj_scanpos = xsp; if (jj_3R_110()) { jj_scanpos = xsp; if (jj_3R_111()) { jj_scanpos = xsp; if (jj_3R_112()) { jj_scanpos = xsp; if (jj_3R_113()) { jj_scanpos = xsp; if (jj_3R_114()) { jj_scanpos = xsp; if (jj_3R_115()) { jj_scanpos = xsp; if (jj_3R_116()) { jj_scanpos = xsp; if (jj_3R_117()) { jj_scanpos = xsp; if (jj_3R_118()) { jj_scanpos = xsp; if (jj_3R_119()) { jj_scanpos = xsp; if (jj_3R_120()) { jj_scanpos = xsp; if (jj_3R_121()) { jj_scanpos = xsp; if (jj_3R_122()) { jj_scanpos = xsp; if (jj_3R_123()) { jj_scanpos = xsp; if (jj_3R_124()) { jj_scanpos = xsp; if (jj_3R_125()) { jj_scanpos = xsp; if (jj_3R_126()) { jj_scanpos = xsp; if (jj_3R_127()) return true; } } } } } } } } } } } } } } } } } } } } } } } } } } } } return false; } final private boolean jj_3R_183() { if (jj_scan_token(NOTRIM)) return true; return false; } final private boolean jj_3R_182() { if (jj_scan_token(RTRIM)) return true; return false; } final private boolean jj_3R_148() { if (jj_scan_token(UNIFIED_CALL)) return true; return false; } final private boolean jj_3R_181() { if (jj_scan_token(LTRIM)) return true; return false; } final private boolean jj_3R_180() { if (jj_scan_token(TRIM)) return true; return false; } final private boolean jj_3R_161() { Token xsp; xsp = jj_scanpos; if (jj_3R_180()) { jj_scanpos = xsp; if (jj_3R_181()) { jj_scanpos = xsp; if (jj_3R_182()) { jj_scanpos = xsp; if (jj_3R_183()) return true; } } } return false; } final private boolean jj_3R_35() { if (jj_scan_token(MINUS)) return true; return false; } final private boolean jj_3_16() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(72)) jj_scanpos = xsp; xsp = jj_scanpos; if (jj_scan_token(70)) { jj_scanpos = xsp; if (jj_scan_token(69)) return true; } return false; } final private boolean jj_3R_34() { if (jj_scan_token(PLUS)) return true; return false; } final private boolean jj_3R_156() { if (jj_scan_token(SETTING)) return true; return false; } final private boolean jj_3_2() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(112)) { jj_scanpos = xsp; if (jj_scan_token(113)) return true; } return false; } final private boolean jj_3R_133() { if (jj_scan_token(BUILT_IN)) return true; if (jj_scan_token(ID)) return true; Token xsp; xsp = jj_scanpos; if (jj_3R_171()) jj_scanpos = xsp; return false; } final private boolean jj_3R_147() { if (jj_scan_token(COMPRESS)) return true; return false; } final private boolean jj_3R_160() { if (jj_scan_token(FLUSH)) return true; return false; } final private boolean jj_3R_27() { Token xsp; xsp = jj_scanpos; if (jj_3R_34()) { jj_scanpos = xsp; if (jj_3R_35()) return true; } if (jj_3R_26()) return true; return false; } final private boolean jj_3R_168() { if (jj_scan_token(ATTEMPT)) return true; return false; } final private boolean jj_3R_23() { if (jj_3R_26()) return true; Token xsp; while (true) { xsp = jj_scanpos; if (jj_3R_27()) { jj_scanpos = xsp; break; } } return false; } final private boolean jj_3_9() { if (jj_3R_24()) return true; return false; } final private boolean jj_3R_135() { if (jj_scan_token(EXISTS)) return true; return false; } final private boolean jj_3R_185() { if (jj_scan_token(NESTED)) return true; return false; } final private boolean jj_3R_54() { if (jj_scan_token(MINUS)) return true; return false; } final private boolean jj_3R_187() { if (jj_3R_24()) return true; return false; } final private boolean jj_3R_48() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(112)) { jj_scanpos = xsp; if (jj_3R_54()) return true; } if (jj_3R_50()) return true; return false; } final private boolean jj_3R_184() { if (jj_scan_token(SIMPLE_NESTED)) return true; return false; } final private boolean jj_3R_164() { if (jj_scan_token(NOESCAPE)) return true; return false; } final private boolean jj_3R_162() { Token xsp; xsp = jj_scanpos; if (jj_3R_184()) { jj_scanpos = xsp; if (jj_3R_185()) return true; } return false; } final private boolean jj_3R_172() { if (jj_scan_token(EXCLAM)) return true; Token xsp; xsp = jj_scanpos; if (jj_3R_187()) jj_scanpos = xsp; return false; } final private boolean jj_3R_134() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(145)) { jj_scanpos = xsp; if (jj_3R_172()) return true; } return false; } final private boolean jj_3R_55() { if (jj_scan_token(EXCLAM)) return true; return false; } final private boolean jj_3R_179() { if (jj_scan_token(STOP)) return true; return false; } final private boolean jj_3R_140() { if (jj_scan_token(IF)) return true; return false; } final private boolean jj_3R_49() { Token xsp; if (jj_3R_55()) return true; while (true) { xsp = jj_scanpos; if (jj_3R_55()) { jj_scanpos = xsp; break; } } if (jj_3R_50()) return true; return false; } final private boolean jj_3R_95() { if (jj_3R_135()) return true; return false; } final private boolean jj_3R_159() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(51)) { jj_scanpos = xsp; if (jj_3R_179()) return true; } return false; } final private boolean jj_3R_94() { if (jj_3R_134()) return true; return false; } final private boolean jj_3R_93() { if (jj_3R_133()) return true; return false; } final private boolean jj_3R_92() { if (jj_3R_132()) return true; return false; } final private boolean jj_3R_91() { if (jj_3R_131()) return true; return false; } final private boolean jj_3R_41() { if (jj_3R_50()) return true; return false; } final private boolean jj_3R_163() { if (jj_scan_token(ESCAPE)) return true; return false; } final private boolean jj_3R_90() { if (jj_3R_130()) return true; return false; } final private boolean jj_3R_40() { if (jj_3R_49()) return true; return false; } final private boolean jj_3R_39() { if (jj_3R_48()) return true; return false; } final private boolean jj_3R_79() { Token xsp; xsp = jj_scanpos; if (jj_3R_90()) { jj_scanpos = xsp; if (jj_3R_91()) { jj_scanpos = xsp; if (jj_3R_92()) { jj_scanpos = xsp; if (jj_3R_93()) { jj_scanpos = xsp; if (jj_3R_94()) { jj_scanpos = xsp; if (jj_3R_95()) return true; } } } } } return false; } final private boolean jj_3R_32() { Token xsp; xsp = jj_scanpos; if (jj_3R_39()) { jj_scanpos = xsp; if (jj_3R_40()) { jj_scanpos = xsp; if (jj_3R_41()) return true; } } return false; } final private boolean jj_3R_30() { if (jj_scan_token(DEFAUL)) return true; return false; } final private boolean jj_3R_29() { if (jj_scan_token(CASE)) return true; if (jj_3R_24()) return true; return false; } final private boolean jj_3R_178() { if (jj_scan_token(RETURN)) return true; return false; } final private boolean jj_3R_177() { if (jj_scan_token(SIMPLE_RETURN)) return true; return false; } final private boolean jj_3R_25() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(72)) jj_scanpos = xsp; xsp = jj_scanpos; if (jj_3R_29()) { jj_scanpos = xsp; if (jj_3R_30()) return true; } if (jj_3R_31()) return true; return false; } final private boolean jj_3R_158() { Token xsp; xsp = jj_scanpos; if (jj_3R_177()) { jj_scanpos = xsp; if (jj_3R_178()) return true; } return false; } final private boolean jj_3R_78() { if (jj_scan_token(DOT)) return true; if (jj_scan_token(ID)) return true; return false; } final private boolean jj_3R_77() { if (jj_scan_token(OPEN_PAREN)) return true; if (jj_3R_24()) return true; if (jj_scan_token(CLOSE_PAREN)) return true; return false; } final private boolean jj_3_1() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(92)) { jj_scanpos = xsp; if (jj_scan_token(125)) { jj_scanpos = xsp; if (jj_scan_token(127)) { jj_scanpos = xsp; if (jj_scan_token(96)) { jj_scanpos = xsp; if (jj_scan_token(121)) { jj_scanpos = xsp; if (jj_scan_token(145)) { jj_scanpos = xsp; if (jj_scan_token(97)) return true; } } } } } } return false; } final private boolean jj_3R_176() { if (jj_scan_token(FUNCTION)) return true; return false; } final private boolean jj_3R_64() { if (jj_3R_79()) return true; return false; } final private boolean jj_3R_146() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(22)) { jj_scanpos = xsp; if (jj_3R_176()) return true; } return false; } final private boolean jj_3R_63() { if (jj_3R_78()) return true; return false; } final private boolean jj_3R_62() { if (jj_3R_77()) return true; return false; } final private boolean jj_3_14() { if (jj_3R_25()) return true; return false; } final private boolean jj_3R_157() { if (jj_scan_token(BREAK)) return true; return false; } final private boolean jj_3R_61() { if (jj_3R_76()) return true; return false; } final private boolean jj_3R_60() { if (jj_3R_75()) return true; return false; } final private boolean jj_3R_59() { if (jj_3R_74()) return true; return false; } final private boolean jj_3R_58() { if (jj_3R_73()) return true; return false; } final private boolean jj_3R_76() { if (jj_scan_token(ID)) return true; return false; } final private boolean jj_3R_57() { if (jj_3R_72()) return true; return false; } final private boolean jj_3R_56() { if (jj_3R_71()) return true; return false; } final private boolean jj_3R_155() { if (jj_scan_token(SWITCH)) return true; return false; } final private boolean jj_3R_50() { Token xsp; xsp = jj_scanpos; if (jj_3R_56()) { jj_scanpos = xsp; if (jj_3R_57()) { jj_scanpos = xsp; if (jj_3R_58()) { jj_scanpos = xsp; if (jj_3R_59()) { jj_scanpos = xsp; if (jj_3R_60()) { jj_scanpos = xsp; if (jj_3R_61()) { jj_scanpos = xsp; if (jj_3R_62()) { jj_scanpos = xsp; if (jj_3R_63()) return true; } } } } } } } while (true) { xsp = jj_scanpos; if (jj_3R_64()) { jj_scanpos = xsp; break; } } return false; } final private boolean jj_3R_167() { if (jj_scan_token(FALLBACK)) return true; return false; } final private boolean jj_3R_83() { if (jj_scan_token(HASH_INTERPOLATION_OPENING)) return true; return false; } final private boolean jj_3R_145() { if (jj_scan_token(IMPORT)) return true; return false; } final private boolean jj_3R_71() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(90)) { jj_scanpos = xsp; if (jj_scan_token(91)) return true; } return false; } final private boolean jj_3R_24() { if (jj_3R_28()) return true; return false; } final private boolean jj_3R_186() { if (jj_scan_token(RECURSE)) return true; return false; } final private boolean jj_3R_38() { if (jj_3R_47()) return true; return false; } final private boolean jj_3R_75() { if (jj_scan_token(OPEN_BRACKET)) return true; if (jj_3R_89()) return true; if (jj_scan_token(CLOSE_BRACKET)) return true; return false; } final private boolean jj_3R_82() { if (jj_scan_token(DOLLAR_INTERPOLATION_OPENING)) return true; return false; } final private boolean jj_3R_31() { Token xsp; xsp = jj_scanpos; if (jj_3R_38()) jj_scanpos = xsp; return false; } final private boolean jj_3R_166() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(60)) { jj_scanpos = xsp; if (jj_3R_186()) return true; } return false; } final private boolean jj_3R_154() { if (jj_scan_token(TRANSFORM)) return true; return false; } final private boolean jj_3_8() { if (jj_scan_token(OR)) return true; return false; } final private boolean jj_3R_37() { if (jj_scan_token(OR)) return true; if (jj_3R_36()) return true; return false; } final private boolean jj_3R_128() { if (jj_scan_token(COMMA)) return true; if (jj_3R_24()) return true; Token xsp; xsp = jj_scanpos; if (jj_scan_token(122)) { jj_scanpos = xsp; if (jj_scan_token(124)) return true; } if (jj_3R_24()) return true; return false; } final private boolean jj_3R_153() { if (jj_scan_token(NOPARSE)) return true; return false; } final private boolean jj_3R_28() { if (jj_3R_36()) return true; Token xsp; while (true) { xsp = jj_scanpos; if (jj_3R_37()) { jj_scanpos = xsp; break; } } return false; } final private boolean jj_3R_165() { if (jj_scan_token(VISIT)) return true; return false; } final private boolean jj_3R_144() { if (jj_scan_token(_INCLUDE)) return true; return false; } final private boolean jj_3_7() { if (jj_scan_token(AND)) return true; return false; } final private boolean jj_3R_85() { if (jj_3R_24()) return true; Token xsp; xsp = jj_scanpos; if (jj_scan_token(122)) { jj_scanpos = xsp; if (jj_scan_token(124)) return true; } if (jj_3R_24()) return true; while (true) { xsp = jj_scanpos; if (jj_3R_128()) { jj_scanpos = xsp; break; } } return false; } final private boolean jj_3R_72() { if (jj_scan_token(OPENING_CURLY_BRACKET)) return true; Token xsp; xsp = jj_scanpos; if (jj_3R_85()) jj_scanpos = xsp; if (jj_scan_token(CLOSING_CURLY_BRACKET)) return true; return false; } final private boolean jj_3R_46() { if (jj_scan_token(AND)) return true; if (jj_3R_45()) return true; return false; } final private boolean jj_3R_152() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(30)) { jj_scanpos = xsp; if (jj_scan_token(31)) return true; } return false; } final private boolean jj_3R_36() { if (jj_3R_45()) return true; Token xsp; while (true) { xsp = jj_scanpos; if (jj_3R_46()) { jj_scanpos = xsp; break; } } return false; } final private boolean jj_3R_169() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(122)) jj_scanpos = xsp; if (jj_3R_24()) return true; return false; } final private boolean jj_3R_88() { if (jj_scan_token(TRUE)) return true; return false; } final private boolean jj_3R_70() { if (jj_3R_84()) return true; return false; } final private boolean jj_3R_87() { if (jj_scan_token(FALSE)) return true; return false; } final private boolean jj_3R_69() { if (jj_3R_83()) return true; return false; } final private boolean jj_3R_150() { if (jj_scan_token(SEP)) return true; return false; } final private boolean jj_3_6() { if (jj_3R_23()) return true; return false; } final private boolean jj_3R_129() { if (jj_3R_24()) return true; Token xsp; while (true) { xsp = jj_scanpos; if (jj_3R_169()) { jj_scanpos = xsp; break; } } return false; } final private boolean jj_3R_68() { if (jj_3R_82()) return true; return false; } final private boolean jj_3R_67() { if (jj_3R_81()) return true; return false; } final private boolean jj_3R_74() { Token xsp; xsp = jj_scanpos; if (jj_3R_87()) { jj_scanpos = xsp; if (jj_3R_88()) return true; } return false; } final private boolean jj_3R_89() { Token xsp; xsp = jj_scanpos; if (jj_3R_129()) jj_scanpos = xsp; return false; } final private boolean jj_3R_53() { Token xsp; xsp = jj_scanpos; if (jj_3R_67()) { jj_scanpos = xsp; if (jj_3R_68()) { jj_scanpos = xsp; if (jj_3R_69()) { jj_scanpos = xsp; if (jj_3R_70()) return true; } } } return false; } final private boolean jj_3R_138() { if (jj_3R_23()) return true; return false; } final private boolean jj_3R_47() { Token xsp; if (jj_3R_53()) return true; while (true) { xsp = jj_scanpos; if (jj_3R_53()) { jj_scanpos = xsp; break; } } return false; } final private boolean jj_3R_137() { if (jj_scan_token(DOT_DOT_ASTERISK)) return true; return false; } final private boolean jj_3R_136() { if (jj_scan_token(DOT_DOT_LESS)) return true; return false; } final private boolean jj_3R_97() { if (jj_scan_token(DOT_DOT)) return true; Token xsp; xsp = jj_scanpos; if (jj_3R_138()) jj_scanpos = xsp; return false; } final private boolean jj_3R_96() { Token xsp; xsp = jj_scanpos; if (jj_3R_136()) { jj_scanpos = xsp; if (jj_3R_137()) return true; } if (jj_3R_23()) return true; return false; } final private boolean jj_3R_86() { if (jj_scan_token(RAW_STRING)) return true; return false; } final private boolean jj_3R_80() { Token xsp; xsp = jj_scanpos; if (jj_3R_96()) { jj_scanpos = xsp; if (jj_3R_97()) return true; } return false; } final private boolean jj_3R_73() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(85)) { jj_scanpos = xsp; if (jj_3R_86()) return true; } return false; } final private boolean jj_3_12() { if (jj_scan_token(OPEN_PAREN)) return true; return false; } final private boolean jj_3R_65() { if (jj_3R_23()) return true; Token xsp; xsp = jj_scanpos; if (jj_3R_80()) jj_scanpos = xsp; return false; } final private boolean jj_3R_149() { if (jj_scan_token(ITEMS)) return true; return false; } final private boolean jj_3_13() { if (jj_scan_token(ID)) return true; if (jj_scan_token(EQUALS)) return true; return false; } final private boolean jj_3R_132() { if (jj_scan_token(OPEN_PAREN)) return true; if (jj_3R_89()) return true; if (jj_scan_token(CLOSE_PAREN)) return true; return false; } final private boolean jj_3_15() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(72)) { jj_scanpos = xsp; if (jj_scan_token(73)) { jj_scanpos = xsp; if (jj_scan_token(74)) return true; } } return false; } final private boolean jj_3R_139() { if (jj_scan_token(STATIC_TEXT_WS)) return true; return false; } final private boolean jj_3R_151() { if (jj_scan_token(CALL)) return true; return false; } final private boolean jj_3_5() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(143)) { jj_scanpos = xsp; if (jj_scan_token(111)) { jj_scanpos = xsp; if (jj_scan_token(142)) { jj_scanpos = xsp; if (jj_scan_token(110)) { jj_scanpos = xsp; if (jj_scan_token(109)) { jj_scanpos = xsp; if (jj_scan_token(109)) { jj_scanpos = xsp; if (jj_scan_token(108)) return true; } } } } } } return false; } final private boolean jj_3R_98() { Token xsp; xsp = jj_scanpos; if (jj_3R_139()) { jj_scanpos = xsp; if (jj_scan_token(73)) { jj_scanpos = xsp; if (jj_scan_token(74)) return true; } } return false; } final private boolean jj_3_10() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(122)) jj_scanpos = xsp; xsp = jj_scanpos; if (jj_scan_token(134)) { jj_scanpos = xsp; if (jj_scan_token(85)) return true; } xsp = jj_scanpos; if (jj_scan_token(98)) { jj_scanpos = xsp; if (jj_scan_token(101)) { jj_scanpos = xsp; if (jj_scan_token(102)) { jj_scanpos = xsp; if (jj_scan_token(103)) { jj_scanpos = xsp; if (jj_scan_token(104)) { jj_scanpos = xsp; if (jj_scan_token(105)) { jj_scanpos = xsp; if (jj_scan_token(106)) { jj_scanpos = xsp; if (jj_scan_token(107)) return true; } } } } } } } return false; } final private boolean jj_3R_81() { Token xsp; if (jj_3R_98()) return true; while (true) { xsp = jj_scanpos; if (jj_3R_98()) { jj_scanpos = xsp; break; } } return false; } final private boolean jj_3R_142() { if (jj_scan_token(FOREACH)) return true; return false; } final private boolean jj_3R_66() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(143)) { jj_scanpos = xsp; if (jj_scan_token(111)) { jj_scanpos = xsp; if (jj_scan_token(142)) { jj_scanpos = xsp; if (jj_scan_token(110)) { jj_scanpos = xsp; if (jj_scan_token(109)) { jj_scanpos = xsp; if (jj_scan_token(108)) return true; } } } } } if (jj_3R_65()) return true; return false; } final private boolean jj_3R_131() { if (jj_scan_token(OPEN_BRACKET)) return true; if (jj_3R_24()) return true; if (jj_scan_token(CLOSE_BRACKET)) return true; return false; } final private boolean jj_3R_51() { if (jj_3R_65()) return true; Token xsp; xsp = jj_scanpos; if (jj_3R_66()) jj_scanpos = xsp; return false; } final private boolean jj_3R_127() { if (jj_3R_168()) return true; return false; } final private boolean jj_3R_126() { if (jj_3R_167()) return true; return false; } final private boolean jj_3R_125() { if (jj_3R_166()) return true; return false; } final private boolean jj_3R_124() { if (jj_3R_165()) return true; return false; } final private boolean jj_3R_123() { if (jj_3R_164()) return true; return false; } final private boolean jj_3R_122() { if (jj_3R_163()) return true; return false; } final private boolean jj_3_4() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(100)) { jj_scanpos = xsp; if (jj_scan_token(98)) { jj_scanpos = xsp; if (jj_scan_token(99)) return true; } } return false; } final private boolean jj_3R_121() { if (jj_3R_162()) return true; return false; } final private boolean jj_3R_120() { if (jj_3R_161()) return true; return false; } final private boolean jj_3R_119() { if (jj_3R_160()) return true; return false; } final private boolean jj_3R_118() { if (jj_3R_159()) return true; return false; } final private boolean jj_3R_117() { if (jj_3R_158()) return true; return false; } final private boolean jj_3R_52() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(100)) { jj_scanpos = xsp; if (jj_scan_token(98)) { jj_scanpos = xsp; if (jj_scan_token(99)) return true; } } if (jj_3R_51()) return true; return false; } final private boolean jj_3R_116() { if (jj_3R_157()) return true; return false; } final private boolean jj_3R_115() { if (jj_3R_156()) return true; return false; } final private boolean jj_3R_114() { if (jj_3R_155()) return true; return false; } final private boolean jj_3R_45() { if (jj_3R_51()) return true; Token xsp; xsp = jj_scanpos; if (jj_3R_52()) jj_scanpos = xsp; return false; } final private boolean jj_3R_170() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(108)) { jj_scanpos = xsp; if (jj_scan_token(109)) { jj_scanpos = xsp; if (jj_scan_token(110)) { jj_scanpos = xsp; if (jj_scan_token(111)) { jj_scanpos = xsp; if (jj_scan_token(88)) { jj_scanpos = xsp; if (jj_scan_token(89)) { jj_scanpos = xsp; if (jj_scan_token(131)) { jj_scanpos = xsp; if (jj_scan_token(132)) { jj_scanpos = xsp; if (jj_scan_token(133)) return true; } } } } } } } } return false; } final private boolean jj_3R_113() { if (jj_3R_154()) return true; return false; } final private boolean jj_3R_112() { if (jj_3R_153()) return true; return false; } final private boolean jj_3R_111() { if (jj_3R_152()) return true; return false; } final private boolean jj_3R_110() { if (jj_3R_151()) return true; return false; } final private boolean jj_3R_130() { if (jj_scan_token(DOT)) return true; Token xsp; xsp = jj_scanpos; if (jj_scan_token(134)) { jj_scanpos = xsp; if (jj_scan_token(114)) { jj_scanpos = xsp; if (jj_scan_token(115)) { jj_scanpos = xsp; if (jj_3R_170()) return true; } } } return false; } final private boolean jj_3R_109() { if (jj_3R_150()) return true; return false; } final private boolean jj_3R_108() { if (jj_3R_149()) return true; return false; } final private boolean jj_3R_44() { if (jj_scan_token(PERCENT)) return true; return false; } final private boolean jj_3R_107() { if (jj_3R_148()) return true; return false; } final private boolean jj_3R_175() { if (jj_scan_token(LOCALASSIGN)) return true; return false; } final private boolean jj_3R_43() { if (jj_scan_token(DIVIDE)) return true; return false; } final private boolean jj_3R_106() { if (jj_3R_147()) return true; return false; } final private boolean jj_3R_174() { if (jj_scan_token(GLOBALASSIGN)) return true; return false; } final private boolean jj_3R_42() { if (jj_scan_token(TIMES)) return true; return false; } final private boolean jj_3_3() { Token xsp; xsp = jj_scanpos; if (jj_scan_token(114)) { jj_scanpos = xsp; if (jj_scan_token(117)) { jj_scanpos = xsp; if (jj_scan_token(118)) return true; } } return false; } final private boolean jj_3R_105() { if (jj_3R_146()) return true; return false; } final private boolean jj_3R_173() { if (jj_scan_token(ASSIGN)) return true; return false; } final private boolean jj_3_11() { if (jj_scan_token(ID)) return true; if (jj_scan_token(EQUALS)) return true; return false; } final private boolean jj_3R_104() { if (jj_3R_145()) return true; return false; } final private boolean jj_3R_103() { if (jj_3R_144()) return true; return false; } final private boolean jj_3R_143() { Token xsp; xsp = jj_scanpos; if (jj_3R_173()) { jj_scanpos = xsp; if (jj_3R_174()) { jj_scanpos = xsp; if (jj_3R_175()) return true; } } return false; } final private boolean jj_3R_102() { if (jj_3R_143()) return true; return false; } final private boolean jj_3R_101() { if (jj_3R_142()) return true; return false; } final private boolean jj_3R_33() { Token xsp; xsp = jj_scanpos; if (jj_3R_42()) { jj_scanpos = xsp; if (jj_3R_43()) { jj_scanpos = xsp; if (jj_3R_44()) return true; } } if (jj_3R_32()) return true; return false; } final private boolean jj_3R_100() { if (jj_3R_141()) return true; return false; } final private boolean jj_3R_99() { if (jj_3R_140()) return true; return false; } final private boolean jj_3R_141() { if (jj_scan_token(LIST)) return true; return false; } public FMParserWSTokenManager token_source; SimpleCharStream jj_input_stream; public Token token, jj_nt; private int jj_ntk; private Token jj_scanpos, jj_lastpos; private int jj_la; public boolean lookingAhead = false; private boolean jj_semLA; private int jj_gen; final private int[] jj_la1 = new int[95]; static private int[] jj_la1_0; static private int[] jj_la1_1; static private int[] jj_la1_2; static private int[] jj_la1_3; static private int[] jj_la1_4; static { jj_la1_0(); jj_la1_1(); jj_la1_2(); jj_la1_3(); jj_la1_4(); } private static void jj_la1_0() { 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,0x0,0x0,0x0,0x200,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x2000000,0x0,0x0,0x70000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x600000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xc0000000,0x0,0x0,0x0,0x0,0x0,0x8000,0x0,0xffff7d40,0x0,0x0,0x0,0xffff7d40,0xffff7d40,0x0,0x0,0xffff7d40,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_1() { 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,0x0,0x0,0x0,0x10000,0x60,0x0,0x10000,0x10,0x0,0x0,0x0,0x30000000,0x40000,0x80000,0xc000000,0x1e00000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x700,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1800,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x2000000,0x0,0xfdfe0001,0x0,0x0,0x0,0xfdfe0001,0xfdfe0001,0x0,0x0,0xfdfe0001,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_2() { jj_la1_2 = new int[] {0x1fa00000,0x1fa00000,0x0,0x0,0x0,0x0,0x0,0x0,0xc0000000,0xe0000000,0xe0000000,0xc000000,0xa00000,0x10000000,0x0,0x3000000,0x3000000,0xa00000,0x3000000,0x0,0x0,0x0,0x1fa00000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1fa00000,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,0x1fa00000,0x0,0x1fa00000,0x0,0x0,0x0,0x0,0x100,0x100,0x0,0x0,0xa,0x700,0x0,0x0,0x1f0a,0x1f0a,0x1f00,0x1f00,0x1f0a,0x100,0x0,0x60,0x0,0x0,}; } private static void jj_la1_3() { jj_la1_3 = new int[] {0xa0000000,0xa2030000,0x2000000,0x30000,0x30000,0x640000,0x1c,0xf000,0x0,0x0,0x0,0x0,0x0,0xa2000003,0x2000000,0xf000,0xcf000,0x0,0x0,0x14000000,0x4000000,0x14000000,0xa2030000,0x8000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xa2030000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x3e4,0xc00,0xfe4,0x4000000,0x3e4,0xc00,0xfe4,0x0,0x0,0x0,0xfe4,0x8000000,0x0,0x0,0x80000000,0x0,0x100000,0x4,0x4000000,0x0,0x0,0x0,0x0,0x4000000,0x0,0x0,0x0,0x8000000,0x0,0x0,0x0,0xa6030000,0x4000000,0xa2030000,0x0,0x8000000,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x4000000,0x0,}; } private static void jj_la1_4() { jj_la1_4 = new int[] {0x42,0x42,0x0,0x0,0x0,0x0,0x0,0xc000,0x0,0x0,0x0,0x0,0x40,0x20000,0x20000,0x38,0x78,0x0,0x0,0x0,0x0,0x0,0x42,0x0,0x0,0x0,0x0,0x10,0x0,0x0,0x20,0x42,0x20,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x8,0x8,0x0,0x1008,0x0,0x40,0x0,0x0,0x40,0x0,0x0,0x0,0x1,0x0,0x10000,0x10000,0x10000,0x10000,0x10000,0x10040,0x0,0x3000,0x1,0x40,0x42,0x0,0x42,0x0,0x0,0x40,0x3000,0x0,0x0,0x0,0x3000,0x0,0x0,0x3c0000,0x3c0000,0x0,0x0,0x0,0x0,0x0,0x0,0x40,0x0,0x0,0x40,}; } final private JJCalls[] jj_2_rtns = new JJCalls[16]; private boolean jj_rescan = false; private int jj_gc = 0; public FMParserWS(java.io.InputStream stream) { jj_input_stream = new SimpleCharStream(stream, 1, 1); token_source = new FMParserWSTokenManager(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 95; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } public void ReInit(java.io.InputStream stream) { jj_input_stream.ReInit(stream, 1, 1); token_source.ReInit(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 95; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } public FMParserWS(java.io.Reader stream) { jj_input_stream = new SimpleCharStream(stream, 1, 1); token_source = new FMParserWSTokenManager(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 95; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } public void ReInit(java.io.Reader stream) { jj_input_stream.ReInit(stream, 1, 1); token_source.ReInit(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 95; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } public FMParserWS(FMParserWSTokenManager tm) { token_source = tm; token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 95; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } public void ReInit(FMParserWSTokenManager tm) { token_source = tm; token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 95; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } final private Token jj_consume_token(int kind) throws ParseException { Token oldToken; if ((oldToken = token).next != null) token = token.next; else token = token.next = token_source.getNextToken(); jj_ntk = -1; if (token.kind == kind) { jj_gen++; if (++jj_gc > 100) { jj_gc = 0; for (int i = 0; i < jj_2_rtns.length; i++) { JJCalls c = jj_2_rtns[i]; while (c != null) { if (c.gen < jj_gen) c.first = null; c = c.next; } } } return token; } token = oldToken; jj_kind = kind; throw generateParseException(); } static private final class LookaheadSuccess extends java.lang.Error { } final private LookaheadSuccess jj_ls = new LookaheadSuccess(); final private boolean jj_scan_token(int kind) { if (jj_scanpos == jj_lastpos) { jj_la--; if (jj_scanpos.next == null) { jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken(); } else { jj_lastpos = jj_scanpos = jj_scanpos.next; } } else { jj_scanpos = jj_scanpos.next; } if (jj_rescan) { int i = 0; Token tok = token; while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; } if (tok != null) jj_add_error_token(kind, i); } if (jj_scanpos.kind != kind) return true; if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls; return false; } final public Token getNextToken() { if (token.next != null) token = token.next; else token = token.next = token_source.getNextToken(); jj_ntk = -1; jj_gen++; return token; } final public Token getToken(int index) { Token t = lookingAhead ? jj_scanpos : token; for (int i = 0; i < index; i++) { if (t.next != null) t = t.next; else t = t.next = token_source.getNextToken(); } return t; } final private int jj_ntk() { if ((jj_nt=token.next) == null) return (jj_ntk = (token.next=token_source.getNextToken()).kind); else return (jj_ntk = jj_nt.kind); } private java.util.Vector jj_expentries = new java.util.Vector(); private int[] jj_expentry; private int jj_kind = -1; private int[] jj_lasttokens = new int[100]; private int jj_endpos; private void jj_add_error_token(int kind, int pos) { if (pos >= 100) return; if (pos == jj_endpos + 1) { jj_lasttokens[jj_endpos++] = kind; } else if (jj_endpos != 0) { jj_expentry = new int[jj_endpos]; for (int i = 0; i < jj_endpos; i++) { jj_expentry[i] = jj_lasttokens[i]; } boolean exists = false; for (java.util.Enumeration e = jj_expentries.elements(); e.hasMoreElements();) { int[] oldentry = (int[])(e.nextElement()); if (oldentry.length == jj_expentry.length) { exists = true; for (int i = 0; i < jj_expentry.length; i++) { if (oldentry[i] != jj_expentry[i]) { exists = false; break; } } if (exists) break; } } if (!exists) jj_expentries.addElement(jj_expentry); if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind; } } public ParseException generateParseException() { jj_expentries.removeAllElements(); boolean[] la1tokens = new boolean[150]; for (int i = 0; i < 150; i++) { la1tokens[i] = false; } if (jj_kind >= 0) { la1tokens[jj_kind] = true; jj_kind = -1; } for (int i = 0; i < 95; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1<<j)) != 0) { la1tokens[j] = true; } if ((jj_la1_1[i] & (1<<j)) != 0) { la1tokens[32+j] = true; } if ((jj_la1_2[i] & (1<<j)) != 0) { la1tokens[64+j] = true; } if ((jj_la1_3[i] & (1<<j)) != 0) { la1tokens[96+j] = true; } if ((jj_la1_4[i] & (1<<j)) != 0) { la1tokens[128+j] = true; } } } } for (int i = 0; i < 150; i++) { if (la1tokens[i]) { jj_expentry = new int[1]; jj_expentry[0] = i; jj_expentries.addElement(jj_expentry); } } jj_endpos = 0; jj_rescan_token(); jj_add_error_token(0, 0); int[][] exptokseq = new int[jj_expentries.size()][]; for (int i = 0; i < jj_expentries.size(); i++) { exptokseq[i] = (int[])jj_expentries.elementAt(i); } return new ParseException(token, exptokseq, tokenImage); } final public void enable_tracing() { } final public void disable_tracing() { } final private void jj_rescan_token() { jj_rescan = true; for (int i = 0; i < 16; i++) { JJCalls p = jj_2_rtns[i]; do { if (p.gen > jj_gen) { jj_la = p.arg; jj_lastpos = jj_scanpos = p.first; switch (i) { case 0: jj_3_1(); break; case 1: jj_3_2(); break; case 2: jj_3_3(); break; case 3: jj_3_4(); break; case 4: jj_3_5(); break; case 5: jj_3_6(); break; case 6: jj_3_7(); break; case 7: jj_3_8(); break; case 8: jj_3_9(); break; case 9: jj_3_10(); break; case 10: jj_3_11(); break; case 11: jj_3_12(); break; case 12: jj_3_13(); break; case 13: jj_3_14(); break; case 14: jj_3_15(); break; case 15: jj_3_16(); break; } } p = p.next; } while (p != null); } jj_rescan = false; } final private void jj_save(int index, int xla) { JJCalls p = jj_2_rtns[index]; while (p.gen > jj_gen) { if (p.next == null) { p = p.next = new JJCalls(); break; } p = p.next; } p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla; } static final class JJCalls { int gen; Token first; int arg; JJCalls next; } }