All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.sandius.rembulan.parser.Parser Maven / Gradle / Ivy

The newest version!
/* Parser.java */
/* Generated By:JavaCC: Do not edit this line. Parser.java */
package net.sandius.rembulan.parser;

import net.sandius.rembulan.parser.ast.*;
import net.sandius.rembulan.util.Check;

import java.util.*;

import static java.util.Collections.*;

public class Parser implements ParserConstants {

        private static SourceInfo src(Token t) {
                return new SourceInfo(t.beginLine, t.beginColumn);
        }

        private static Attributes attr(Token t) {
                return Attributes.of(src(t));
        }

        private static List none() {
                return Collections.emptyList();
        }

        private static List one(BodyStatement v) {
                return Collections.singletonList(v);
        }

        private static List pair(BodyStatement u, BodyStatement v) {
                List l = new ArrayList();
                l.add(u);
                l.add(v);
                return Collections.unmodifiableList(l);
        }

        private static List toNameList(List> names) {
                List ns = new ArrayList();
                for (SourceElement sn : names) {
                        ns.add(sn.element());
                }
                return Collections.unmodifiableList(ns);
        }

        private static List prependName(Name n, List names) {
                List ns = new ArrayList();
                ns.add(Check.notNull(n));
                ns.addAll(Check.notNull(names));
                return Collections.unmodifiableList(ns);
        }

  final public SourceElement SrcName() throws ParseException {Token t;
    t = jj_consume_token(NAME);
{if ("" != null) return new SourceElement(src(t), Name.fromString(t.image));}
    throw new Error("Missing return statement in function");
  }

  final public Name Name() throws ParseException {SourceElement sn;
    sn = SrcName();
{if ("" != null) return sn.element();}
    throw new Error("Missing return statement in function");
  }

  final public SourceElement Str() throws ParseException {Token t, u;
        StringBuilder bld;
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case LITERAL_STRING:{
      t = jj_consume_token(LITERAL_STRING);
{if ("" != null) return new SourceElement(src(t), StringLiteral.fromString(t.image));}
      break;
      }
    case LL_BEGIN:{
      t = jj_consume_token(LL_BEGIN);
bld = new StringBuilder();
      label_1:
      while (true) {
        u = jj_consume_token(LL_TAIL);
bld.append(u.image);
        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
        case LL_TAIL:{
          ;
          break;
          }
        default:
          jj_la1[0] = jj_gen;
          break label_1;
        }
      }
// skip the closing bracket
                        bld.setLength(bld.length() - t.image.length());

                        {if ("" != null) return new SourceElement(
                                        src(t),
                                        // skip the leading newline if there is one
                                        StringLiteral.verbatim(bld.length() > 0 && bld.charAt(0) == '\n'
                                                        ? bld.substring(1)
                                                        : bld.toString()));}
      break;
      }
    default:
      jj_la1[1] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
    throw new Error("Missing return statement in function");
  }

  final public SourceElement Num() throws ParseException {Token t;
    t = jj_consume_token(NUMERAL);
{if ("" != null) return new SourceElement(src(t), Numeral.fromString(t.image));}
    throw new Error("Missing return statement in function");
  }

