/* ELParser.java */
/* Generated By:JJTree&JavaCC: Do not edit this line. ELParser.java */
package org.apache.el.parser;

import java.io.StringReader;
import jakarta.el.ELException;

@SuppressWarnings("all") // Ignore warnings in generated code
public class ELParser/* @bgen(jjtree) */ implements ELParserTreeConstants, ELParserConstants {/* @bgen(jjtree) */
    protected JJTELParserState jjtree = new JJTELParserState();

    /**
     * Parses an EL expression string into an AST node.
     *
     * @param ref the EL expression string to parse
     *
     * @return the root AST node of the parsed expression
     *
     * @throws ELException if the expression cannot be parsed
     */
    public static Node parse(String ref) throws ELException {
        try {
            return new ELParser(new StringReader(ref)).CompositeExpression();
        } catch (ParseException pe) {
            throw new ELException(pe.getMessage());
        }
    }

    /*
     * CompositeExpression Allow most flexible parsing, restrict by examining type of returned node
     */
    final public AstCompositeExpression CompositeExpression()
            throws ParseException {/* @bgen(jjtree) CompositeExpression */
        AstCompositeExpression jjtn000 = new AstCompositeExpression(JJTCOMPOSITEEXPRESSION);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        try {
            token_source.reset();
            label_1:
            while (true) {
                switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                    case LITERAL_EXPRESSION:
                    case START_DYNAMIC_EXPRESSION:
                    case START_DEFERRED_EXPRESSION: {
                        ;
                        break;
                    }
                    default:
                        jj_la1[0] = jj_gen;
                        break label_1;
                }
                switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                    case START_DEFERRED_EXPRESSION: {
                        DeferredExpression();
                        break;
                    }
                    case START_DYNAMIC_EXPRESSION: {
                        DynamicExpression();
                        break;
                    }
                    case LITERAL_EXPRESSION: {
                        LiteralExpression();
                        break;
                    }
                    default:
                        jj_la1[1] = jj_gen;
                        jj_consume_token(-1);
                        throw new ParseException();
                }
            }
            jj_consume_token(0);
            jjtree.closeNodeScope(jjtn000, true);
            jjtc000 = false;
            {
                if ("" != null) {
                    return jjtn000;
                }
            }
        } catch (Throwable jjte000) {
            if (jjtc000) {
                jjtree.clearNodeScope(jjtn000);
                jjtc000 = false;
            } else {
                jjtree.popNode();
            }
            if (jjte000 instanceof RuntimeException) {
                {
                    if (true) {
                        throw (RuntimeException) jjte000;
                    }
                }
            }
            if (jjte000 instanceof ParseException) {
                {
                    if (true) {
                        throw (ParseException) jjte000;
                    }
                }
            }
            {
                if (true) {
                    throw (Error) jjte000;
                }
            }
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
        throw new Error("Missing return statement in function");
    }

    /*
     * LiteralExpression Non-EL Expression blocks
     */
    final public void LiteralExpression() throws ParseException {/* @bgen(jjtree) LiteralExpression */
        AstLiteralExpression jjtn000 = new AstLiteralExpression(JJTLITERALEXPRESSION);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        Token t = null;
        try {
            t = jj_consume_token(LITERAL_EXPRESSION);
            jjtree.closeNodeScope(jjtn000, true);
            jjtc000 = false;
            jjtn000.setImage(t.image);
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * DeferredExpression #{...} Expressions
     */
    final public void DeferredExpression() throws ParseException {/* @bgen(jjtree) DeferredExpression */
        AstDeferredExpression jjtn000 = new AstDeferredExpression(JJTDEFERREDEXPRESSION);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        try {
            jj_consume_token(START_DEFERRED_EXPRESSION);
            Expression();
            jj_consume_token(RBRACE);
        } catch (Throwable jjte000) {
            if (jjtc000) {
                jjtree.clearNodeScope(jjtn000);
                jjtc000 = false;
            } else {
                jjtree.popNode();
            }
            if (jjte000 instanceof RuntimeException) {
                {
                    if (true) {
                        throw (RuntimeException) jjte000;
                    }
                }
            }
            if (jjte000 instanceof ParseException) {
                {
                    if (true) {
                        throw (ParseException) jjte000;
                    }
                }
            }
            {
                if (true) {
                    throw (Error) jjte000;
                }
            }
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * DynamicExpression ${...} Expressions
     */
    final public void DynamicExpression() throws ParseException {/* @bgen(jjtree) DynamicExpression */
        AstDynamicExpression jjtn000 = new AstDynamicExpression(JJTDYNAMICEXPRESSION);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        try {
            jj_consume_token(START_DYNAMIC_EXPRESSION);
            Expression();
            jj_consume_token(RBRACE);
        } catch (Throwable jjte000) {
            if (jjtc000) {
                jjtree.clearNodeScope(jjtn000);
                jjtc000 = false;
            } else {
                jjtree.popNode();
            }
            if (jjte000 instanceof RuntimeException) {
                {
                    if (true) {
                        throw (RuntimeException) jjte000;
                    }
                }
            }
            if (jjte000 instanceof ParseException) {
                {
                    if (true) {
                        throw (ParseException) jjte000;
                    }
                }
            }
            {
                if (true) {
                    throw (Error) jjte000;
                }
            }
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * Expression EL Expression Language Root
     */
    final public void Expression() throws ParseException {
        Semicolon();
    }

    /*
     * Semicolon
     */
    final public void Semicolon() throws ParseException {
        Assignment();
        label_2:
        while (true) {
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case SEMICOLON: {
                    ;
                    break;
                }
                default:
                    jj_la1[2] = jj_gen;
                    break label_2;
            }
            jj_consume_token(SEMICOLON);
            AstSemicolon jjtn001 = new AstSemicolon(JJTSEMICOLON);
            boolean jjtc001 = true;
            jjtree.openNodeScope(jjtn001);
            try {
                Assignment();
            } catch (Throwable jjte001) {
                if (jjtc001) {
                    jjtree.clearNodeScope(jjtn001);
                    jjtc001 = false;
                } else {
                    jjtree.popNode();
                }
                if (jjte001 instanceof RuntimeException) {
                    {
                        if (true) {
                            throw (RuntimeException) jjte001;
                        }
                    }
                }
                if (jjte001 instanceof ParseException) {
                    {
                        if (true) {
                            throw (ParseException) jjte001;
                        }
                    }
                }
                {
                    if (true) {
                        throw (Error) jjte001;
                    }
                }
            } finally {
                if (jjtc001) {
                    jjtree.closeNodeScope(jjtn001, 2);
                }
            }
        }
    }

    /*
     * Assignment
     */
    final public void Assignment() throws ParseException {
        if (jj_2_2(4)) {
            LambdaExpression();
        } else {
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case START_SET_OR_MAP:
                case INTEGER_LITERAL:
                case FLOATING_POINT_LITERAL:
                case STRING_LITERAL:
                case TRUE:
                case FALSE:
                case NULL:
                case LPAREN:
                case LBRACK:
                case NOT0:
                case NOT1:
                case EMPTY:
                case MINUS:
                case IDENTIFIER: {
                    Ternary();
                    label_3:
                    while (true) {
                        if (jj_2_1(2)) {
                            ;
                        } else {
                            break label_3;
                        }
                        jj_consume_token(ASSIGN);
                        AstAssign jjtn001 = new AstAssign(JJTASSIGN);
                        boolean jjtc001 = true;
                        jjtree.openNodeScope(jjtn001);
                        try {
                            Assignment();
                        } catch (Throwable jjte001) {
                            if (jjtc001) {
                                jjtree.clearNodeScope(jjtn001);
                                jjtc001 = false;
                            } else {
                                jjtree.popNode();
                            }
                            if (jjte001 instanceof RuntimeException) {
                                {
                                    if (true) {
                                        throw (RuntimeException) jjte001;
                                    }
                                }
                            }
                            if (jjte001 instanceof ParseException) {
                                {
                                    if (true) {
                                        throw (ParseException) jjte001;
                                    }
                                }
                            }
                            {
                                if (true) {
                                    throw (Error) jjte001;
                                }
                            }
                        } finally {
                            if (jjtc001) {
                                jjtree.closeNodeScope(jjtn001, 2);
                            }
                        }
                    }
                    break;
                }
                default:
                    jj_la1[3] = jj_gen;
                    jj_consume_token(-1);
                    throw new ParseException();
            }
        }
    }

    /*
     * Lambda expression
     */
    final public void LambdaExpression() throws ParseException {/* @bgen(jjtree) LambdaExpression */
        AstLambdaExpression jjtn000 = new AstLambdaExpression(JJTLAMBDAEXPRESSION);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        try {
            LambdaParameters();
            jj_consume_token(ARROW);
            if (jj_2_3(3)) {
                LambdaExpression();
            } else {
                switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                    case START_SET_OR_MAP:
                    case INTEGER_LITERAL:
                    case FLOATING_POINT_LITERAL:
                    case STRING_LITERAL:
                    case TRUE:
                    case FALSE:
                    case NULL:
                    case LPAREN:
                    case LBRACK:
                    case NOT0:
                    case NOT1:
                    case EMPTY:
                    case MINUS:
                    case IDENTIFIER: {
                        Ternary();
                        break;
                    }
                    default:
                        jj_la1[4] = jj_gen;
                        jj_consume_token(-1);
                        throw new ParseException();
                }
            }
        } catch (Throwable jjte000) {
            if (jjtc000) {
                jjtree.clearNodeScope(jjtn000);
                jjtc000 = false;
            } else {
                jjtree.popNode();
            }
            if (jjte000 instanceof RuntimeException) {
                {
                    if (true) {
                        throw (RuntimeException) jjte000;
                    }
                }
            }
            if (jjte000 instanceof ParseException) {
                {
                    if (true) {
                        throw (ParseException) jjte000;
                    }
                }
            }
            {
                if (true) {
                    throw (Error) jjte000;
                }
            }
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * Lambda parameters
     */
    final public void LambdaParameters() throws ParseException {/* @bgen(jjtree) LambdaParameters */
        AstLambdaParameters jjtn000 = new AstLambdaParameters(JJTLAMBDAPARAMETERS);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        try {
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case IDENTIFIER: {
                    Identifier();
                    break;
                }
                case LPAREN: {
                    jj_consume_token(LPAREN);
                    switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                        case IDENTIFIER: {
                            Identifier();
                            label_4:
                            while (true) {
                                switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                                    case COMMA: {
                                        ;
                                        break;
                                    }
                                    default:
                                        jj_la1[5] = jj_gen;
                                        break label_4;
                                }
                                jj_consume_token(COMMA);
                                Identifier();
                            }
                            break;
                        }
                        default:
                            jj_la1[6] = jj_gen;
                            ;
                    }
                    jj_consume_token(RPAREN);
                    break;
                }
                default:
                    jj_la1[7] = jj_gen;
                    jj_consume_token(-1);
                    throw new ParseException();
            }
        } catch (Throwable jjte000) {
            if (jjtc000) {
                jjtree.clearNodeScope(jjtn000);
                jjtc000 = false;
            } else {
                jjtree.popNode();
            }
            if (jjte000 instanceof RuntimeException) {
                {
                    if (true) {
                        throw (RuntimeException) jjte000;
                    }
                }
            }
            if (jjte000 instanceof ParseException) {
                {
                    if (true) {
                        throw (ParseException) jjte000;
                    }
                }
            }
            {
                if (true) {
                    throw (Error) jjte000;
                }
            }
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /**
     * Possible invocation of lambda expression. Invocations must be bracketed but being bracketed does not mean it is
     * an invocation.
     */
    final public void LambdaExpressionOrInvocation() throws ParseException {/* @bgen(jjtree) LambdaExpression */
        AstLambdaExpression jjtn000 = new AstLambdaExpression(JJTLAMBDAEXPRESSION);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        try {
            jj_consume_token(LPAREN);
            LambdaParameters();
            jj_consume_token(ARROW);
            if (jj_2_4(3)) {
                LambdaExpression();
            } else {
                switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                    case START_SET_OR_MAP:
                    case INTEGER_LITERAL:
                    case FLOATING_POINT_LITERAL:
                    case STRING_LITERAL:
                    case TRUE:
                    case FALSE:
                    case NULL:
                    case LPAREN:
                    case LBRACK:
                    case NOT0:
                    case NOT1:
                    case EMPTY:
                    case MINUS:
                    case IDENTIFIER: {
                        Ternary();
                        break;
                    }
                    default:
                        jj_la1[8] = jj_gen;
                        jj_consume_token(-1);
                        throw new ParseException();
                }
            }
            jj_consume_token(RPAREN);
            label_5:
            while (true) {
                switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                    case LPAREN: {
                        ;
                        break;
                    }
                    default:
                        jj_la1[9] = jj_gen;
                        break label_5;
                }
                MethodParameters();
            }
        } catch (Throwable jjte000) {
            if (jjtc000) {
                jjtree.clearNodeScope(jjtn000);
                jjtc000 = false;
            } else {
                jjtree.popNode();
            }
            if (jjte000 instanceof RuntimeException) {
                {
                    if (true) {
                        throw (RuntimeException) jjte000;
                    }
                }
            }
            if (jjte000 instanceof ParseException) {
                {
                    if (true) {
                        throw (ParseException) jjte000;
                    }
                }
            }
            {
                if (true) {
                    throw (Error) jjte000;
                }
            }
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * Ternary For '??' '?:' '? :', then Or
     */
    final public void Ternary() throws ParseException {
        Or();
        label_6:
        while (true) {
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case QUESTIONMARK: {
                    ;
                    break;
                }
                default:
                    jj_la1[10] = jj_gen;
                    break label_6;
            }
            if (jj_2_5(2)) {
                jj_consume_token(QUESTIONMARK);
                jj_consume_token(QUESTIONMARK);
                AstNullCoalescing jjtn001 = new AstNullCoalescing(JJTNULLCOALESCING);
                boolean jjtc001 = true;
                jjtree.openNodeScope(jjtn001);
                try {
                    Ternary();
                } catch (Throwable jjte001) {
                    if (jjtc001) {
                        jjtree.clearNodeScope(jjtn001);
                        jjtc001 = false;
                    } else {
                        jjtree.popNode();
                    }
                    if (jjte001 instanceof RuntimeException) {
                        {
                            if (true) {
                                throw (RuntimeException) jjte001;
                            }
                        }
                    }
                    if (jjte001 instanceof ParseException) {
                        {
                            if (true) {
                                throw (ParseException) jjte001;
                            }
                        }
                    }
                    {
                        if (true) {
                            throw (Error) jjte001;
                        }
                    }
                } finally {
                    if (jjtc001) {
                        jjtree.closeNodeScope(jjtn001, 2);
                    }
                }
            } else if (jj_2_6(2)) {
                jj_consume_token(QUESTIONMARK);
                jj_consume_token(COLON);
                AstElvis jjtn002 = new AstElvis(JJTELVIS);
                boolean jjtc002 = true;
                jjtree.openNodeScope(jjtn002);
                try {
                    Ternary();
                } catch (Throwable jjte002) {
                    if (jjtc002) {
                        jjtree.clearNodeScope(jjtn002);
                        jjtc002 = false;
                    } else {
                        jjtree.popNode();
                    }
                    if (jjte002 instanceof RuntimeException) {
                        {
                            if (true) {
                                throw (RuntimeException) jjte002;
                            }
                        }
                    }
                    if (jjte002 instanceof ParseException) {
                        {
                            if (true) {
                                throw (ParseException) jjte002;
                            }
                        }
                    }
                    {
                        if (true) {
                            throw (Error) jjte002;
                        }
                    }
                } finally {
                    if (jjtc002) {
                        jjtree.closeNodeScope(jjtn002, 2);
                    }
                }
            } else {
                switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                    case QUESTIONMARK: {
                        jj_consume_token(QUESTIONMARK);
                        Ternary();
                        jj_consume_token(COLON);
                        AstChoice jjtn003 = new AstChoice(JJTCHOICE);
                        boolean jjtc003 = true;
                        jjtree.openNodeScope(jjtn003);
                        try {
                            Ternary();
                        } catch (Throwable jjte003) {
                            if (jjtc003) {
                                jjtree.clearNodeScope(jjtn003);
                                jjtc003 = false;
                            } else {
                                jjtree.popNode();
                            }
                            if (jjte003 instanceof RuntimeException) {
                                {
                                    if (true) {
                                        throw (RuntimeException) jjte003;
                                    }
                                }
                            }
                            if (jjte003 instanceof ParseException) {
                                {
                                    if (true) {
                                        throw (ParseException) jjte003;
                                    }
                                }
                            }
                            {
                                if (true) {
                                    throw (Error) jjte003;
                                }
                            }
                        } finally {
                            if (jjtc003) {
                                jjtree.closeNodeScope(jjtn003, 3);
                            }
                        }
                        break;
                    }
                    default:
                        jj_la1[11] = jj_gen;
                        jj_consume_token(-1);
                        throw new ParseException();
                }
            }
        }
    }

    /*
     * Or For 'or' '||', then And
     */
    final public void Or() throws ParseException {
        And();
        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
            case OR0:
            case OR1: {
                AstOr jjtn001 = new AstOr(JJTOR);
                boolean jjtc001 = true;
                jjtree.openNodeScope(jjtn001);
                try {
                    label_7:
                    while (true) {
                        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                            case OR0: {
                                jj_consume_token(OR0);
                                break;
                            }
                            case OR1: {
                                jj_consume_token(OR1);
                                break;
                            }
                            default:
                                jj_la1[12] = jj_gen;
                                jj_consume_token(-1);
                                throw new ParseException();
                        }
                        And();
                        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                            case OR0:
                            case OR1: {
                                ;
                                break;
                            }
                            default:
                                jj_la1[13] = jj_gen;
                                break label_7;
                        }
                    }
                } catch (Throwable jjte001) {
                    if (jjtc001) {
                        jjtree.clearNodeScope(jjtn001);
                        jjtc001 = false;
                    } else {
                        jjtree.popNode();
                    }
                    if (jjte001 instanceof RuntimeException) {
                        {
                            if (true) {
                                throw (RuntimeException) jjte001;
                            }
                        }
                    }
                    if (jjte001 instanceof ParseException) {
                        {
                            if (true) {
                                throw (ParseException) jjte001;
                            }
                        }
                    }
                    {
                        if (true) {
                            throw (Error) jjte001;
                        }
                    }
                } finally {
                    if (jjtc001) {
                        jjtree.closeNodeScope(jjtn001, jjtree.nodeArity() + 1);
                    }
                }
                break;
            }
            default:
                jj_la1[14] = jj_gen;
                ;
        }
    }

    /*
     * And For 'and' '&&', then Equality
     */
    final public void And() throws ParseException {
        Equality();
        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
            case AND0:
            case AND1: {
                AstAnd jjtn001 = new AstAnd(JJTAND);
                boolean jjtc001 = true;
                jjtree.openNodeScope(jjtn001);
                try {
                    label_8:
                    while (true) {
                        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                            case AND0: {
                                jj_consume_token(AND0);
                                break;
                            }
                            case AND1: {
                                jj_consume_token(AND1);
                                break;
                            }
                            default:
                                jj_la1[15] = jj_gen;
                                jj_consume_token(-1);
                                throw new ParseException();
                        }
                        Equality();
                        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                            case AND0:
                            case AND1: {
                                ;
                                break;
                            }
                            default:
                                jj_la1[16] = jj_gen;
                                break label_8;
                        }
                    }
                } catch (Throwable jjte001) {
                    if (jjtc001) {
                        jjtree.clearNodeScope(jjtn001);
                        jjtc001 = false;
                    } else {
                        jjtree.popNode();
                    }
                    if (jjte001 instanceof RuntimeException) {
                        {
                            if (true) {
                                throw (RuntimeException) jjte001;
                            }
                        }
                    }
                    if (jjte001 instanceof ParseException) {
                        {
                            if (true) {
                                throw (ParseException) jjte001;
                            }
                        }
                    }
                    {
                        if (true) {
                            throw (Error) jjte001;
                        }
                    }
                } finally {
                    if (jjtc001) {
                        jjtree.closeNodeScope(jjtn001, jjtree.nodeArity() + 1);
                    }
                }
                break;
            }
            default:
                jj_la1[17] = jj_gen;
                ;
        }
    }

    /*
     * Equality For '==' 'eq' '!=' 'ne', then Compare
     */
    final public void Equality() throws ParseException {
        Compare();
        label_9:
        while (true) {
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case EQ0:
                case EQ1:
                case NE0:
                case NE1: {
                    ;
                    break;
                }
                default:
                    jj_la1[18] = jj_gen;
                    break label_9;
            }
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case EQ0:
                case EQ1: {
                    switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                        case EQ0: {
                            jj_consume_token(EQ0);
                            break;
                        }
                        case EQ1: {
                            jj_consume_token(EQ1);
                            break;
                        }
                        default:
                            jj_la1[19] = jj_gen;
                            jj_consume_token(-1);
                            throw new ParseException();
                    }
                    AstEqual jjtn001 = new AstEqual(JJTEQUAL);
                    boolean jjtc001 = true;
                    jjtree.openNodeScope(jjtn001);
                    try {
                        Compare();
                    } catch (Throwable jjte001) {
                        if (jjtc001) {
                            jjtree.clearNodeScope(jjtn001);
                            jjtc001 = false;
                        } else {
                            jjtree.popNode();
                        }
                        if (jjte001 instanceof RuntimeException) {
                            {
                                if (true) {
                                    throw (RuntimeException) jjte001;
                                }
                            }
                        }
                        if (jjte001 instanceof ParseException) {
                            {
                                if (true) {
                                    throw (ParseException) jjte001;
                                }
                            }
                        }
                        {
                            if (true) {
                                throw (Error) jjte001;
                            }
                        }
                    } finally {
                        if (jjtc001) {
                            jjtree.closeNodeScope(jjtn001, 2);
                        }
                    }
                    break;
                }
                case NE0:
                case NE1: {
                    switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                        case NE0: {
                            jj_consume_token(NE0);
                            break;
                        }
                        case NE1: {
                            jj_consume_token(NE1);
                            break;
                        }
                        default:
                            jj_la1[20] = jj_gen;
                            jj_consume_token(-1);
                            throw new ParseException();
                    }
                    AstNotEqual jjtn002 = new AstNotEqual(JJTNOTEQUAL);
                    boolean jjtc002 = true;
                    jjtree.openNodeScope(jjtn002);
                    try {
                        Compare();
                    } catch (Throwable jjte002) {
                        if (jjtc002) {
                            jjtree.clearNodeScope(jjtn002);
                            jjtc002 = false;
                        } else {
                            jjtree.popNode();
                        }
                        if (jjte002 instanceof RuntimeException) {
                            {
                                if (true) {
                                    throw (RuntimeException) jjte002;
                                }
                            }
                        }
                        if (jjte002 instanceof ParseException) {
                            {
                                if (true) {
                                    throw (ParseException) jjte002;
                                }
                            }
                        }
                        {
                            if (true) {
                                throw (Error) jjte002;
                            }
                        }
                    } finally {
                        if (jjtc002) {
                            jjtree.closeNodeScope(jjtn002, 2);
                        }
                    }
                    break;
                }
                default:
                    jj_la1[21] = jj_gen;
                    jj_consume_token(-1);
                    throw new ParseException();
            }
        }
    }

    /*
     * Compare For a bunch of them, then +=
     */
    final public void Compare() throws ParseException {
        Concatenation();
        label_10:
        while (true) {
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case GT0:
                case GT1:
                case LT0:
                case LT1:
                case GE0:
                case GE1:
                case LE0:
                case LE1: {
                    ;
                    break;
                }
                default:
                    jj_la1[22] = jj_gen;
                    break label_10;
            }
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case LT0:
                case LT1: {
                    switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                        case LT0: {
                            jj_consume_token(LT0);
                            break;
                        }
                        case LT1: {
                            jj_consume_token(LT1);
                            break;
                        }
                        default:
                            jj_la1[23] = jj_gen;
                            jj_consume_token(-1);
                            throw new ParseException();
                    }
                    AstLessThan jjtn001 = new AstLessThan(JJTLESSTHAN);
                    boolean jjtc001 = true;
                    jjtree.openNodeScope(jjtn001);
                    try {
                        Concatenation();
                    } catch (Throwable jjte001) {
                        if (jjtc001) {
                            jjtree.clearNodeScope(jjtn001);
                            jjtc001 = false;
                        } else {
                            jjtree.popNode();
                        }
                        if (jjte001 instanceof RuntimeException) {
                            {
                                if (true) {
                                    throw (RuntimeException) jjte001;
                                }
                            }
                        }
                        if (jjte001 instanceof ParseException) {
                            {
                                if (true) {
                                    throw (ParseException) jjte001;
                                }
                            }
                        }
                        {
                            if (true) {
                                throw (Error) jjte001;
                            }
                        }
                    } finally {
                        if (jjtc001) {
                            jjtree.closeNodeScope(jjtn001, 2);
                        }
                    }
                    break;
                }
                case GT0:
                case GT1: {
                    switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                        case GT0: {
                            jj_consume_token(GT0);
                            break;
                        }
                        case GT1: {
                            jj_consume_token(GT1);
                            break;
                        }
                        default:
                            jj_la1[24] = jj_gen;
                            jj_consume_token(-1);
                            throw new ParseException();
                    }
                    AstGreaterThan jjtn002 = new AstGreaterThan(JJTGREATERTHAN);
                    boolean jjtc002 = true;
                    jjtree.openNodeScope(jjtn002);
                    try {
                        Concatenation();
                    } catch (Throwable jjte002) {
                        if (jjtc002) {
                            jjtree.clearNodeScope(jjtn002);
                            jjtc002 = false;
                        } else {
                            jjtree.popNode();
                        }
                        if (jjte002 instanceof RuntimeException) {
                            {
                                if (true) {
                                    throw (RuntimeException) jjte002;
                                }
                            }
                        }
                        if (jjte002 instanceof ParseException) {
                            {
                                if (true) {
                                    throw (ParseException) jjte002;
                                }
                            }
                        }
                        {
                            if (true) {
                                throw (Error) jjte002;
                            }
                        }
                    } finally {
                        if (jjtc002) {
                            jjtree.closeNodeScope(jjtn002, 2);
                        }
                    }
                    break;
                }
                case LE0:
                case LE1: {
                    switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                        case LE0: {
                            jj_consume_token(LE0);
                            break;
                        }
                        case LE1: {
                            jj_consume_token(LE1);
                            break;
                        }
                        default:
                            jj_la1[25] = jj_gen;
                            jj_consume_token(-1);
                            throw new ParseException();
                    }
                    AstLessThanEqual jjtn003 = new AstLessThanEqual(JJTLESSTHANEQUAL);
                    boolean jjtc003 = true;
                    jjtree.openNodeScope(jjtn003);
                    try {
                        Concatenation();
                    } catch (Throwable jjte003) {
                        if (jjtc003) {
                            jjtree.clearNodeScope(jjtn003);
                            jjtc003 = false;
                        } else {
                            jjtree.popNode();
                        }
                        if (jjte003 instanceof RuntimeException) {
                            {
                                if (true) {
                                    throw (RuntimeException) jjte003;
                                }
                            }
                        }
                        if (jjte003 instanceof ParseException) {
                            {
                                if (true) {
                                    throw (ParseException) jjte003;
                                }
                            }
                        }
                        {
                            if (true) {
                                throw (Error) jjte003;
                            }
                        }
                    } finally {
                        if (jjtc003) {
                            jjtree.closeNodeScope(jjtn003, 2);
                        }
                    }
                    break;
                }
                case GE0:
                case GE1: {
                    switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                        case GE0: {
                            jj_consume_token(GE0);
                            break;
                        }
                        case GE1: {
                            jj_consume_token(GE1);
                            break;
                        }
                        default:
                            jj_la1[26] = jj_gen;
                            jj_consume_token(-1);
                            throw new ParseException();
                    }
                    AstGreaterThanEqual jjtn004 = new AstGreaterThanEqual(JJTGREATERTHANEQUAL);
                    boolean jjtc004 = true;
                    jjtree.openNodeScope(jjtn004);
                    try {
                        Concatenation();
                    } catch (Throwable jjte004) {
                        if (jjtc004) {
                            jjtree.clearNodeScope(jjtn004);
                            jjtc004 = false;
                        } else {
                            jjtree.popNode();
                        }
                        if (jjte004 instanceof RuntimeException) {
                            {
                                if (true) {
                                    throw (RuntimeException) jjte004;
                                }
                            }
                        }
                        if (jjte004 instanceof ParseException) {
                            {
                                if (true) {
                                    throw (ParseException) jjte004;
                                }
                            }
                        }
                        {
                            if (true) {
                                throw (Error) jjte004;
                            }
                        }
                    } finally {
                        if (jjtc004) {
                            jjtree.closeNodeScope(jjtn004, 2);
                        }
                    }
                    break;
                }
                default:
                    jj_la1[27] = jj_gen;
                    jj_consume_token(-1);
                    throw new ParseException();
            }
        }
    }

    /*
     * Concatenation For +=, then Math
     *
     */
    final public void Concatenation() throws ParseException {
        Math();
        label_11:
        while (true) {
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case CONCAT: {
                    ;
                    break;
                }
                default:
                    jj_la1[28] = jj_gen;
                    break label_11;
            }
            jj_consume_token(CONCAT);
            AstConcatenation jjtn001 = new AstConcatenation(JJTCONCATENATION);
            boolean jjtc001 = true;
            jjtree.openNodeScope(jjtn001);
            try {
                Math();
            } catch (Throwable jjte001) {
                if (jjtc001) {
                    jjtree.clearNodeScope(jjtn001);
                    jjtc001 = false;
                } else {
                    jjtree.popNode();
                }
                if (jjte001 instanceof RuntimeException) {
                    {
                        if (true) {
                            throw (RuntimeException) jjte001;
                        }
                    }
                }
                if (jjte001 instanceof ParseException) {
                    {
                        if (true) {
                            throw (ParseException) jjte001;
                        }
                    }
                }
                {
                    if (true) {
                        throw (Error) jjte001;
                    }
                }
            } finally {
                if (jjtc001) {
                    jjtree.closeNodeScope(jjtn001, 2);
                }
            }
        }
    }

    /*
     * Math For '+' '-', then Multiplication
     */
    final public void Math() throws ParseException {
        Multiplication();
        label_12:
        while (true) {
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case PLUS:
                case MINUS: {
                    ;
                    break;
                }
                default:
                    jj_la1[29] = jj_gen;
                    break label_12;
            }
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case PLUS: {
                    jj_consume_token(PLUS);
                    AstPlus jjtn001 = new AstPlus(JJTPLUS);
                    boolean jjtc001 = true;
                    jjtree.openNodeScope(jjtn001);
                    try {
                        Multiplication();
                    } catch (Throwable jjte001) {
                        if (jjtc001) {
                            jjtree.clearNodeScope(jjtn001);
                            jjtc001 = false;
                        } else {
                            jjtree.popNode();
                        }
                        if (jjte001 instanceof RuntimeException) {
                            {
                                if (true) {
                                    throw (RuntimeException) jjte001;
                                }
                            }
                        }
                        if (jjte001 instanceof ParseException) {
                            {
                                if (true) {
                                    throw (ParseException) jjte001;
                                }
                            }
                        }
                        {
                            if (true) {
                                throw (Error) jjte001;
                            }
                        }
                    } finally {
                        if (jjtc001) {
                            jjtree.closeNodeScope(jjtn001, 2);
                        }
                    }
                    break;
                }
                case MINUS: {
                    jj_consume_token(MINUS);
                    AstMinus jjtn002 = new AstMinus(JJTMINUS);
                    boolean jjtc002 = true;
                    jjtree.openNodeScope(jjtn002);
                    try {
                        Multiplication();
                    } catch (Throwable jjte002) {
                        if (jjtc002) {
                            jjtree.clearNodeScope(jjtn002);
                            jjtc002 = false;
                        } else {
                            jjtree.popNode();
                        }
                        if (jjte002 instanceof RuntimeException) {
                            {
                                if (true) {
                                    throw (RuntimeException) jjte002;
                                }
                            }
                        }
                        if (jjte002 instanceof ParseException) {
                            {
                                if (true) {
                                    throw (ParseException) jjte002;
                                }
                            }
                        }
                        {
                            if (true) {
                                throw (Error) jjte002;
                            }
                        }
                    } finally {
                        if (jjtc002) {
                            jjtree.closeNodeScope(jjtn002, 2);
                        }
                    }
                    break;
                }
                default:
                    jj_la1[30] = jj_gen;
                    jj_consume_token(-1);
                    throw new ParseException();
            }
        }
    }

    /*
     * Multiplication For a bunch of them, then Unary
     */
    final public void Multiplication() throws ParseException {
        Unary();
        label_13:
        while (true) {
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case MULT:
                case DIV0:
                case DIV1:
                case MOD0:
                case MOD1: {
                    ;
                    break;
                }
                default:
                    jj_la1[31] = jj_gen;
                    break label_13;
            }
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case MULT: {
                    jj_consume_token(MULT);
                    AstMult jjtn001 = new AstMult(JJTMULT);
                    boolean jjtc001 = true;
                    jjtree.openNodeScope(jjtn001);
                    try {
                        Unary();
                    } catch (Throwable jjte001) {
                        if (jjtc001) {
                            jjtree.clearNodeScope(jjtn001);
                            jjtc001 = false;
                        } else {
                            jjtree.popNode();
                        }
                        if (jjte001 instanceof RuntimeException) {
                            {
                                if (true) {
                                    throw (RuntimeException) jjte001;
                                }
                            }
                        }
                        if (jjte001 instanceof ParseException) {
                            {
                                if (true) {
                                    throw (ParseException) jjte001;
                                }
                            }
                        }
                        {
                            if (true) {
                                throw (Error) jjte001;
                            }
                        }
                    } finally {
                        if (jjtc001) {
                            jjtree.closeNodeScope(jjtn001, 2);
                        }
                    }
                    break;
                }
                case DIV0:
                case DIV1: {
                    switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                        case DIV0: {
                            jj_consume_token(DIV0);
                            break;
                        }
                        case DIV1: {
                            jj_consume_token(DIV1);
                            break;
                        }
                        default:
                            jj_la1[32] = jj_gen;
                            jj_consume_token(-1);
                            throw new ParseException();
                    }
                    AstDiv jjtn002 = new AstDiv(JJTDIV);
                    boolean jjtc002 = true;
                    jjtree.openNodeScope(jjtn002);
                    try {
                        Unary();
                    } catch (Throwable jjte002) {
                        if (jjtc002) {
                            jjtree.clearNodeScope(jjtn002);
                            jjtc002 = false;
                        } else {
                            jjtree.popNode();
                        }
                        if (jjte002 instanceof RuntimeException) {
                            {
                                if (true) {
                                    throw (RuntimeException) jjte002;
                                }
                            }
                        }
                        if (jjte002 instanceof ParseException) {
                            {
                                if (true) {
                                    throw (ParseException) jjte002;
                                }
                            }
                        }
                        {
                            if (true) {
                                throw (Error) jjte002;
                            }
                        }
                    } finally {
                        if (jjtc002) {
                            jjtree.closeNodeScope(jjtn002, 2);
                        }
                    }
                    break;
                }
                case MOD0:
                case MOD1: {
                    switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                        case MOD0: {
                            jj_consume_token(MOD0);
                            break;
                        }
                        case MOD1: {
                            jj_consume_token(MOD1);
                            break;
                        }
                        default:
                            jj_la1[33] = jj_gen;
                            jj_consume_token(-1);
                            throw new ParseException();
                    }
                    AstMod jjtn003 = new AstMod(JJTMOD);
                    boolean jjtc003 = true;
                    jjtree.openNodeScope(jjtn003);
                    try {
                        Unary();
                    } catch (Throwable jjte003) {
                        if (jjtc003) {
                            jjtree.clearNodeScope(jjtn003);
                            jjtc003 = false;
                        } else {
                            jjtree.popNode();
                        }
                        if (jjte003 instanceof RuntimeException) {
                            {
                                if (true) {
                                    throw (RuntimeException) jjte003;
                                }
                            }
                        }
                        if (jjte003 instanceof ParseException) {
                            {
                                if (true) {
                                    throw (ParseException) jjte003;
                                }
                            }
                        }
                        {
                            if (true) {
                                throw (Error) jjte003;
                            }
                        }
                    } finally {
                        if (jjtc003) {
                            jjtree.closeNodeScope(jjtn003, 2);
                        }
                    }
                    break;
                }
                default:
                    jj_la1[34] = jj_gen;
                    jj_consume_token(-1);
                    throw new ParseException();
            }
        }
    }

    /*
     * Unary For '-' '!' 'not' 'empty', then Value
     */
    final public void Unary() throws ParseException {
        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
            case MINUS: {
                jj_consume_token(MINUS);
                AstNegative jjtn001 = new AstNegative(JJTNEGATIVE);
                boolean jjtc001 = true;
                jjtree.openNodeScope(jjtn001);
                try {
                    Unary();
                } catch (Throwable jjte001) {
                    if (jjtc001) {
                        jjtree.clearNodeScope(jjtn001);
                        jjtc001 = false;
                    } else {
                        jjtree.popNode();
                    }
                    if (jjte001 instanceof RuntimeException) {
                        {
                            if (true) {
                                throw (RuntimeException) jjte001;
                            }
                        }
                    }
                    if (jjte001 instanceof ParseException) {
                        {
                            if (true) {
                                throw (ParseException) jjte001;
                            }
                        }
                    }
                    {
                        if (true) {
                            throw (Error) jjte001;
                        }
                    }
                } finally {
                    if (jjtc001) {
                        jjtree.closeNodeScope(jjtn001, true);
                    }
                }
                break;
            }
            default:
                jj_la1[37] = jj_gen;
                if (jj_2_7(2)) {
                    switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                        case NOT0: {
                            jj_consume_token(NOT0);
                            break;
                        }
                        case NOT1: {
                            jj_consume_token(NOT1);
                            break;
                        }
                        default:
                            jj_la1[35] = jj_gen;
                            jj_consume_token(-1);
                            throw new ParseException();
                    }
                    jj_consume_token(EMPTY);
                    AstNotEmpty jjtn002 = new AstNotEmpty(JJTNOTEMPTY);
                    boolean jjtc002 = true;
                    jjtree.openNodeScope(jjtn002);
                    try {
                        Unary();
                    } catch (Throwable jjte002) {
                        if (jjtc002) {
                            jjtree.clearNodeScope(jjtn002);
                            jjtc002 = false;
                        } else {
                            jjtree.popNode();
                        }
                        if (jjte002 instanceof RuntimeException) {
                            {
                                if (true) {
                                    throw (RuntimeException) jjte002;
                                }
                            }
                        }
                        if (jjte002 instanceof ParseException) {
                            {
                                if (true) {
                                    throw (ParseException) jjte002;
                                }
                            }
                        }
                        {
                            if (true) {
                                throw (Error) jjte002;
                            }
                        }
                    } finally {
                        if (jjtc002) {
                            jjtree.closeNodeScope(jjtn002, true);
                        }
                    }
                } else {
                    switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                        case NOT0:
                        case NOT1: {
                            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                                case NOT0: {
                                    jj_consume_token(NOT0);
                                    break;
                                }
                                case NOT1: {
                                    jj_consume_token(NOT1);
                                    break;
                                }
                                default:
                                    jj_la1[36] = jj_gen;
                                    jj_consume_token(-1);
                                    throw new ParseException();
                            }
                            AstNot jjtn003 = new AstNot(JJTNOT);
                            boolean jjtc003 = true;
                            jjtree.openNodeScope(jjtn003);
                            try {
                                Unary();
                            } catch (Throwable jjte003) {
                                if (jjtc003) {
                                    jjtree.clearNodeScope(jjtn003);
                                    jjtc003 = false;
                                } else {
                                    jjtree.popNode();
                                }
                                if (jjte003 instanceof RuntimeException) {
                                    {
                                        if (true) {
                                            throw (RuntimeException) jjte003;
                                        }
                                    }
                                }
                                if (jjte003 instanceof ParseException) {
                                    {
                                        if (true) {
                                            throw (ParseException) jjte003;
                                        }
                                    }
                                }
                                {
                                    if (true) {
                                        throw (Error) jjte003;
                                    }
                                }
                            } finally {
                                if (jjtc003) {
                                    jjtree.closeNodeScope(jjtn003, true);
                                }
                            }
                            break;
                        }
                        case EMPTY: {
                            jj_consume_token(EMPTY);
                            AstEmpty jjtn004 = new AstEmpty(JJTEMPTY);
                            boolean jjtc004 = true;
                            jjtree.openNodeScope(jjtn004);
                            try {
                                Unary();
                            } catch (Throwable jjte004) {
                                if (jjtc004) {
                                    jjtree.clearNodeScope(jjtn004);
                                    jjtc004 = false;
                                } else {
                                    jjtree.popNode();
                                }
                                if (jjte004 instanceof RuntimeException) {
                                    {
                                        if (true) {
                                            throw (RuntimeException) jjte004;
                                        }
                                    }
                                }
                                if (jjte004 instanceof ParseException) {
                                    {
                                        if (true) {
                                            throw (ParseException) jjte004;
                                        }
                                    }
                                }
                                {
                                    if (true) {
                                        throw (Error) jjte004;
                                    }
                                }
                            } finally {
                                if (jjtc004) {
                                    jjtree.closeNodeScope(jjtn004, true);
                                }
                            }
                            break;
                        }
                        case START_SET_OR_MAP:
                        case INTEGER_LITERAL:
                        case FLOATING_POINT_LITERAL:
                        case STRING_LITERAL:
                        case TRUE:
                        case FALSE:
                        case NULL:
                        case LPAREN:
                        case LBRACK:
                        case IDENTIFIER: {
                            Value();
                            break;
                        }
                        default:
                            jj_la1[38] = jj_gen;
                            jj_consume_token(-1);
                            throw new ParseException();
                    }
                }
        }
    }

    /*
     * Value Defines Prefix plus zero or more Suffixes
     */
    final public void Value() throws ParseException {
        AstValue jjtn001 = new AstValue(JJTVALUE);
        boolean jjtc001 = true;
        jjtree.openNodeScope(jjtn001);
        try {
            ValuePrefix();
            label_14:
            while (true) {
                switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                    case DOT:
                    case LBRACK: {
                        ;
                        break;
                    }
                    default:
                        jj_la1[39] = jj_gen;
                        break label_14;
                }
                ValueSuffix();
            }
        } catch (Throwable jjte001) {
            if (jjtc001) {
                jjtree.clearNodeScope(jjtn001);
                jjtc001 = false;
            } else {
                jjtree.popNode();
            }
            if (jjte001 instanceof RuntimeException) {
                {
                    if (true) {
                        throw (RuntimeException) jjte001;
                    }
                }
            }
            if (jjte001 instanceof ParseException) {
                {
                    if (true) {
                        throw (ParseException) jjte001;
                    }
                }
            }
            {
                if (true) {
                    throw (Error) jjte001;
                }
            }
        } finally {
            if (jjtc001) {
                jjtree.closeNodeScope(jjtn001, jjtree.nodeArity() > 1);
            }
        }
    }

    /*
     * ValuePrefix For Literals, Variables, and Functions
     */
    final public void ValuePrefix() throws ParseException {
        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
            case INTEGER_LITERAL:
            case FLOATING_POINT_LITERAL:
            case STRING_LITERAL:
            case TRUE:
            case FALSE:
            case NULL: {
                Literal();
                break;
            }
            case START_SET_OR_MAP:
            case LPAREN:
            case LBRACK:
            case IDENTIFIER: {
                NonLiteral();
                break;
            }
            default:
                jj_la1[40] = jj_gen;
                jj_consume_token(-1);
                throw new ParseException();
        }
    }

    /*
     * ValueSuffix Either dot or bracket notation
     */
    final public void ValueSuffix() throws ParseException {
        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
            case DOT: {
                DotSuffix();
                break;
            }
            case LBRACK: {
                BracketSuffix();
                break;
            }
            default:
                jj_la1[41] = jj_gen;
                jj_consume_token(-1);
                throw new ParseException();
        }
        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
            case LPAREN: {
                MethodParameters();
                break;
            }
            default:
                jj_la1[42] = jj_gen;
                ;
        }
    }

    /*
     * DotSuffix Dot Property
     */
    final public void DotSuffix() throws ParseException {/* @bgen(jjtree) DotSuffix */
        AstDotSuffix jjtn000 = new AstDotSuffix(JJTDOTSUFFIX);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        Token t = null;
        try {
            jj_consume_token(DOT);
            t = jj_consume_token(IDENTIFIER);
            jjtree.closeNodeScope(jjtn000, true);
            jjtc000 = false;
            jjtn000.setImage(t.image);
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * BracketSuffix Sub Expression Suffix
     */
    final public void BracketSuffix() throws ParseException {/* @bgen(jjtree) BracketSuffix */
        AstBracketSuffix jjtn000 = new AstBracketSuffix(JJTBRACKETSUFFIX);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        try {
            jj_consume_token(LBRACK);
            Expression();
            jj_consume_token(RBRACK);
        } catch (Throwable jjte000) {
            if (jjtc000) {
                jjtree.clearNodeScope(jjtn000);
                jjtc000 = false;
            } else {
                jjtree.popNode();
            }
            if (jjte000 instanceof RuntimeException) {
                {
                    if (true) {
                        throw (RuntimeException) jjte000;
                    }
                }
            }
            if (jjte000 instanceof ParseException) {
                {
                    if (true) {
                        throw (ParseException) jjte000;
                    }
                }
            }
            {
                if (true) {
                    throw (Error) jjte000;
                }
            }
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * MethodParameters
     */
    final public void MethodParameters() throws ParseException {/* @bgen(jjtree) MethodParameters */
        AstMethodParameters jjtn000 = new AstMethodParameters(JJTMETHODPARAMETERS);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        try {
            jj_consume_token(LPAREN);
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case START_SET_OR_MAP:
                case INTEGER_LITERAL:
                case FLOATING_POINT_LITERAL:
                case STRING_LITERAL:
                case TRUE:
                case FALSE:
                case NULL:
                case LPAREN:
                case LBRACK:
                case NOT0:
                case NOT1:
                case EMPTY:
                case MINUS:
                case IDENTIFIER: {
                    Expression();
                    label_15:
                    while (true) {
                        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                            case COMMA: {
                                ;
                                break;
                            }
                            default:
                                jj_la1[43] = jj_gen;
                                break label_15;
                        }
                        jj_consume_token(COMMA);
                        Expression();
                    }
                    break;
                }
                default:
                    jj_la1[44] = jj_gen;
                    ;
            }
            jj_consume_token(RPAREN);
        } catch (Throwable jjte000) {
            if (jjtc000) {
                jjtree.clearNodeScope(jjtn000);
                jjtc000 = false;
            } else {
                jjtree.popNode();
            }
            if (jjte000 instanceof RuntimeException) {
                {
                    if (true) {
                        throw (RuntimeException) jjte000;
                    }
                }
            }
            if (jjte000 instanceof ParseException) {
                {
                    if (true) {
                        throw (ParseException) jjte000;
                    }
                }
            }
            {
                if (true) {
                    throw (Error) jjte000;
                }
            }
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * NonLiteral For Grouped Operations, Identifiers, and Functions
     */
    final public void NonLiteral() throws ParseException {
        if (jj_2_8(5)) {
            LambdaExpressionOrInvocation();
        } else {
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case LPAREN: {
                    jj_consume_token(LPAREN);
                    Expression();
                    jj_consume_token(RPAREN);
                    break;
                }
                default:
                    jj_la1[45] = jj_gen;
                    if (jj_2_9(2147483647)) {
                        Function();
                    } else {
                        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                            case IDENTIFIER: {
                                Identifier();
                                break;
                            }
                            default:
                                jj_la1[46] = jj_gen;
                                if (jj_2_10(5)) {
                                    SetData();
                                } else {
                                    switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                                        case LBRACK: {
                                            ListData();
                                            break;
                                        }
                                        case START_SET_OR_MAP: {
                                            MapData();
                                            break;
                                        }
                                        default:
                                            jj_la1[47] = jj_gen;
                                            jj_consume_token(-1);
                                            throw new ParseException();
                                    }
                                }
                        }
                    }
            }
        }
    }

    /*
     * Note that both an empty Set and an empty Map are represented by {}. The parser will always parse {} as an empty
     * Set and special handling is required to convert it to an empty Map when appropriate.
     */
    final public void SetData() throws ParseException {/* @bgen(jjtree) SetData */
        AstSetData jjtn000 = new AstSetData(JJTSETDATA);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        try {
            jj_consume_token(START_SET_OR_MAP);
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case START_SET_OR_MAP:
                case INTEGER_LITERAL:
                case FLOATING_POINT_LITERAL:
                case STRING_LITERAL:
                case TRUE:
                case FALSE:
                case NULL:
                case LPAREN:
                case LBRACK:
                case NOT0:
                case NOT1:
                case EMPTY:
                case MINUS:
                case IDENTIFIER: {
                    Expression();
                    label_16:
                    while (true) {
                        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                            case COMMA: {
                                ;
                                break;
                            }
                            default:
                                jj_la1[48] = jj_gen;
                                break label_16;
                        }
                        jj_consume_token(COMMA);
                        Expression();
                    }
                    break;
                }
                default:
                    jj_la1[49] = jj_gen;
                    ;
            }
            jj_consume_token(RBRACE);
        } catch (Throwable jjte000) {
            if (jjtc000) {
                jjtree.clearNodeScope(jjtn000);
                jjtc000 = false;
            } else {
                jjtree.popNode();
            }
            if (jjte000 instanceof RuntimeException) {
                {
                    if (true) {
                        throw (RuntimeException) jjte000;
                    }
                }
            }
            if (jjte000 instanceof ParseException) {
                {
                    if (true) {
                        throw (ParseException) jjte000;
                    }
                }
            }
            {
                if (true) {
                    throw (Error) jjte000;
                }
            }
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    final public void ListData() throws ParseException {/* @bgen(jjtree) ListData */
        AstListData jjtn000 = new AstListData(JJTLISTDATA);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        try {
            jj_consume_token(LBRACK);
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case START_SET_OR_MAP:
                case INTEGER_LITERAL:
                case FLOATING_POINT_LITERAL:
                case STRING_LITERAL:
                case TRUE:
                case FALSE:
                case NULL:
                case LPAREN:
                case LBRACK:
                case NOT0:
                case NOT1:
                case EMPTY:
                case MINUS:
                case IDENTIFIER: {
                    Expression();
                    label_17:
                    while (true) {
                        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                            case COMMA: {
                                ;
                                break;
                            }
                            default:
                                jj_la1[50] = jj_gen;
                                break label_17;
                        }
                        jj_consume_token(COMMA);
                        Expression();
                    }
                    break;
                }
                default:
                    jj_la1[51] = jj_gen;
                    ;
            }
            jj_consume_token(RBRACK);
        } catch (Throwable jjte000) {
            if (jjtc000) {
                jjtree.clearNodeScope(jjtn000);
                jjtc000 = false;
            } else {
                jjtree.popNode();
            }
            if (jjte000 instanceof RuntimeException) {
                {
                    if (true) {
                        throw (RuntimeException) jjte000;
                    }
                }
            }
            if (jjte000 instanceof ParseException) {
                {
                    if (true) {
                        throw (ParseException) jjte000;
                    }
                }
            }
            {
                if (true) {
                    throw (Error) jjte000;
                }
            }
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * Note that both an empty Set and an empty Map are represented by {}. The parser will always parse {} as an empty
     * Set and special handling is required to convert it to an empty Map when appropriate.
     */
    final public void MapData() throws ParseException {/* @bgen(jjtree) MapData */
        AstMapData jjtn000 = new AstMapData(JJTMAPDATA);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        try {
            jj_consume_token(START_SET_OR_MAP);
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case START_SET_OR_MAP:
                case INTEGER_LITERAL:
                case FLOATING_POINT_LITERAL:
                case STRING_LITERAL:
                case TRUE:
                case FALSE:
                case NULL:
                case LPAREN:
                case LBRACK:
                case NOT0:
                case NOT1:
                case EMPTY:
                case MINUS:
                case IDENTIFIER: {
                    MapEntry();
                    label_18:
                    while (true) {
                        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                            case COMMA: {
                                ;
                                break;
                            }
                            default:
                                jj_la1[52] = jj_gen;
                                break label_18;
                        }
                        jj_consume_token(COMMA);
                        MapEntry();
                    }
                    break;
                }
                default:
                    jj_la1[53] = jj_gen;
                    ;
            }
            jj_consume_token(RBRACE);
        } catch (Throwable jjte000) {
            if (jjtc000) {
                jjtree.clearNodeScope(jjtn000);
                jjtc000 = false;
            } else {
                jjtree.popNode();
            }
            if (jjte000 instanceof RuntimeException) {
                {
                    if (true) {
                        throw (RuntimeException) jjte000;
                    }
                }
            }
            if (jjte000 instanceof ParseException) {
                {
                    if (true) {
                        throw (ParseException) jjte000;
                    }
                }
            }
            {
                if (true) {
                    throw (Error) jjte000;
                }
            }
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    final public void MapEntry() throws ParseException {/* @bgen(jjtree) MapEntry */
        AstMapEntry jjtn000 = new AstMapEntry(JJTMAPENTRY);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        try {
            Expression();
            jj_consume_token(COLON);
            Expression();
        } catch (Throwable jjte000) {
            if (jjtc000) {
                jjtree.clearNodeScope(jjtn000);
                jjtc000 = false;
            } else {
                jjtree.popNode();
            }
            if (jjte000 instanceof RuntimeException) {
                {
                    if (true) {
                        throw (RuntimeException) jjte000;
                    }
                }
            }
            if (jjte000 instanceof ParseException) {
                {
                    if (true) {
                        throw (ParseException) jjte000;
                    }
                }
            }
            {
                if (true) {
                    throw (Error) jjte000;
                }
            }
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * Identifier Java Language Identifier
     */
    final public void Identifier() throws ParseException {/* @bgen(jjtree) Identifier */
        AstIdentifier jjtn000 = new AstIdentifier(JJTIDENTIFIER);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        Token t = null;
        try {
            t = jj_consume_token(IDENTIFIER);
            jjtree.closeNodeScope(jjtn000, true);
            jjtc000 = false;
            jjtn000.setImage(t.image);
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * Function Namespace:Name(a,b,c)
     */
    final public void Function() throws ParseException {/* @bgen(jjtree) Function */
        AstFunction jjtn000 = new AstFunction(JJTFUNCTION);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        Token t0 = null;
        Token t1 = null;
        try {
            t0 = jj_consume_token(IDENTIFIER);
            switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                case COLON: {
                    jj_consume_token(COLON);
                    t1 = jj_consume_token(IDENTIFIER);
                    break;
                }
                default:
                    jj_la1[54] = jj_gen;
                    ;
            }
            if (t1 != null) {
                jjtn000.setPrefix(t0.image);
                jjtn000.setLocalName(t1.image);
            } else {
                jjtn000.setLocalName(t0.image);
            }
            label_19:
            while (true) {
                MethodParameters();
                switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
                    case LPAREN: {
                        ;
                        break;
                    }
                    default:
                        jj_la1[55] = jj_gen;
                        break label_19;
                }
            }
        } catch (Throwable jjte000) {
            if (jjtc000) {
                jjtree.clearNodeScope(jjtn000);
                jjtc000 = false;
            } else {
                jjtree.popNode();
            }
            if (jjte000 instanceof RuntimeException) {
                {
                    if (true) {
                        throw (RuntimeException) jjte000;
                    }
                }
            }
            if (jjte000 instanceof ParseException) {
                {
                    if (true) {
                        throw (ParseException) jjte000;
                    }
                }
            }
            {
                if (true) {
                    throw (Error) jjte000;
                }
            }
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * Literal Reserved Keywords
     */
    final public void Literal() throws ParseException {
        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
            case TRUE:
            case FALSE: {
                Boolean();
                break;
            }
            case FLOATING_POINT_LITERAL: {
                FloatingPoint();
                break;
            }
            case INTEGER_LITERAL: {
                Integer();
                break;
            }
            case STRING_LITERAL: {
                String();
                break;
            }
            case NULL: {
                Null();
                break;
            }
            default:
                jj_la1[56] = jj_gen;
                jj_consume_token(-1);
                throw new ParseException();
        }
    }

    /*
     * Boolean For 'true' 'false'
     */
    final public void Boolean() throws ParseException {
        switch ((jj_ntk == -1) ? jj_ntk_f() : jj_ntk) {
            case TRUE: {
                AstTrue jjtn001 = new AstTrue(JJTTRUE);
                boolean jjtc001 = true;
                jjtree.openNodeScope(jjtn001);
                try {
                    jj_consume_token(TRUE);
                } finally {
                    if (jjtc001) {
                        jjtree.closeNodeScope(jjtn001, true);
                    }
                }
                break;
            }
            case FALSE: {
                AstFalse jjtn002 = new AstFalse(JJTFALSE);
                boolean jjtc002 = true;
                jjtree.openNodeScope(jjtn002);
                try {
                    jj_consume_token(FALSE);
                } finally {
                    if (jjtc002) {
                        jjtree.closeNodeScope(jjtn002, true);
                    }
                }
                break;
            }
            default:
                jj_la1[57] = jj_gen;
                jj_consume_token(-1);
                throw new ParseException();
        }
    }

    /*
     * FloatingPoint For Decimal and Floating Point Literals
     */
    final public void FloatingPoint() throws ParseException {/* @bgen(jjtree) FloatingPoint */
        AstFloatingPoint jjtn000 = new AstFloatingPoint(JJTFLOATINGPOINT);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        Token t = null;
        try {
            t = jj_consume_token(FLOATING_POINT_LITERAL);
            jjtree.closeNodeScope(jjtn000, true);
            jjtc000 = false;
            jjtn000.setImage(t.image);
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * Integer For Simple Numeric Literals
     */
    final public void Integer() throws ParseException {/* @bgen(jjtree) Integer */
        AstInteger jjtn000 = new AstInteger(JJTINTEGER);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        Token t = null;
        try {
            t = jj_consume_token(INTEGER_LITERAL);
            jjtree.closeNodeScope(jjtn000, true);
            jjtc000 = false;
            jjtn000.setImage(t.image);
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * String For Quoted Literals
     */
    final public void String() throws ParseException {/* @bgen(jjtree) String */
        AstString jjtn000 = new AstString(JJTSTRING);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        Token t = null;
        try {
            t = jj_consume_token(STRING_LITERAL);
            jjtree.closeNodeScope(jjtn000, true);
            jjtc000 = false;
            jjtn000.setImage(t.image);
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    /*
     * Null For 'null'
     */
    final public void Null() throws ParseException {/* @bgen(jjtree) Null */
        AstNull jjtn000 = new AstNull(JJTNULL);
        boolean jjtc000 = true;
        jjtree.openNodeScope(jjtn000);
        try {
            jj_consume_token(NULL);
        } finally {
            if (jjtc000) {
                jjtree.closeNodeScope(jjtn000, true);
            }
        }
    }

    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);
        }
    }

    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);
        }
    }

    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);
        }
    }

    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);
        }
    }

    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);
        }
    }

    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);
        }
    }

    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);
        }
    }

    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);
        }
    }

    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);
        }
    }

    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);
        }
    }

    private boolean jj_3R_Equality_185_5_45() {
        if (jj_3R_Compare_199_5_48()) {
            return true;
        }
        Token xsp;
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_Equality_187_9_49()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_MapEntry_374_5_111() {
        if (jj_3R_Expression_95_5_33()) {
            return true;
        }
        if (jj_scan_token(COLON)) {
            return true;
        }
        if (jj_3R_Expression_95_5_33()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_MapData_368_11_109() {
        if (jj_3R_MapEntry_374_5_111()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_LambdaExpression_120_68_27() {
        if (jj_3R_Ternary_151_5_30()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_LambdaExpressionOrInvocation_140_45_28() {
        if (jj_3R_Ternary_151_5_30()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_SetData_349_26_34() {
        if (jj_scan_token(COMMA)) {
            return true;
        }
        if (jj_3R_Expression_95_5_33()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_MapData_367_5_103() {
        if (jj_scan_token(START_SET_OR_MAP)) {
            return true;
        }
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_MapData_368_11_109()) {
            jj_scanpos = xsp;
        }
        if (jj_scan_token(RBRACE)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_And_176_5_40() {
        if (jj_3R_Equality_185_5_45()) {
            return true;
        }
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_And_177_17_46()) {
            jj_scanpos = xsp;
        }
        return false;
    }

    private boolean jj_3R_Or_168_12_42() {
        Token xsp;
        if (jj_3R_Or_167_13_47()) {
            return true;
        }
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_Or_167_13_47()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_Or_167_13_47() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_scan_token(41)) {
            jj_scanpos = xsp;
            if (jj_scan_token(42)) {
                return true;
            }
        }
        if (jj_3R_And_176_5_40()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_ListData_356_11_108() {
        if (jj_3R_Expression_95_5_33()) {
            return true;
        }
        Token xsp;
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_ListData_356_26_113()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_LambdaParameters_128_46_41() {
        if (jj_scan_token(COMMA)) {
            return true;
        }
        if (jj_3R_Identifier_383_5_36()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Or_167_5_35() {
        if (jj_3R_And_176_5_40()) {
            return true;
        }
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_Or_168_12_42()) {
            jj_scanpos = xsp;
        }
        return false;
    }

    private boolean jj_3R_ListData_355_5_102() {
        if (jj_scan_token(LBRACK)) {
            return true;
        }
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_ListData_356_11_108()) {
            jj_scanpos = xsp;
        }
        if (jj_scan_token(RBRACK)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_SetData_349_11_29() {
        if (jj_3R_Expression_95_5_33()) {
            return true;
        }
        Token xsp;
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_SetData_349_26_34()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_Ternary_157_9_43() {
        if (jj_scan_token(QUESTIONMARK)) {
            return true;
        }
        if (jj_3R_Ternary_151_5_30()) {
            return true;
        }
        if (jj_scan_token(COLON)) {
            return true;
        }
        return false;
    }

    private boolean jj_3_6() {
        if (jj_scan_token(QUESTIONMARK)) {
            return true;
        }
        if (jj_scan_token(COLON)) {
            return true;
        }
        if (jj_3R_Ternary_151_5_30()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_MethodParameters_323_31_115() {
        if (jj_scan_token(COMMA)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Ternary_153_9_38() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3_5()) {
            jj_scanpos = xsp;
            if (jj_3_6()) {
                jj_scanpos = xsp;
                if (jj_3R_Ternary_157_9_43()) {
                    return true;
                }
            }
        }
        return false;
    }

    private boolean jj_3_5() {
        if (jj_scan_token(QUESTIONMARK)) {
            return true;
        }
        if (jj_scan_token(QUESTIONMARK)) {
            return true;
        }
        if (jj_3R_Ternary_151_5_30()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_SetData_348_5_24() {
        if (jj_scan_token(START_SET_OR_MAP)) {
            return true;
        }
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_SetData_349_11_29()) {
            jj_scanpos = xsp;
        }
        if (jj_scan_token(RBRACE)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_null_334_18_23() {
        if (jj_scan_token(IDENTIFIER)) {
            return true;
        }
        if (jj_scan_token(COLON)) {
            return true;
        }
        return false;
    }

    private boolean jj_3_9() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_null_334_18_23()) {
            jj_scanpos = xsp;
        }
        if (jj_scan_token(IDENTIFIER)) {
            return true;
        }
        if (jj_scan_token(LPAREN)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_LambdaParameters_128_31_37() {
        if (jj_3R_Identifier_383_5_36()) {
            return true;
        }
        Token xsp;
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_LambdaParameters_128_46_41()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_Ternary_151_5_30() {
        if (jj_3R_Or_167_5_35()) {
            return true;
        }
        Token xsp;
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_Ternary_153_9_38()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_NonLiteral_338_7_93() {
        if (jj_3R_MapData_367_5_103()) {
            return true;
        }
        return false;
    }

    private boolean jj_3_3() {
        if (jj_3R_LambdaExpression_120_5_21()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_NonLiteral_337_7_92() {
        if (jj_3R_ListData_355_5_102()) {
            return true;
        }
        return false;
    }

    private boolean jj_3_10() {
        if (jj_3R_SetData_348_5_24()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_NonLiteral_335_7_91() {
        if (jj_3R_Identifier_383_5_36()) {
            return true;
        }
        return false;
    }

    private boolean jj_3_4() {
        if (jj_3R_LambdaExpression_120_5_21()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_NonLiteral_334_7_90() {
        if (jj_3R_Function_396_5_101()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_NonLiteral_333_7_89() {
        if (jj_scan_token(LPAREN)) {
            return true;
        }
        if (jj_3R_Expression_95_5_33()) {
            return true;
        }
        if (jj_scan_token(RPAREN)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_MethodParameters_323_16_114() {
        if (jj_3R_Expression_95_5_33()) {
            return true;
        }
        Token xsp;
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_MethodParameters_323_31_115()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_LambdaParameters_128_20_32() {
        if (jj_scan_token(LPAREN)) {
            return true;
        }
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_LambdaParameters_128_31_37()) {
            jj_scanpos = xsp;
        }
        if (jj_scan_token(RPAREN)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_ValueSuffix_297_41_112() {
        if (jj_3R_MethodParameters_323_5_110()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_NonLiteral_332_5_81() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3_8()) {
            jj_scanpos = xsp;
            if (jj_3R_NonLiteral_333_7_89()) {
                jj_scanpos = xsp;
                if (jj_3R_NonLiteral_334_7_90()) {
                    jj_scanpos = xsp;
                    if (jj_3R_NonLiteral_335_7_91()) {
                        jj_scanpos = xsp;
                        if (jj_3_10()) {
                            jj_scanpos = xsp;
                            if (jj_3R_NonLiteral_337_7_92()) {
                                jj_scanpos = xsp;
                                if (jj_3R_NonLiteral_338_7_93()) {
                                    return true;
                                }
                            }
                        }
                    }
                }
            }
        }
        return false;
    }

    private boolean jj_3_8() {
        if (jj_3R_LambdaExpressionOrInvocation_137_5_22()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_LambdaExpressionOrInvocation_137_5_22() {
        if (jj_scan_token(LPAREN)) {
            return true;
        }
        if (jj_3R_LambdaParameters_128_5_26()) {
            return true;
        }
        if (jj_scan_token(ARROW)) {
            return true;
        }
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3_4()) {
            jj_scanpos = xsp;
            if (jj_3R_LambdaExpressionOrInvocation_140_45_28()) {
                return true;
            }
        }
        if (jj_scan_token(RPAREN)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_MethodParameters_323_5_110() {
        if (jj_scan_token(LPAREN)) {
            return true;
        }
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_MethodParameters_323_16_114()) {
            jj_scanpos = xsp;
        }
        if (jj_scan_token(RPAREN)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_LambdaParameters_128_5_31() {
        if (jj_3R_Identifier_383_5_36()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_LambdaParameters_128_5_26() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_LambdaParameters_128_5_31()) {
            jj_scanpos = xsp;
            if (jj_3R_LambdaParameters_128_20_32()) {
                return true;
            }
        }
        return false;
    }

    private boolean jj_3R_BracketSuffix_315_5_95() {
        if (jj_scan_token(LBRACK)) {
            return true;
        }
        if (jj_3R_Expression_95_5_33()) {
            return true;
        }
        if (jj_scan_token(RBRACK)) {
            return true;
        }
        return false;
    }

    private boolean jj_3_1() {
        if (jj_scan_token(ASSIGN)) {
            return true;
        }
        if (jj_3R_Assignment_111_5_20()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_ValueSuffix_297_21_83() {
        if (jj_3R_BracketSuffix_315_5_95()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_LambdaExpression_120_5_21() {
        if (jj_3R_LambdaParameters_128_5_26()) {
            return true;
        }
        if (jj_scan_token(ARROW)) {
            return true;
        }
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3_3()) {
            jj_scanpos = xsp;
            if (jj_3R_LambdaExpression_120_68_27()) {
                return true;
            }
        }
        return false;
    }

    private boolean jj_3R_Semicolon_103_20_44() {
        if (jj_scan_token(SEMICOLON)) {
            return true;
        }
        if (jj_3R_Assignment_111_5_20()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_DotSuffix_306_5_94() {
        if (jj_scan_token(DOT)) {
            return true;
        }
        if (jj_scan_token(IDENTIFIER)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Assignment_112_5_25() {
        if (jj_3R_Ternary_151_5_30()) {
            return true;
        }
        Token xsp;
        while (true) {
            xsp = jj_scanpos;
            if (jj_3_1()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3_2() {
        if (jj_3R_LambdaExpression_120_5_21()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Assignment_111_5_20() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3_2()) {
            jj_scanpos = xsp;
            if (jj_3R_Assignment_112_5_25()) {
                return true;
            }
        }
        return false;
    }

    private boolean jj_3R_ValueSuffix_297_7_82() {
        if (jj_3R_DotSuffix_306_5_94()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_ValueSuffix_297_5_79() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_ValueSuffix_297_7_82()) {
            jj_scanpos = xsp;
            if (jj_3R_ValueSuffix_297_21_83()) {
                return true;
            }
        }
        xsp = jj_scanpos;
        if (jj_3R_ValueSuffix_297_41_112()) {
            jj_scanpos = xsp;
        }
        return false;
    }

    private boolean jj_3R_Value_278_21_76() {
        if (jj_3R_ValueSuffix_297_5_79()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Semicolon_103_5_39() {
        if (jj_3R_Assignment_111_5_20()) {
            return true;
        }
        Token xsp;
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_Semicolon_103_20_44()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_ValuePrefix_288_7_78() {
        if (jj_3R_NonLiteral_332_5_81()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_ValuePrefix_287_5_77() {
        if (jj_3R_Literal_414_5_80()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_ValuePrefix_287_5_75() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_ValuePrefix_287_5_77()) {
            jj_scanpos = xsp;
            if (jj_3R_ValuePrefix_288_7_78()) {
                return true;
            }
        }
        return false;
    }

    private boolean jj_3R_Expression_95_5_33() {
        if (jj_3R_Semicolon_103_5_39()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Value_278_5_74() {
        if (jj_3R_ValuePrefix_287_5_75()) {
            return true;
        }
        Token xsp;
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_Value_278_21_76()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_Null_464_5_100() {
        if (jj_scan_token(NULL)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Unary_269_9_70() {
        if (jj_3R_Value_278_5_74()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Unary_267_9_69() {
        if (jj_scan_token(EMPTY)) {
            return true;
        }
        if (jj_3R_Unary_260_9_63()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Unary_265_9_68() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_scan_token(37)) {
            jj_scanpos = xsp;
            if (jj_scan_token(38)) {
                return true;
            }
        }
        if (jj_3R_Unary_260_9_63()) {
            return true;
        }
        return false;
    }

    private boolean jj_3_7() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_scan_token(37)) {
            jj_scanpos = xsp;
            if (jj_scan_token(38)) {
                return true;
            }
        }
        if (jj_scan_token(EMPTY)) {
            return true;
        }
        if (jj_3R_Unary_260_9_63()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_String_455_5_99() {
        if (jj_scan_token(STRING_LITERAL)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Unary_260_9_63() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_Unary_260_9_67()) {
            jj_scanpos = xsp;
            if (jj_3_7()) {
                jj_scanpos = xsp;
                if (jj_3R_Unary_265_9_68()) {
                    jj_scanpos = xsp;
                    if (jj_3R_Unary_267_9_69()) {
                        jj_scanpos = xsp;
                        if (jj_3R_Unary_269_9_70()) {
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }

    private boolean jj_3R_Unary_260_9_67() {
        if (jj_scan_token(MINUS)) {
            return true;
        }
        if (jj_3R_Unary_260_9_63()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Integer_446_5_98() {
        if (jj_scan_token(INTEGER_LITERAL)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Multiplication_250_9_73() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_scan_token(50)) {
            jj_scanpos = xsp;
            if (jj_scan_token(51)) {
                return true;
            }
        }
        if (jj_3R_Unary_260_9_63()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Multiplication_248_9_72() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_scan_token(48)) {
            jj_scanpos = xsp;
            if (jj_scan_token(49)) {
                return true;
            }
        }
        if (jj_3R_Unary_260_9_63()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Multiplication_246_9_64() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_Multiplication_246_9_71()) {
            jj_scanpos = xsp;
            if (jj_3R_Multiplication_248_9_72()) {
                jj_scanpos = xsp;
                if (jj_3R_Multiplication_250_9_73()) {
                    return true;
                }
            }
        }
        return false;
    }

    private boolean jj_3R_Multiplication_246_9_71() {
        if (jj_scan_token(MULT)) {
            return true;
        }
        if (jj_3R_Unary_260_9_63()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_FloatingPoint_437_5_97() {
        if (jj_scan_token(FLOATING_POINT_LITERAL)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Multiplication_244_5_61() {
        if (jj_3R_Unary_260_9_63()) {
            return true;
        }
        Token xsp;
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_Multiplication_246_9_64()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_Boolean_429_7_105() {
        if (jj_scan_token(FALSE)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Math_234_9_66() {
        if (jj_scan_token(MINUS)) {
            return true;
        }
        if (jj_3R_Multiplication_244_5_61()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Boolean_427_5_104() {
        if (jj_scan_token(TRUE)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Boolean_427_5_96() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_Boolean_427_5_104()) {
            jj_scanpos = xsp;
            if (jj_3R_Boolean_429_7_105()) {
                return true;
            }
        }
        return false;
    }

    private boolean jj_3R_Math_232_9_62() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_Math_232_9_65()) {
            jj_scanpos = xsp;
            if (jj_3R_Math_234_9_66()) {
                return true;
            }
        }
        return false;
    }

    private boolean jj_3R_Math_232_9_65() {
        if (jj_scan_token(PLUS)) {
            return true;
        }
        if (jj_3R_Multiplication_244_5_61()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Math_230_5_55() {
        if (jj_3R_Multiplication_244_5_61()) {
            return true;
        }
        Token xsp;
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_Math_232_9_62()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_Literal_418_7_88() {
        if (jj_3R_Null_464_5_100()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Literal_417_7_87() {
        if (jj_3R_String_455_5_99()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Literal_416_7_86() {
        if (jj_3R_Integer_446_5_98()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Literal_415_7_85() {
        if (jj_3R_FloatingPoint_437_5_97()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Concatenation_220_10_56() {
        if (jj_scan_token(CONCAT)) {
            return true;
        }
        if (jj_3R_Math_230_5_55()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Function_396_24_106() {
        if (jj_scan_token(COLON)) {
            return true;
        }
        if (jj_scan_token(IDENTIFIER)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Literal_414_5_84() {
        if (jj_3R_Boolean_427_5_96()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Literal_414_5_80() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_Literal_414_5_84()) {
            jj_scanpos = xsp;
            if (jj_3R_Literal_415_7_85()) {
                jj_scanpos = xsp;
                if (jj_3R_Literal_416_7_86()) {
                    jj_scanpos = xsp;
                    if (jj_3R_Literal_417_7_87()) {
                        jj_scanpos = xsp;
                        if (jj_3R_Literal_418_7_88()) {
                            return true;
                        }
                    }
                }
            }
        }
        return false;
    }

    private boolean jj_3R_Concatenation_218_6_51() {
        if (jj_3R_Math_230_5_55()) {
            return true;
        }
        Token xsp;
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_Concatenation_220_10_56()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_Function_405_7_107() {
        if (jj_3R_MethodParameters_323_5_110()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Compare_207_9_60() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_scan_token(29)) {
            jj_scanpos = xsp;
            if (jj_scan_token(30)) {
                return true;
            }
        }
        if (jj_3R_Concatenation_218_6_51()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Compare_205_9_59() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_scan_token(31)) {
            jj_scanpos = xsp;
            if (jj_scan_token(32)) {
                return true;
            }
        }
        if (jj_3R_Concatenation_218_6_51()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Compare_203_9_58() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_scan_token(25)) {
            jj_scanpos = xsp;
            if (jj_scan_token(26)) {
                return true;
            }
        }
        if (jj_3R_Concatenation_218_6_51()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Function_396_5_101() {
        if (jj_scan_token(IDENTIFIER)) {
            return true;
        }
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_Function_396_24_106()) {
            jj_scanpos = xsp;
        }
        if (jj_3R_Function_405_7_107()) {
            return true;
        }
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_Function_405_7_107()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_Compare_201_9_52() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_Compare_201_9_57()) {
            jj_scanpos = xsp;
            if (jj_3R_Compare_203_9_58()) {
                jj_scanpos = xsp;
                if (jj_3R_Compare_205_9_59()) {
                    jj_scanpos = xsp;
                    if (jj_3R_Compare_207_9_60()) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    private boolean jj_3R_Compare_201_9_57() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_scan_token(27)) {
            jj_scanpos = xsp;
            if (jj_scan_token(28)) {
                return true;
            }
        }
        if (jj_3R_Concatenation_218_6_51()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Compare_199_5_48() {
        if (jj_3R_Concatenation_218_6_51()) {
            return true;
        }
        Token xsp;
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_Compare_201_9_52()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_Equality_189_9_54() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_scan_token(35)) {
            jj_scanpos = xsp;
            if (jj_scan_token(36)) {
                return true;
            }
        }
        if (jj_3R_Compare_199_5_48()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Identifier_383_5_36() {
        if (jj_scan_token(IDENTIFIER)) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_Equality_187_9_49() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_3R_Equality_187_9_53()) {
            jj_scanpos = xsp;
            if (jj_3R_Equality_189_9_54()) {
                return true;
            }
        }
        return false;
    }

    private boolean jj_3R_Equality_187_9_53() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_scan_token(33)) {
            jj_scanpos = xsp;
            if (jj_scan_token(34)) {
                return true;
            }
        }
        if (jj_3R_Compare_199_5_48()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_And_177_17_46() {
        Token xsp;
        if (jj_3R_And_176_18_50()) {
            return true;
        }
        while (true) {
            xsp = jj_scanpos;
            if (jj_3R_And_176_18_50()) {
                jj_scanpos = xsp;
                break;
            }
        }
        return false;
    }

    private boolean jj_3R_And_176_18_50() {
        Token xsp;
        xsp = jj_scanpos;
        if (jj_scan_token(39)) {
            jj_scanpos = xsp;
            if (jj_scan_token(40)) {
                return true;
            }
        }
        if (jj_3R_Equality_185_5_45()) {
            return true;
        }
        return false;
    }

    private boolean jj_3R_ListData_356_26_113() {
        if (jj_scan_token(COMMA)) {
            return true;
        }
        if (jj_3R_Expression_95_5_33()) {
            return true;
        }
        return false;
    }

    /** Generated Token Manager. */
    public ELParserTokenManager token_source;
    SimpleCharStream jj_input_stream;
    /** Current token. */
    public Token token;
    /** Next token. */
    public Token jj_nt;
    private int jj_ntk;
    private Token jj_scanpos, jj_lastpos;
    private int jj_la;
    private int jj_gen;
    final private int[] jj_la1 = new int[58];
    static private int[] jj_la1_0;
    static private int[] jj_la1_1;
    static {
        jj_la1_init_0();
        jj_la1_init_1();
    }

    private static void jj_la1_init_0() {
        jj_la1_0 = new int[] { 0xe, 0xe, 0x800000, 0x15ed00, 0x15ed00, 0x1000000, 0x0, 0x40000, 0x15ed00, 0x40000, 0x0,
                0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfe000000, 0x18000000, 0x6000000, 0x80000000,
                0x60000000, 0xfe000000, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x15ed00, 0x120000, 0x15ed00,
                0x120000, 0x40000, 0x1000000, 0x15ed00, 0x40000, 0x0, 0x100100, 0x1000000, 0x15ed00, 0x1000000,
                0x15ed00, 0x1000000, 0x15ed00, 0x400000, 0x40000, 0x1ec00, 0xc000, };
    }

    private static void jj_la1_init_1() {
        jj_la1_1 = new int[] { 0x0, 0x0, 0x0, 0x804860, 0x804860, 0x0, 0x800000, 0x800000, 0x804860, 0x0, 0x8000,
                0x8000, 0x600, 0x600, 0x600, 0x180, 0x180, 0x180, 0x1e, 0x6, 0x18, 0x1e, 0x1, 0x0, 0x0, 0x1, 0x0, 0x1,
                0x100000, 0x6000, 0x6000, 0xf1000, 0x30000, 0xc0000, 0xf1000, 0x60, 0x60, 0x4000, 0x800860, 0x0,
                0x800000, 0x0, 0x0, 0x0, 0x804860, 0x0, 0x800000, 0x0, 0x0, 0x804860, 0x0, 0x804860, 0x0, 0x804860, 0x0,
                0x0, 0x0, 0x0, };
    }

    final private JJCalls[] jj_2_rtns = new JJCalls[10];
    private boolean jj_rescan = false;
    private int jj_gc = 0;

    /** Constructor with InputStream. */
    public ELParser(java.io.InputStream stream) {
        this(stream, null);
    }

    /** Constructor with InputStream and supplied encoding */
    public ELParser(java.io.InputStream stream, String encoding) {
        try {
            jj_input_stream = new SimpleCharStream(stream, encoding, 1, 1);
        } catch (java.io.UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        token_source = new ELParserTokenManager(jj_input_stream);
        token = new Token();
        jj_ntk = -1;
        jj_gen = 0;
        for (int i = 0; i < 58; i++) {
            jj_la1[i] = -1;
        }
        for (int i = 0; i < jj_2_rtns.length; i++) {
            jj_2_rtns[i] = new JJCalls();
        }
    }

    /** Reinitialise. */
    public void ReInit(java.io.InputStream stream) {
        ReInit(stream, null);
    }

    /** Reinitialise. */
    public void ReInit(java.io.InputStream stream, String encoding) {
        try {
            jj_input_stream.ReInit(stream, encoding, 1, 1);
        } catch (java.io.UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        token_source.ReInit(jj_input_stream);
        token = new Token();
        jj_ntk = -1;
        jjtree.reset();
        jj_gen = 0;
        for (int i = 0; i < 58; i++) {
            jj_la1[i] = -1;
        }
        for (int i = 0; i < jj_2_rtns.length; i++) {
            jj_2_rtns[i] = new JJCalls();
        }
    }

    /** Constructor. */
    public ELParser(java.io.Reader stream) {
        jj_input_stream = new SimpleCharStream(stream, 1, 1);
        token_source = new ELParserTokenManager(jj_input_stream);
        token = new Token();
        jj_ntk = -1;
        jj_gen = 0;
        for (int i = 0; i < 58; i++) {
            jj_la1[i] = -1;
        }
        for (int i = 0; i < jj_2_rtns.length; i++) {
            jj_2_rtns[i] = new JJCalls();
        }
    }

    /** Reinitialise. */
    public void ReInit(java.io.Reader stream) {
        if (jj_input_stream == null) {
            jj_input_stream = new SimpleCharStream(stream, 1, 1);
        } else {
            jj_input_stream.ReInit(stream, 1, 1);
        }
        if (token_source == null) {
            token_source = new ELParserTokenManager(jj_input_stream);
        }

        token_source.ReInit(jj_input_stream);
        token = new Token();
        jj_ntk = -1;
        jjtree.reset();
        jj_gen = 0;
        for (int i = 0; i < 58; i++) {
            jj_la1[i] = -1;
        }
        for (int i = 0; i < jj_2_rtns.length; i++) {
            jj_2_rtns[i] = new JJCalls();
        }
    }

    /** Constructor with generated Token Manager. */
    public ELParser(ELParserTokenManager tm) {
        token_source = tm;
        token = new Token();
        jj_ntk = -1;
        jj_gen = 0;
        for (int i = 0; i < 58; i++) {
            jj_la1[i] = -1;
        }
        for (int i = 0; i < jj_2_rtns.length; i++) {
            jj_2_rtns[i] = new JJCalls();
        }
    }

    /** Reinitialise. */
    public void ReInit(ELParserTokenManager tm) {
        token_source = tm;
        token = new Token();
        jj_ntk = -1;
        jjtree.reset();
        jj_gen = 0;
        for (int i = 0; i < 58; i++) {
            jj_la1[i] = -1;
        }
        for (int i = 0; i < jj_2_rtns.length; i++) {
            jj_2_rtns[i] = new JJCalls();
        }
    }

    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();
    }

    @SuppressWarnings("serial")
    static private final class LookaheadSuccess extends java.lang.Error {
        @Override
        public Throwable fillInStackTrace() {
            return this;
        }
    }

    static private final LookaheadSuccess jj_ls = new LookaheadSuccess();

    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;
    }


    /** Get the next Token. */
    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;
    }

    /** Get the specific Token. */
    final public Token getToken(int index) {
        Token t = token;
        for (int i = 0; i < index; i++) {
            if (t.next != null) {
                t = t.next;
            } else {
                t = t.next = token_source.getNextToken();
            }
        }
        return t;
    }

    private int jj_ntk_f() {
        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.List<int[]> jj_expentries = new java.util.ArrayList<int[]>();
    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];
            }

            for (int[] oldentry : jj_expentries) {
                if (oldentry.length == jj_expentry.length) {
                    boolean isMatched = true;

                    for (int i = 0; i < jj_expentry.length; i++) {
                        if (oldentry[i] != jj_expentry[i]) {
                            isMatched = false;
                            break;
                        }

                    }
                    if (isMatched) {
                        jj_expentries.add(jj_expentry);
                        break;
                    }
                }
            }

            if (pos != 0) {
                jj_lasttokens[(jj_endpos = pos) - 1] = kind;
            }
        }
    }

    /** Generate ParseException. */
    public ParseException generateParseException() {
        jj_expentries.clear();
        boolean[] la1tokens = new boolean[59];
        if (jj_kind >= 0) {
            la1tokens[jj_kind] = true;
            jj_kind = -1;
        }
        for (int i = 0; i < 58; 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;
                    }
                }
            }
        }
        for (int i = 0; i < 59; i++) {
            if (la1tokens[i]) {
                jj_expentry = new int[1];
                jj_expentry[0] = i;
                jj_expentries.add(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] = jj_expentries.get(i);
        }
        return new ParseException(token, exptokseq, tokenImage);
    }

    private boolean trace_enabled;

    /** Trace enabled. */
    final public boolean trace_enabled() {
        return trace_enabled;
    }

    /** Enable tracing. */
    final public void enable_tracing() {
    }

    /** Disable tracing. */
    final public void disable_tracing() {
    }

    private void jj_rescan_token() {
        jj_rescan = true;
        for (int i = 0; i < 10; i++) {
            try {
                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;
                        }
                    }
                    p = p.next;
                } while (p != null);

            } catch (LookaheadSuccess ls) {
            }
        }
        jj_rescan = false;
    }

    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;
    }

}
