public Syntax getSyntaxRule(CTX ctx, List<Token> tls, int s, int e) {
   Token tk = tls.get(s);
   if (tk.kw.equals(KW.Type)) {
     tk = lookAhead(ctx, tls, s + 1, e);
     if (tk != null && (tk.tt == TK.SYMBOL || tk.tt == TK.USYMBOL)) {
       tk = lookAhead(ctx, tls, s + 2, e);
       if (tk != null && (tk.tt == TK.AST_PARENTHESIS || tk.kw.equals(KW.DOT))) {
         return syntax(ctx, KW.StmtMethodDecl); //
       }
       return syntax(ctx, KW.StmtTypeDecl); //
     }
     return syntax(ctx, KW.Expr); // expression
   }
   Syntax syn = syntax(ctx, tk.kw);
   if (syn.syntaxRuleNULL == null) {
     ctx.DBG_P(
         "kw='%s', %d, %d",
         syn.kw, 0,
         0); // TODO syn.ParseExpr == kmodsugar.UndefinedParseExpr, kmodsugar.UndefinedExprTyCheck
             // == syn.ExprTyCheck);
     int i;
     for (i = s + 1; i < e; i++) {
       tk = tls.get(i);
       syn = syntax(ctx, tk.kw);
       if (syn.syntaxRuleNULL != null && syn.priority > 0) {
         ctx.SUGAR_P(System.out, tk.uline, tk.lpos, "binary operator syntax kw='%s'", syn.kw);
         return syn;
       }
     }
     return syntax(ctx, KW.Expr);
   }
   return syn;
 }
 public KObject eval(CTX ctx, String script, long uline) {
   ctx.gamma = new Gamma();
   ctx.gamma.ks = this;
   List<Token> tls = new ArrayList<Token>();
   int pos = tls.size();
   tokenize(ctx, script, uline, tls);
   Block bk = Parser.newBlock(ctx, this, null, tls, pos, tls.size(), ';');
   KArray.clear(tls, pos);
   return evalBlock(ctx, bk);
 }