// FIXME: remove when done?
  final public void Eof() throws ParseException {
    jj_consume_token(0);
  }

  final public Chunk Chunk() throws ParseException {Block b;
    b = Block();
    jj_consume_token(0);
{if ("" != null) return new Chunk(b);}
    throw new Error("Missing return statement in function");
  }

  final public Block Block() throws ParseException {List ss;
        List stats = new ArrayList();
        ReturnStatement ret = null;
    label_2:
    while (true) {
      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
      case BREAK:
      case DO:
      case FOR:
      case FUNCTION:
      case GOTO:
      case IF:
      case LOCAL:
      case REPEAT:
      case WHILE:
      case NAME:
      case PAREN_OPEN:
      case DOUBLE_COLON:
      case SEMICOLON:{
        ;
        break;
        }
      default:
        jj_la1[2] = jj_gen;
        break label_2;
      }
      ss = BodyStatement();
stats.addAll(ss);
    }
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case RETURN:{
      ret = ReturnStatement();
      break;
      }
    default:
      jj_la1[3] = jj_gen;
      ;
    }
{if ("" != null) return new Block(Collections.unmodifiableList(stats), ret);}
    throw new Error("Missing return statement in function");
  }

  final public List BodyStatement() throws ParseException {Token t, u;

        Name n, m = null;
        Expr e, f;
        Expr g = null;
        Block b;

        FunctionDefExpr fb;

        List vars;
        List> names = new ArrayList>();
        List exprs = Collections.emptyList();

        BodyStatement s;
        List ss = new ArrayList();

        SourceElement sn;

        FunctionNameBuilder fnb = null;
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case SEMICOLON:{
      jj_consume_token(SEMICOLON);
{if ("" != null) return none();}
      break;
      }
    case NAME:
    case PAREN_OPEN:{
      s = AssignOrCall();
{if ("" != null) return one(s);}
      break;
      }
    case DOUBLE_COLON:{
      t = jj_consume_token(DOUBLE_COLON);
      n = Name();
      jj_consume_token(DOUBLE_COLON);
{if ("" != null) return one(Statements.labelStatement(src(t), n));}
      break;
      }
    case BREAK:{
      t = jj_consume_token(BREAK);
{if ("" != null) return one(Statements.breakStatement(src(t)));}
      break;
      }
    case GOTO:{
      t = jj_consume_token(GOTO);
      n = Name();
{if ("" != null) return one(Statements.gotoStatement(src(t), n));}
      break;
      }
    case DO:{
      t = jj_consume_token(DO);
      b = Block();
      jj_consume_token(END);
{if ("" != null) return one(Statements.doStatement(src(t), b));}
      break;
      }
    case WHILE:{
      t = jj_consume_token(WHILE);
      e = Expr();
      jj_consume_token(DO);
      b = Block();
      jj_consume_token(END);
{if ("" != null) return one(Statements.whileStatement(src(t), e, b));}
      break;
      }
    case REPEAT:{
      t = jj_consume_token(REPEAT);
      b = Block();
      jj_consume_token(UNTIL);
      e = Expr();
{if ("" != null) return one(Statements.repeatUntilStatement(src(t), e, b));}
      break;
      }
    case IF:{
      s = IfStatement();
{if ("" != null) return one(s);}
      break;
      }
    default:
      jj_la1[8] = jj_gen;
      if (jj_2_1(3)) {
        t = jj_consume_token(FOR);
        n = Name();
        jj_consume_token(ASSIGN);
        e = Expr();
        jj_consume_token(COMMA);
        f = Expr();
        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
        case COMMA:{
          jj_consume_token(COMMA);
          g = Expr();
          break;
          }
        default:
          jj_la1[4] = jj_gen;
          ;
        }
        jj_consume_token(DO);
        b = Block();
        jj_consume_token(END);
{if ("" != null) return one(Statements.numericForStatement(src(t), n, e, f, g, b));}
      } else {
        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
        case FOR:{
          t = jj_consume_token(FOR);
          names = NameList();
          jj_consume_token(IN);
          exprs = ExprList();
          jj_consume_token(DO);
          b = Block();
          jj_consume_token(END);
{if ("" != null) return one(Statements.genericForStatement(src(t), toNameList(names), exprs, b));}
          break;
          }
        case FUNCTION:{
          t = jj_consume_token(FUNCTION);
          sn = SrcName();
fnb = new FunctionNameBuilder(sn);
          label_3:
          while (true) {
            switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
            case DOT:{
              ;
              break;
              }
            default:
              jj_la1[5] = jj_gen;
              break label_3;
            }
            u = jj_consume_token(DOT);
            sn = SrcName();
fnb.addDotName(src(u), sn);
          }
          switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
          case COLON:{
            u = jj_consume_token(COLON);
            sn = SrcName();
fnb.addColonName(src(u), sn);
            break;
            }
          default:
            jj_la1[6] = jj_gen;
            ;
          }
          fb = FunctionBody();
{
                        FunctionDefExpr.Params params = fb.params();
                        Block blk = fb.block();

                        if (fnb.isMethod()) {
                                // defining a method: change fb's signature by prepending a "self" field
                                params = params.update(prependName(Name.fromString("self"), params.names()), params.isVararg());
                        }

                        // re-instantiate with adjusted param list and source information
                        fb = Exprs.functionDef(src(t), params, blk);
                }

                {if ("" != null) return one(Statements.assignStatement(src(t), fnb.get(), fb));}
          break;
          }
        default:
          jj_la1[9] = jj_gen;
          if (jj_2_2(2)) {
            t = jj_consume_token(LOCAL);
            u = jj_consume_token(FUNCTION);
            sn = SrcName();
            fb = FunctionBody();
{if ("" != null) return pair(
                                Statements.localDeclStatement(src(t), sn.element()),
                                Statements.assignStatement(src(t),
                                                Collections.singletonList(Exprs.var(sn.sourceInfo(), sn.element())),
                                                Collections.singletonList(Exprs.functionDef(src(u), fb.params(), fb.block()))));}
          } else {
            switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
            case LOCAL:{
              t = jj_consume_token(LOCAL);
              names = NameList();
              switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
              case ASSIGN:{
                jj_consume_token(ASSIGN);
                exprs = ExprList();
                break;
                }
              default:
                jj_la1[7] = jj_gen;
                ;
              }
{if ("" != null) return one(Statements.localDeclStatement(src(t), toNameList(names), exprs));}
              break;
              }
            default:
              jj_la1[10] = jj_gen;
              jj_consume_token(-1);
              throw new ParseException();
            }
          }
        }
      }
    }
    throw new Error("Missing return statement in function");
  }

  final public Expr Expr() throws ParseException {SourceElement uop;
        SourceElement bop;
        Expr e;

        ExprBuilder bld = new ExprBuilder();
    label_4:
    while (true) {
      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
      case NOT:
      case MINUS:
      case LEN:
      case BNOT:{
        ;
        break;
        }
      default:
        jj_la1[11] = jj_gen;
        break label_4;
      }
      uop = UnOp();
bld.addOp(uop.sourceInfo(), uop.element());
    }
    e = SimpleExpr();
bld.addExpr(e);
    label_5:
    while (true) {
      if (jj_2_3(2)) {
        ;
      } else {
        break label_5;
      }
      bop = BinOp();
bld.addOp(bop.sourceInfo(), bop.element());
      label_6:
      while (true) {
        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
        case NOT:
        case MINUS:
        case LEN:
        case BNOT:{
          ;
          break;
          }
        default:
          jj_la1[12] = jj_gen;
          break label_6;
        }
        uop = UnOp();
bld.addOp(uop.sourceInfo(), uop.element());
      }
      e = SimpleExpr();
