gt:       if (saved(idstart)) return reuse();
context: //=========================================================================
  //
  //  This file was generated by Mouse 1.6 at 2013-07-23 23:45:29 GMT
  //  from grammar
  //    'C:\Users\Calum\Documents\GitHub\graphclasses\K\p\src\teo\isgci\iq\iq
  //    .peg'.
  //
  //=========================================================================
  
  package teo.isgci.iq;
  
  import mouse.runtime.Source;
  
  public class IQParser extends mouse.runtime.ParserTest
  {
    final IQSemantics sem;
    
    //=======================================================================
    //
    //  Initialization
    //
    //=======================================================================
    //-------------------------------------------------------------------
    //  Constructor
    //-------------------------------------------------------------------
    public IQParser()
      {
        sem = new IQSemantics();
        sem.rule = this;
        super.sem = sem;
        caches = cacheList;
      }
    
    //-------------------------------------------------------------------
    //  Run the parser
    //-------------------------------------------------------------------
    public boolean parse(Source src)
      {
        super.init(src);
        sem.init();
        if (top()) return true;
        return failure();
      }
    
    //-------------------------------------------------------------------
    //  Get semantics
    //-------------------------------------------------------------------
    public IQSemantics semantics()
      { return sem; }
    
    //=======================================================================
    //
    //  Parsing procedures
    //
    //=======================================================================
    //=====================================================================
    //  top = space expr EOF {top} ~{bad} / _++ EOF ;
    //=====================================================================
    private boolean top()
      {
        if (saved(top)) return reuse();
        if (top_0())
        { sem.top(); return accept(top); }
        else sem.bad();
        if (top_1()) return accept(top);
        return reject(top);
      }
    
    //-------------------------------------------------------------------
    //  top_0 = space expr EOF
    //-------------------------------------------------------------------
    private boolean top_0()
      {
        if (savedInner(top_0)) return reuseInner();
        space();
        if (!expr()) return rejectInner(top_0);
        if (!EOF()) return rejectInner(top_0);
        return acceptInner(top_0);
      }
    
    //-------------------------------------------------------------------
    //  top_1 = _++ EOF
    //-------------------------------------------------------------------
    private boolean top_1()
      {
        if (savedInner(top_1)) return reuseInner();
        if (EOF()) return rejectInner(top_1);
        do if (!next($Term15)) return rejectInner(top_1);
          while (!EOF());
        return acceptInner(top_1);
      }
    
    //=====================================================================
    //  expr = term (or term)* {binop} ;
    //=====================================================================
    private boolean expr()
      {
        if (saved(expr)) return reuse();
        if (!term()) return reject(expr);
        while (expr_0());
        sem.binop();
        return accept(expr);
      }
    
    //-------------------------------------------------------------------
    //  expr_0 = or term
    //-------------------------------------------------------------------
    private boolean expr_0()
      {
        if (savedInner(expr_0)) return reuseInner();
        if (!or()) return rejectInner(expr_0);
        if (!term()) return rejectInner(expr_0);
        return acceptInner(expr_0);
      }
    
    //=====================================================================
    //  term = notfactor (and notfactor)* {binop} ;
    //=====================================================================
    private boolean term()
      {
        if (saved(term)) return reuse();
        if (!notfactor()) return reject(term);
        while (term_0());
        sem.binop();
        return accept(term);
      }
    
    //-------------------------------------------------------------------
    //  term_0 = and notfactor
    //-------------------------------------------------------------------
    private boolean term_0()
      {
        if (savedInner(term_0)) return reuseInner();
        if (!and()) return rejectInner(term_0);
        if (!notfactor()) return rejectInner(term_0);
        return acceptInner(term_0);
      }
    
    //=====================================================================
    //  notfactor = not? factor {not} ;
    //=====================================================================
    private boolean notfactor()
      {
        if (saved(notfactor)) return reuse();
        not();
        if (!factor()) return reject(notfactor);
        sem.not();
        return accept(notfactor);
      }
    
    //=====================================================================
    //  factor = rel {dup} / lparen expr (rparen / EOF) {paren} ;
    //=====================================================================
    private boolean factor()
      {
        if (saved(factor)) return reuse();
        if (rel())
        { sem.dup(); return accept(factor); }
        if (factor_0())
        { sem.paren(); return accept(factor); }
        return reject(factor);
      }
    
    //-------------------------------------------------------------------
    //  factor_0 = lparen expr (rparen / EOF)
    //-------------------------------------------------------------------
    private boolean factor_0()
      {
        if (savedInner(factor_0)) return reuseInner();
        if (!lparen()) return rejectInner(factor_0);
        if (!expr()) return rejectInner(factor_0);
        if (!rparen()
         && !EOF()
           ) return rejectInner(factor_0);
        return acceptInner(factor_0);
      }
    
    //=====================================================================
    //  rel = op graphclass {rel} ;
    //=====================================================================
    private boolean rel()
      {
        if (saved(rel)) return reuse();
        if (!op()) return reject(rel);
        if (!graphclass()) return reject(rel);
        sem.rel();
        return accept(rel);
      }
    
    //=====================================================================
    //  op = ("<=" / "<" / ">=" / ">" / "=") space ;
    //=====================================================================
    private boolean op()
      {
        if (saved(op)) return reuse();
        if (!next("<=",$Term13)
         && !next('<',$Term3)
         && !next(">=",$Term0)
         && !next('>',$Term17)
         && !next('=',$Term8)
           ) return reject(op);
        space();
        return accept(op);
      }
    
    //=====================================================================
    //  graphclass = (id / name) space {gc} ;
    //=====================================================================
    private boolean graphclass()
      {
        if (saved(graphclass)) return reuse();
        if (!id()
         && !name()
           ) return reject(graphclass);
        space();
        sem.gc();
        return accept(graphclass);
      }
    
    //=====================================================================
    //  name = &["] """ thename (["] / EOL) ;
    //=====================================================================
    private boolean name()
      {
        if (saved(name)) return reuse();
        if (!ahead('"',$Term10)) return reject(name);
        if (!next('"',$Term4)) return reject(name);
        thename();
        if (!next('"',$Term10)
         && !EOL()
           ) return reject(name);
        return accept(name);
      }
    
    //=====================================================================
    //  thename = ^["\r\n]* ;
    //=====================================================================
    private boolean thename()
      {
        if (saved(thename)) return reuse();
        while (nextNotIn("\"\r\n",$Term1));
        return accept(thename);
      }
    
    //=====================================================================
    //  id = !keyword idstart idchar* ;
    //=====================================================================
    private boolean id()
      {
        if (saved(id)) return reuse();
        if (!id_0()) return reject(id);
        if (!idstart()) return reject(id);
        while (idchar());
        return accept(id);
      }
    
    //-------------------------------------------------------------------
    //  id_0 = !keyword
    //-------------------------------------------------------------------
    private boolean id_0()
      {
        if (savedInner(id_0)) return reusePred();
        if (keyword()) return rejectNot(id_0);
        return acceptNot(id_0);
      }
    
    //=====================================================================
    //  idstart = [a-z] / [A-Z] ;
    //=====================================================================
    private boolean idstart()
      {
  