bld.addExpr(e);
    }
{if ("" != null) return bld.build();}
    throw new Error("Missing return statement in function");
  }

  final public Expr SimpleExpr() throws ParseException {Token t;
        SourceElement ss;
        SourceElement sn;
        Expr e;
        FunctionDefExpr fn;
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case NIL:{
      t = jj_consume_token(NIL);
{if ("" != null) return Exprs.literal(src(t), NilLiteral.INSTANCE);}
      break;
      }
    case FALSE:{
      t = jj_consume_token(FALSE);
{if ("" != null) return Exprs.literal(src(t), BooleanLiteral.FALSE);}
      break;
      }
    case TRUE:{
      t = jj_consume_token(TRUE);
{if ("" != null) return Exprs.literal(src(t), BooleanLiteral.TRUE);}
      break;
      }
    case NUMERAL:{
      sn = Num();
{if ("" != null) return Exprs.literal(sn.sourceInfo(), sn.element());}
      break;
      }
    case LL_BEGIN:
    case LITERAL_STRING:{
      ss = Str();
{if ("" != null) return Exprs.literal(ss.sourceInfo(), ss.element());}
      break;
      }
    case VARARGS:{
      t = jj_consume_token(VARARGS);
{if ("" != null) return Exprs.varargs(src(t));}
      break;
      }
    case FUNCTION:{
      t = jj_consume_token(FUNCTION);
      fn = FunctionBody();
{if ("" != null) return Exprs.functionDef(src(t), fn.params(), fn.block());}
      break;
      }
    case NAME:
    case PAREN_OPEN:{
      e = PrefixExpr();
{if ("" != null) return e;}
      break;
      }
    case CURLY_OPEN:{
      e = TableConstructor();
{if ("" != null) return e;}
      break;
      }
    default:
      jj_la1[13] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
    throw new Error("Missing return statement in function");
  }

  final public Expr PrefixExpr() throws ParseException {Expr e;
        PostfixOp op;
    e = VarExpr();
    label_7:
    while (true) {
      if (jj_2_4(2)) {
        ;
      } else {
        break label_7;
      }
      op = __PostfixOp();
e=op.on(e);
    }
{if ("" != null) return e;}
    throw new Error("Missing return statement in function");
  }

  final public Expr VarExpr() throws ParseException {SourceElement sn;
        Expr e;
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case NAME:{
      sn = SrcName();
{if ("" != null) return Exprs.var(sn.sourceInfo(), sn.element());}
      break;
      }
    case PAREN_OPEN:{
      jj_consume_token(PAREN_OPEN);
      e = Expr();
      jj_consume_token(PAREN_CLOSE);
{if ("" != null) return Exprs.paren(e);}
      break;
      }
    default:
      jj_la1[14] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
    throw new Error("Missing return statement in function");
  }

  final public PostfixOp __PostfixOp() throws ParseException {PostfixOp op;
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case SQUARE_OPEN:
    case DOT:{
      op = __FieldAccessOp();
{if ("" != null) return op;}
      break;
      }
    case LL_BEGIN:
    case LITERAL_STRING:
    case PAREN_OPEN:
    case CURLY_OPEN:
    case COLON:{
      op = __InvokeOp();
{if ("" != null) return op;}
      break;
      }
    default:
      jj_la1[15] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
    throw new Error("Missing return statement in function");
  }

  final public BodyStatement AssignOrCall() throws ParseException {Expr e;
        AssignRest ar;
    e = PrefixExpr();
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case ASSIGN:
    case COMMA:{
      ar = AssignOrCallRest();
if (e instanceof LValueExpr) {
                                {if ("" != null) return ar.prepend((LValueExpr) e);}
                        }
                        else {
                                {if (true) throw new ParseException("lvalue expected at line " + e.line());}
                        }
      break;
      }
    default:
      jj_la1[16] = jj_gen;
      ;
    }
if (e instanceof CallExpr) {
                        CallExpr ce = (CallExpr) e;
                        {if ("" != null) return Statements.callStatement(ce.sourceInfo(), ce);}
                }
                else {
                        {if (true) throw new ParseException("function call expected at line " + e.line());}
                }
    throw new Error("Missing return statement in function");
  }

  final public AssignRest AssignOrCallRest() throws ParseException {Token t;
        LValueExpr v;
        List vs = new ArrayList();
        List es;
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case ASSIGN:{
      // single assignment
              t = jj_consume_token(ASSIGN);
      es = ExprList();
{if ("" != null) return new AssignRest(src(t), es);}
      break;
      }
    case COMMA:{
      label_8:
      while (true) {
        jj_consume_token(COMMA);
        v = LValue();
vs.add(v);
        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
        case COMMA:{
          ;
          break;
          }
        default:
          jj_la1[17] = jj_gen;
          break label_8;
        }
      }
      t = jj_consume_token(ASSIGN);
      es = ExprList();
{if ("" != null) return new AssignRest(src(t), Collections.unmodifiableList(vs), es);}
      break;
      }
    default:
      jj_la1[18] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
    throw new Error("Missing return statement in function");
  }

  final public LValueExpr LValue() throws ParseException {SourceElement sn;
        Expr e;
//	PostfixOp.FieldAccess fa;

    //	LOOKAHEAD(2) sn=SrcName()  { return Exprs.var(sn.sourceInfo(), sn.element()); }
    //|	e=PrefixExpr() fa=__FieldAccessOp()  { return fa.on(e); }
    
            // FIXME: restrict this using syntactic rule instead
            e = PrefixExpr();
if (e instanceof LValueExpr) {if ("" != null) return (LValueExpr) e;} else {if (true) throw new ParseException("lvalue expected");}
    throw new Error("Missing return statement in function");
  }

  final public SourceElement> Args() throws ParseException {Token t;
        Expr e;
        SourceElement ss;
        List es = Collections.emptyList();
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case PAREN_OPEN:{
      t = jj_consume_token(PAREN_OPEN);
      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
      case LL_BEGIN:
      case FALSE:
      case FUNCTION:
      case NIL:
      case NOT:
      case TRUE:
      case NAME:
      case NUMERAL:
      case LITERAL_STRING:
      case MINUS:
      case LEN:
      case BNOT:
      case PAREN_OPEN:
      case CURLY_OPEN:
      case VARARGS:{
        es = ExprList();
        break;
        }
      default:
        jj_la1[19] = jj_gen;
        ;
      }
      jj_consume_token(PAREN_CLOSE);
{if ("" != null) return new SourceElement>(src(t), es);}
      break;
      }
    case CURLY_OPEN:{
      e = TableConstructor();
{if ("" != null) return new SourceElement>(e.sourceInfo(), Collections.singletonList(e));}
      break;
      }
    case LL_BEGIN:
    case LITERAL_STRING:{
      ss = Str();
{if ("" != null) return new SourceElement>(ss.sourceInfo(), Collections.singletonList(Exprs.literal(ss.sourceInfo(), ss.element())));}
      break;
      }
    default:
      jj_la1[20] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
    throw new Error("Missing return statement in function");
  }

  final public IfStatement IfStatement() throws ParseException {Token t;
        Expr e;
        Block b;
        ConditionalBlock ift;
        ArrayList elifs = new ArrayList();
        Block els = null;
    t = jj_consume_token(IF);
    e = Expr();
    jj_consume_token(THEN);
    b = Block();
ift = new ConditionalBlock(e, b);
    label_9:
    while (true) {
      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
      case ELSEIF:{
        ;
        break;
        }
      default:
        jj_la1[21] = jj_gen;
        break label_9;
      }
      jj_consume_token(ELSEIF);
      e = Expr();
      jj_consume_token(THEN);
      b = Block();
elifs.add(new ConditionalBlock(e, b));
    }
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case ELSE:{
      jj_consume_token(ELSE);
      els = Block();
      break;
      }
    default:
      jj_la1[22] = jj_gen;
      ;
    }
    jj_consume_token(END);
{if ("" != null) return Statements.ifStatement(src(t), ift, elifs, els);}
    throw new Error("Missing return statement in function");
  }

/*
	retstat ::= return [explist] [‘;’]
*/
  final public ReturnStatement ReturnStatement() throws ParseException {Token t;
        List exprs = Collections.emptyList();
    t = jj_consume_token(RETURN);
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case LL_BEGIN:
    case FALSE:
    case FUNCTION:
    case NIL:
    case NOT:
    case TRUE:
    case NAME:
    case NUMERAL:
    case LITERAL_STRING:
    case MINUS:
    case LEN:
    case BNOT:
    case PAREN_OPEN:
    case CURLY_OPEN:
    case VARARGS:{
      exprs = ExprList();
      break;
      }
    default:
      jj_la1[23] = jj_gen;
      ;
    }
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case SEMICOLON:{
      jj_consume_token(SEMICOLON);
      break;
      }
    default:
      jj_la1[24] = jj_gen;
      ;
    }
{if ("" != null) return Statements.returnStatement(src(t), exprs);}
    throw new Error("Missing return statement in function");
  }

  final public PostfixOp.FieldAccess __FieldAccessOp() throws ParseException {Token t;
        Expr e;
        SourceElement sn;
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case SQUARE_OPEN:{
      t = jj_consume_token(SQUARE_OPEN);
      e = Expr();
      jj_consume_token(SQUARE_CLOSE);
{if ("" != null) return new PostfixOp.FieldAccess(src(t), e);}
      break;
      }
    case DOT:{
      t = jj_consume_token(DOT);
      sn = SrcName();
{if ("" != null) return new PostfixOp.FieldAccess(src(t), Exprs.literal(sn.sourceInfo(), StringLiteral.fromName(sn.element())));}
      break;
      }
    default:
      jj_la1[25] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
    throw new Error("Missing return statement in function");
  }

  final public PostfixOp.Invoke __InvokeOp() throws ParseException {Name n;
        SourceElement> args;
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case LL_BEGIN:
    case LITERAL_STRING:
    case PAREN_OPEN:
    case CURLY_OPEN:{
      args = Args();
{if ("" != null) return new PostfixOp.Invoke(args, null);}
      break;
      }
    case COLON:{
      jj_consume_token(COLON);
      n = Name();
      args = Args();
{if ("" != null) return new PostfixOp.Invoke(args, n);}
      break;
      }
    default:
      jj_la1[26] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
    throw new Error("Missing return statement in function");
  }

  final public List> NameList() throws ParseException {SourceElement n;
        ArrayList> ns = new ArrayList>();
    n = SrcName();
ns.add(n);
    label_10:
    while (true) {
      if (jj_2_5(2)) {
        ;
      } else {
        break label_10;
      }
      jj_consume_token(COMMA);
      n = SrcName();
ns.add(n);
    }
{if ("" != null) return Collections.unmodifiableList(ns);}
    throw new Error("Missing return statement in function");
  }

  final public List ExprList() throws ParseException {Expr e;
        ArrayList es = new ArrayList();
    e = Expr();
es.add(e);
    label_11:
    while (true) {
      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
      case COMMA:{
        ;
        break;
        }
      default:
        jj_la1[27] = jj_gen;
        break label_11;
      }
      jj_consume_token(COMMA);
      e = Expr();
es.add(e);
    }
{if ("" != null) return Collections.unmodifiableList(es);}
    throw new Error("Missing return statement in function");
  }

  final public FunctionDefExpr FunctionBody() throws ParseException {Token t;
        FunctionDefExpr.Params params = FunctionDefExpr.Params.empty();
        Block block;
    t = jj_consume_token(PAREN_OPEN);
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case NAME:
    case VARARGS:{
      params = FunctionParams();
      break;
      }
    default:
      jj_la1[28] = jj_gen;
      ;
    }
    jj_consume_token(PAREN_CLOSE);
    block = Block();
    jj_consume_token(END);
{if ("" != null) return Exprs.functionDef(src(t), params, block);}
    throw new Error("Missing return statement in function");
  }

  final public FunctionDefExpr.Params FunctionParams() throws ParseException {List> params;
        boolean vararg = false;
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case NAME:{
      params = NameList();
      switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
      case COMMA:{
        jj_consume_token(COMMA);
        jj_consume_token(VARARGS);
vararg = true;
        break;
        }
      default:
        jj_la1[29] = jj_gen;
        ;
      }
{if ("" != null) return new FunctionDefExpr.Params(toNameList(params), vararg);}
      break;
      }
    case VARARGS:{
      jj_consume_token(VARARGS);
{if ("" != null) return new FunctionDefExpr.Params(Collections.emptyList(), true);}
      break;
      }
    default:
      jj_la1[30] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
    throw new Error("Missing return statement in function");
  }

  final public TableConstructorExpr TableConstructor() throws ParseException {Token t;
        TableConstructorExpr.FieldInitialiser fi;
        List fields = new ArrayList();
    t = jj_consume_token(CURLY_OPEN);
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case LL_BEGIN:
    case FALSE:
    case FUNCTION:
    case NIL:
    case NOT:
    case TRUE:
    case NAME:
    case NUMERAL:
    case LITERAL_STRING:
    case MINUS:
    case LEN:
    case BNOT:
    case PAREN_OPEN:
    case CURLY_OPEN:
    case SQUARE_OPEN:
    case VARARGS:{
      fields = FieldInitialiserList();
      break;
      }
    default:
      jj_la1[31] = jj_gen;
      ;
    }
    jj_consume_token(CURLY_CLOSE);
{if ("" != null) return Exprs.tableConstructor(src(t), fields);}
    throw new Error("Missing return statement in function");
  }

  final public void FieldSeparator() throws ParseException {
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case COMMA:{
      jj_consume_token(COMMA);
      break;
      }
    case SEMICOLON:{
      jj_consume_token(SEMICOLON);
      break;
      }
    default:
      jj_la1[32] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
  }

  final public List FieldInitialiserList() throws ParseException {TableConstructorExpr.FieldInitialiser f;
        ArrayList fs = new ArrayList();
    f = FieldInitialiser();
fs.add(f);
    label_12:
    while (true) {
      if (jj_2_6(2)) {
        ;
      } else {
        break label_12;
      }
      FieldSeparator();
      f = FieldInitialiser();
fs.add(f);
    }
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case SEMICOLON:
    case COMMA:{
      FieldSeparator();
      break;
      }
    default:
      jj_la1[33] = jj_gen;
      ;
    }
{if ("" != null) return Collections.unmodifiableList(fs);}
    throw new Error("Missing return statement in function");
  }

  final public TableConstructorExpr.FieldInitialiser FieldInitialiser() throws ParseException {Expr e, f;
        SourceElement sn;
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case SQUARE_OPEN:{
      jj_consume_token(SQUARE_OPEN);
      e = Expr();
      jj_consume_token(SQUARE_CLOSE);
      jj_consume_token(ASSIGN);
      f = Expr();
{if ("" != null) return Exprs.fieldInitialiser(e, f);}
      break;
      }
    default:
      jj_la1[34] = jj_gen;
      if (jj_2_7(2)) {
        sn = SrcName();
        jj_consume_token(ASSIGN);
        e = Expr();
{if ("" != null) return Exprs.fieldInitialiser(Exprs.literal(sn.sourceInfo(), StringLiteral.fromName(sn.element())), e);}
      } else {
        switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
        case LL_BEGIN:
        case FALSE:
        case FUNCTION:
        case NIL:
        case NOT:
        case TRUE:
        case NAME:
        case NUMERAL:
        case LITERAL_STRING:
        case MINUS:
        case LEN:
        case BNOT:
        case PAREN_OPEN:
        case CURLY_OPEN:
        case VARARGS:{
          e = Expr();
{if ("" != null) return Exprs.fieldInitialiser(null, e);}
          break;
          }
        default:
          jj_la1[35] = jj_gen;
          jj_consume_token(-1);
          throw new ParseException();
        }
      }
    }
    throw new Error("Missing return statement in function");
  }

/*
	binop ::=  ‘+’ | ‘-’ | ‘*’ | ‘/’ | ‘//’ | ‘^’ | ‘%’ |
		 ‘&’ | ‘~’ | ‘|’ | ‘>>’ | ‘<<’ | ‘..’ |
		 ‘<’ | ‘<=’ | ‘>’ | ‘>=’ | ‘==’ | ‘~=’ |
		 and | or
*/
  final public SourceElement BinOp() throws ParseException {Token t;
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case PLUS:{
      t = jj_consume_token(PLUS);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.ADD);}
      break;
      }
    case MINUS:{
      t = jj_consume_token(MINUS);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.SUB);}
      break;
      }
    case MUL:{
      t = jj_consume_token(MUL);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.MUL);}
      break;
      }
    case DIV:{
      t = jj_consume_token(DIV);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.DIV);}
      break;
      }
    case IDIV:{
      t = jj_consume_token(IDIV);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.IDIV);}
      break;
      }
    case POW:{
      t = jj_consume_token(POW);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.POW);}
      break;
      }
    case MOD:{
      t = jj_consume_token(MOD);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.MOD);}
      break;
      }
    case BAND:{
      t = jj_consume_token(BAND);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.BAND);}
      break;
      }
    case BNOT:{
      t = jj_consume_token(BNOT);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.BXOR);}
      break;
      }
    case BOR:{
      t = jj_consume_token(BOR);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.BOR);}
      break;
      }
    case SHR:{
      t = jj_consume_token(SHR);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.SHR);}
      break;
      }
    case SHL:{
      t = jj_consume_token(SHL);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.SHL);}
      break;
      }
    case DBL_DOT:{
      t = jj_consume_token(DBL_DOT);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.CONCAT);}
      break;
      }
    case LT:{
      t = jj_consume_token(LT);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.LT);}
      break;
      }
    case LE:{
      t = jj_consume_token(LE);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.LE);}
      break;
      }
    case GT:{
      t = jj_consume_token(GT);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.GT);}
      break;
      }
    case GE:{
      t = jj_consume_token(GE);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.GE);}
      break;
      }
    case EQ:{
      t = jj_consume_token(EQ);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.EQ);}
      break;
      }
    case NEQ:{
      t = jj_consume_token(NEQ);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.NEQ);}
      break;
      }
    case AND:{
      t = jj_consume_token(AND);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.AND);}
      break;
      }
    case OR:{
      t = jj_consume_token(OR);
{if ("" != null) return SourceElement.of(src(t), Operator.Binary.OR);}
      break;
      }
    default:
      jj_la1[36] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
    throw new Error("Missing return statement in function");
  }

/*
	unop ::= ‘-’ | not | ‘#’ | ‘~’
*/
  final public SourceElement UnOp() throws ParseException {Token t;
    switch ((jj_ntk==-1)?jj_ntk_f():jj_ntk) {
    case MINUS:{
      t = jj_consume_token(MINUS);
{if ("" != null) return SourceElement.of(src(t), Operator.Unary.UNM);}
      break;
      }
    case NOT:{
      t = jj_consume_token(NOT);
{if ("" != null) return SourceElement.of(src(t), Operator.Unary.NOT);}
      break;
      }
    case LEN:{
      t = jj_consume_token(LEN);
{if ("" != null) return SourceElement.of(src(t), Operator.Unary.LEN);}
      break;
      }
    case BNOT:{
      t = jj_consume_token(BNOT);
{if ("" != null) return SourceElement.of(src(t), Operator.Unary.BNOT);}
      break;
      }
    default:
      jj_la1[37] = jj_gen;
      jj_consume_token(-1);
      throw new ParseException();
    }
    throw new Error("Missing return statement in function");
  }

  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_3R_59()
 {
    if (jj_scan_token(BNOT)) return true;
    return false;
  }

  private boolean jj_3R_58()
 {
    if (jj_scan_token(LEN)) return true;
    return false;
  }

  private boolean jj_3R_57()
 {
    if (jj_scan_token(NOT)) return true;
    return false;
  }

  private boolean jj_3R_42()
 {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_56()) {
    jj_scanpos = xsp;
    if (jj_3R_57()) {
    jj_scanpos = xsp;
    if (jj_3R_58()) {
    jj_scanpos = xsp;
    if (jj_3R_59()) return true;
    }
    }
    }
    return false;
  }

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

  private boolean jj_3R_41()
 {
    if (jj_scan_token(OR)) return true;
    return false;
  }

  private boolean jj_3R_40()
 {
    if (jj_scan_token(AND)) return true;
    return false;
  }

  private boolean jj_3R_39()
 {
    if (jj_scan_token(NEQ)) return true;
    return false;
  }

  private boolean jj_3R_38()
 {
    if (jj_scan_token(EQ)) return true;
    return false;
  }

  private boolean jj_3R_37()
 {
    if (jj_scan_token(GE)) return true;
    return false;
  }

  private boolean jj_3R_36()
 {
    if (jj_scan_token(GT)) return true;
    return false;
  }

  private boolean jj_3R_85()
 {
    if (jj_scan_token(LL_TAIL)) return true;
    return false;
  }

  private boolean jj_3R_35()
 {
    if (jj_scan_token(LE)) return true;
    return false;
  }

  private boolean jj_3R_34()
 {
    if (jj_scan_token(LT)) return true;
    return false;
  }

  private boolean jj_3R_33()
 {
    if (jj_scan_token(DBL_DOT)) return true;
    return false;
  }

  private boolean jj_3_6()
 {
    if (jj_3R_19()) return true;
    if (jj_3R_20()) return true;
    return false;
  }

  private boolean jj_3R_32()
 {
    if (jj_scan_token(SHL)) return true;
    return false;
  }

  private boolean jj_3R_31()
 {
    if (jj_scan_token(SHR)) return true;
    return false;
  }

  private boolean jj_3R_30()
 {
    if (jj_scan_token(BOR)) return true;
    return false;
  }

  private boolean jj_3R_29()
 {
    if (jj_scan_token(BNOT)) return true;
    return false;
  }

  private boolean jj_3R_28()
 {
    if (jj_scan_token(BAND)) return true;
    return false;
  }

  private boolean jj_3R_27()
 {
    if (jj_scan_token(MOD)) return true;
    return false;
  }

  private boolean jj_3R_26()
 {
    if (jj_scan_token(POW)) return true;
    return false;
  }

  private boolean jj_3R_25()
 {
    if (jj_scan_token(IDIV)) return true;
    return false;
  }

  private boolean jj_3R_24()
 {
    if (jj_scan_token(DIV)) return true;
    return false;
  }

  private boolean jj_3R_23()
 {
    if (jj_scan_token(MUL)) return true;
    return false;
  }

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

  private boolean jj_3R_14()
 {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_21()) {
    jj_scanpos = xsp;
    if (jj_3R_22()) {
    jj_scanpos = xsp;
    if (jj_3R_23()) {
    jj_scanpos = xsp;
    if (jj_3R_24()) {
    jj_scanpos = xsp;
    if (jj_3R_25()) {
    jj_scanpos = xsp;
    if (jj_3R_26()) {
    jj_scanpos = xsp;
    if (jj_3R_27()) {
    jj_scanpos = xsp;
    if (jj_3R_28()) {
    jj_scanpos = xsp;
    if (jj_3R_29()) {
    jj_scanpos = xsp;
    if (jj_3R_30()) {
    jj_scanpos = xsp;
    if (jj_3R_31()) {
    jj_scanpos = xsp;
    if (jj_3R_32()) {
    jj_scanpos = xsp;
    if (jj_3R_33()) {
    jj_scanpos = xsp;
    if (jj_3R_34()) {
    jj_scanpos = xsp;
    if (jj_3R_35()) {
    jj_scanpos = xsp;
    if (jj_3R_36()) {
    jj_scanpos = xsp;
    if (jj_3R_37()) {
    jj_scanpos = xsp;
    if (jj_3R_38()) {
    jj_scanpos = xsp;
    if (jj_3R_39()) {
    jj_scanpos = xsp;
    if (jj_3R_40()) {
    jj_scanpos = xsp;
    if (jj_3R_41()) return true;
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    }
    return false;
  }

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

  private boolean jj_3R_60()
 {
    if (jj_scan_token(NUMERAL)) return true;
    return false;
  }

  private boolean jj_3R_55()
 {
    if (jj_3R_66()) return true;
    return false;
  }

  private boolean jj_3_7()
 {
    if (jj_3R_18()) return true;
    if (jj_scan_token(ASSIGN)) return true;
    return false;
  }

  private boolean jj_3R_20()
 {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_54()) {
    jj_scanpos = xsp;
    if (jj_3_7()) {
    jj_scanpos = xsp;
    if (jj_3R_55()) return true;
    }
    }
    return false;
  }

  private boolean jj_3R_54()
 {
    if (jj_scan_token(SQUARE_OPEN)) return true;
    return false;
  }

  private boolean jj_3R_53()
 {
    if (jj_3R_65()) return true;
    return false;
  }

  private boolean jj_3R_17()
 {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_52()) {
    jj_scanpos = xsp;
    if (jj_3R_53()) return true;
    }
    return false;
  }

  private boolean jj_3R_52()
 {
    if (jj_3R_64()) return true;
    return false;
  }

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

  private boolean jj_3R_84()
 {
    if (jj_3R_20()) return true;
    return false;
  }

  private boolean jj_3R_83()
 {
    if (jj_3R_84()) return true;
    return false;
  }

  private boolean jj_3R_76()
 {
    if (jj_scan_token(PAREN_OPEN)) return true;
    return false;
  }

  private boolean jj_3R_69()
 {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_75()) {
    jj_scanpos = xsp;
    if (jj_3R_76()) return true;
    }
    return false;
  }

  private boolean jj_3R_75()
 {
    if (jj_3R_18()) return true;
    return false;
  }

  private boolean jj_3R_68()
 {
    if (jj_scan_token(LL_BEGIN)) return true;
    Token xsp;
    if (jj_3R_85()) return true;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_85()) { jj_scanpos = xsp; break; }
    }
    return false;
  }

  private boolean jj_3R_61()
 {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_67()) {
    jj_scanpos = xsp;
    if (jj_3R_68()) return true;
    }
    return false;
  }

  private boolean jj_3R_67()
 {
    if (jj_scan_token(LITERAL_STRING)) return true;
    return false;
  }

  private boolean jj_3R_15()
 {
    if (jj_3R_42()) return true;
    return false;
  }

  private boolean jj_3R_19()
 {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_scan_token(92)) {
    jj_scanpos = xsp;
    if (jj_scan_token(90)) return true;
    }
    return false;
  }

  private boolean jj_3R_62()
 {
    if (jj_3R_69()) return true;
    return false;
  }

  private boolean jj_3R_13()
 {
    if (jj_3R_18()) return true;
    return false;
  }

  private boolean jj_3R_63()
 {
    if (jj_scan_token(CURLY_OPEN)) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_83()) jj_scanpos = xsp;
    if (jj_scan_token(CURLY_CLOSE)) return true;
    return false;
  }

  private boolean jj_3R_51()
 {
    if (jj_3R_63()) return true;
    return false;
  }

  private boolean jj_3R_50()
 {
    if (jj_3R_62()) return true;
    return false;
  }

  private boolean jj_3R_49()
 {
    if (jj_scan_token(FUNCTION)) return true;
    return false;
  }

  private boolean jj_3R_18()
 {
    if (jj_scan_token(NAME)) return true;
    return false;
  }

  private boolean jj_3R_48()
 {
    if (jj_scan_token(VARARGS)) return true;
    return false;
  }

  private boolean jj_3R_47()
 {
    if (jj_3R_61()) return true;
    return false;
  }

  private boolean jj_3R_46()
 {
    if (jj_3R_60()) return true;
    return false;
  }

  private boolean jj_3_3()
 {
    if (jj_3R_14()) return true;
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_15()) { jj_scanpos = xsp; break; }
    }
    if (jj_3R_16()) return true;
    return false;
  }

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

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

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

  private boolean jj_3R_16()
 {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_43()) {
    jj_scanpos = xsp;
    if (jj_3R_44()) {
    jj_scanpos = xsp;
    if (jj_3R_45()) {
    jj_scanpos = xsp;
    if (jj_3R_46()) {
    jj_scanpos = xsp;
    if (jj_3R_47()) {
    jj_scanpos = xsp;
    if (jj_3R_48()) {
    jj_scanpos = xsp;
    if (jj_3R_49()) {
    jj_scanpos = xsp;
    if (jj_3R_50()) {
    jj_scanpos = xsp;
    if (jj_3R_51()) return true;
    }
    }
    }
    }
    }
    }
    }
    }
    return false;
  }

  private boolean jj_3R_43()
 {
    if (jj_scan_token(NIL)) return true;
    return false;
  }

  private boolean jj_3R_74()
 {
    if (jj_3R_42()) return true;
    return false;
  }

  private boolean jj_3R_82()
 {
    if (jj_3R_66()) return true;
    return false;
  }

  private boolean jj_3R_66()
 {
    Token xsp;
    while (true) {
      xsp = jj_scanpos;
      if (jj_3R_74()) { jj_scanpos = xsp; break; }
    }
    if (jj_3R_16()) return true;
    return false;
  }

  private boolean jj_3R_73()
 {
    if (jj_scan_token(COLON)) return true;
    if (jj_3R_13()) return true;
    return false;
  }

  private boolean jj_3R_65()
 {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_72()) {
    jj_scanpos = xsp;
    if (jj_3R_73()) return true;
    }
    return false;
  }

  private boolean jj_3R_72()
 {
    if (jj_3R_77()) return true;
    return false;
  }

  private boolean jj_3_2()
 {
    if (jj_scan_token(LOCAL)) return true;
    if (jj_scan_token(FUNCTION)) return true;
    return false;
  }

  private boolean jj_3R_71()
 {
    if (jj_scan_token(DOT)) return true;
    if (jj_3R_18()) return true;
    return false;
  }

  private boolean jj_3R_64()
 {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_70()) {
    jj_scanpos = xsp;
    if (jj_3R_71()) return true;
    }
    return false;
  }

  private boolean jj_3R_70()
 {
    if (jj_scan_token(SQUARE_OPEN)) return true;
    if (jj_3R_66()) return true;
    return false;
  }

  private boolean jj_3R_81()
 {
    if (jj_3R_82()) return true;
    return false;
  }

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

  private boolean jj_3R_80()
 {
    if (jj_3R_61()) return true;
    return false;
  }

  private boolean jj_3R_79()
 {
    if (jj_3R_63()) return true;
    return false;
  }

  private boolean jj_3R_78()
 {
    if (jj_scan_token(PAREN_OPEN)) return true;
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_81()) jj_scanpos = xsp;
    if (jj_scan_token(PAREN_CLOSE)) return true;
    return false;
  }

  private boolean jj_3R_77()
 {
    Token xsp;
    xsp = jj_scanpos;
    if (jj_3R_78()) {
    jj_scanpos = xsp;
    if (jj_3R_79()) {
    jj_scanpos = xsp;
    if (jj_3R_80()) return true;
    }
    }
    return false;
  }

  /** Generated Token Manager. */
  public ParserTokenManager 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[38];
  static private int[] jj_la1_0;
  static private int[] jj_la1_1;
  static private int[] jj_la1_2;
  static {
      jj_la1_init_0();
      jj_la1_init_1();
      jj_la1_init_2();
   }
   private static void jj_la1_init_0() {
      jj_la1_0 = new int[] {0x400,0x40,0x78600000,0x0,0x0,0x0,0x0,0x0,0x60600000,0x18000000,0x0,0x0,0x0,0x14000040,0x0,0x40,0x0,0x0,0x0,0x14000040,0x40,0x1000000,0x800000,0x14000040,0x0,0x0,0x40,0x0,0x0,0x0,0x0,0x14000040,0x0,0x0,0x0,0x14000040,0x100000,0x0,};
   }
   private static void jj_la1_init_1() {
      jj_la1_1 = new int[] {0x0,0x100000,0x611,0x20,0x0,0x0,0x0,0x0,0x610,0x0,0x1,0x80000004,0x80000004,0x100c82,0x400,0x100000,0x0,0x0,0x0,0x80100c86,0x100000,0x0,0x0,0x80100c86,0x0,0x0,0x100000,0x0,0x400,0x0,0x400,0x80100c86,0x0,0x0,0x0,0x80100c86,0xc0000008,0x80000004,};
   }
   private static void jj_la1_init_2() {
      jj_la1_2 = new int[] {0x0,0x0,0x6080000,0x0,0x10000000,0x20000000,0x8000000,0x40000,0x6080000,0x0,0x0,0x50,0x50,0x40280000,0x80000,0x28a80000,0x10040000,0x10000000,0x10040000,0x40280050,0x280000,0x0,0x0,0x40280050,0x4000000,0x20800000,0x8280000,0x10000000,0x40000000,0x10000000,0x40000000,0x40a80050,0x14000000,0x14000000,0x800000,0x40280050,0x3ffef,0x50,};
   }
  final private JJCalls[] jj_2_rtns = new JJCalls[7];
  private boolean jj_rescan = false;
  private int jj_gc = 0;

  /** Constructor with InputStream. */
  public Parser(java.io.InputStream stream) {
     this(stream, null);
  }
  /** Constructor with InputStream and supplied encoding */
  public Parser(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 ParserTokenManager(jj_input_stream);
    token = new Token();
    jj_ntk = -1;
    jj_gen = 0;
    for (int i = 0; i < 38; 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;
    jj_gen = 0;
    for (int i = 0; i < 38; i++) jj_la1[i] = -1;
    for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls();
  }

  /** Constructor. */
  public Parser(java.io.Reader stream) {
    jj_input_stream = new SimpleCharStream(stream, 1, 1);
    token_source = new ParserTokenManager(jj_input_stream);
    token = new Token();
    jj_ntk = -1;
    jj_gen = 0;
    for (int i = 0; i < 38; 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 ParserTokenManager(jj_input_stream);
   }

    token_source.ReInit(jj_input_stream);
    token = new Token();
    jj_ntk = -1;
    jj_gen = 0;
    for (int i = 0; i < 38; 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 Parser(ParserTokenManager tm) {
    token_source = tm;
    token = new Token();
    jj_ntk = -1;
    jj_gen = 0;
    for (int i = 0; i < 38; 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(ParserTokenManager tm) {
    token_source = tm;
    token = new Token();
    jj_ntk = -1;
    jj_gen = 0;
    for (int i = 0; i < 38; 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 { }
  final private 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 jj_expentries = new java.util.ArrayList();
  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[95];
    if (jj_kind >= 0) {
      la1tokens[jj_kind] = true;
      jj_kind = -1;
    }
    for (int i = 0; i < 38; i++) {
      if (jj_la1[i] == jj_gen) {
        for (int j = 0; j < 32; j++) {
          if ((jj_la1_0[i] & (1< 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;
            }
          }
          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;
  }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy