// ** This file was generated with DemFGen (vers:05/23/2010)

package edu.neu.ccs.demeterf.demfgen.classes;

import edu.neu.ccs.demeterf.Fields;
import edu.neu.ccs.demeterf.lib.ident;
import edu.neu.ccs.demeterf.lib.verbatim;
import edu.neu.ccs.demeterf.lib.*;
import edu.neu.ccs.demeterf.lib.*;
import edu.neu.ccs.demeterf.demfgen.*;
import edu.neu.ccs.demeterf.demfgen.dgp.DGPFunc;
import edu.neu.ccs.demeterf.demfgen.traversals.Travs;
import edu.neu.ccs.demeterf.demfgen.pcdgp.PCDGPFunc;
import edu.neu.ccs.demeterf.dispatch.*;
import edu.neu.ccs.demeterf.*;
import edu.neu.ccs.demeterf.demfgen.ClassHier.InhrtPair;
import edu.neu.ccs.demeterf.demfgen.DemFGenMain;
import java.io.*;
import java.io.FileInputStream;
import edu.neu.ccs.demeterf.util.Util;
import edu.neu.ccs.demeterf.util.CLI;



/** Creates a Static version of Traversal for a specific CD with a Context */
public class StaticTravCtx extends edu.neu.ccs.demeterf.Traversal{
   public <_R> _R traversebyte(byte o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverseshort(short o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverseint(int o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverselong(long o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traversefloat(float o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traversedouble(double o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traversechar(char o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverseboolean(boolean o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverseString(String o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverseident(ident o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverseverbatim(verbatim o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverseByte(Byte o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverseShort(Short o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverseInteger(Integer o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverseLong(Long o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverseFloat(Float o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverseDouble(Double o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverseCharacter(Character o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }
   public <_R> _R traverseBoolean(Boolean o, Object _ctx){ return (_R)applyBuilder(new Object[]{o, _ctx}, true); }


   public StaticTravCtx(edu.neu.ccs.demeterf.FC f){ super(f); }
   public StaticTravCtx(edu.neu.ccs.demeterf.FC f, edu.neu.ccs.demeterf.Control c){ super(f,c); }


   public <_R> _R traverseCDFile(CDFile _h, Object _ctx){
      if(control.isBuiltIn(CDFile.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object incl = (control.skip(CDFile.class, "incl"))?(_h.getIncl()):this.<Object>traverseIncludeList(_h.getIncl(), applyAugment(new Object[]{_h, _ctx}, CDFile.class, "incl"));
      Object dgpuse = (control.skip(CDFile.class, "dgpuse"))?(_h.getDgpuse()):this.<Object>traverseDGPUses(_h.getDgpuse(), applyAugment(new Object[]{_h, _ctx}, CDFile.class, "dgpuse"));
      Object pkg = (control.skip(CDFile.class, "pkg"))?(_h.getPkg()):this.<Object>traversePackageDef(_h.getPkg(), applyAugment(new Object[]{_h, _ctx}, CDFile.class, "pkg"));
      Object look = (control.skip(CDFile.class, "look"))?(_h.getLook()):this.<Object>traverseLookDef(_h.getLook(), applyAugment(new Object[]{_h, _ctx}, CDFile.class, "look"));
      Object imports = (control.skip(CDFile.class, "imports"))?(_h.getImports()):this.<Object>traverseImportList(_h.getImports(), applyAugment(new Object[]{_h, _ctx}, CDFile.class, "imports"));
      Object types = (control.skip(CDFile.class, "types"))?(_h.getTypes()):this.<Object>traverseTypeDefList(_h.getTypes(), applyAugment(new Object[]{_h, _ctx}, CDFile.class, "types"));
      return (_R)applyBuilder(new Object[]{_h, incl, dgpuse, pkg, look, imports, types, _ctx}, false);
   }
   public <_R> _R traverseInclude(Include _h, Object _ctx){
      if(control.isBuiltIn(Include.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object gen = (control.skip(Include.class, "gen"))?(_h.getGen()):this.<Object>traverseDoGen(_h.getGen(), applyAugment(new Object[]{_h, _ctx}, Include.class, "gen"));
      Object file = (control.skip(Include.class, "file"))?(_h.getFile()):this.<Object>traverseString(_h.getFile(), applyAugment(new Object[]{_h, _ctx}, Include.class, "file"));
      return (_R)applyBuilder(new Object[]{_h, gen, file, _ctx}, false);
   }
   public <_R> _R traverseIncludeList(IncludeList _h, Object _ctx){
      if(control.isBuiltIn(IncludeList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof IncludeCons) return this.<_R>traverseIncludeCons((IncludeCons)_h, _ctx);
      if(_h instanceof IncludeEmpty) return this.<_R>traverseIncludeEmpty((IncludeEmpty)_h, _ctx);
      else throw new RuntimeException("Unknown IncludeList Variant");
   }
   public <_R> _R traverseIncludeCons(IncludeCons _h, Object _ctx){
      if(control.isBuiltIn(IncludeCons.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(IncludeCons.class, "first"))?(_h.getFirst()):this.<Object>traverseInclude(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, IncludeCons.class, "first"));
      Object rest = (control.skip(IncludeCons.class, "rest"))?(_h.getRest()):this.<Object>traverseIncludeList(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, IncludeCons.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }
   public <_R> _R traverseIncludeEmpty(IncludeEmpty _h, Object _ctx){
      if(control.isBuiltIn(IncludeEmpty.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseDGPUses(DGPUses _h, Object _ctx){
      if(control.isBuiltIn(DGPUses.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof DGPUse) return this.<_R>traverseDGPUse((DGPUse)_h, _ctx);
      if(_h instanceof NoDGPUse) return this.<_R>traverseNoDGPUse((NoDGPUse)_h, _ctx);
      else throw new RuntimeException("Unknown DGPUses Variant");
   }
   public <_R> _R traverseDGPUse(DGPUse _h, Object _ctx){
      if(control.isBuiltIn(DGPUse.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object pkg = (control.skip(DGPUse.class, "pkg"))?(_h.getPkg()):this.<Object>traverseNENameList(_h.getPkg(), applyAugment(new Object[]{_h, _ctx}, DGPUse.class, "pkg"));
      return (_R)applyBuilder(new Object[]{_h, pkg, _ctx}, false);
   }
   public <_R> _R traverseNoDGPUse(NoDGPUse _h, Object _ctx){
      if(control.isBuiltIn(NoDGPUse.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traversePackageDef(PackageDef _h, Object _ctx){
      if(control.isBuiltIn(PackageDef.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof Package) return this.<_R>traversePackage((Package)_h, _ctx);
      if(_h instanceof NoPackage) return this.<_R>traverseNoPackage((NoPackage)_h, _ctx);
      else throw new RuntimeException("Unknown PackageDef Variant");
   }
   public <_R> _R traversePackage(Package _h, Object _ctx){
      if(control.isBuiltIn(Package.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object pkg = (control.skip(Package.class, "pkg"))?(_h.getPkg()):this.<Object>traverseNEPkgList(_h.getPkg(), applyAugment(new Object[]{_h, _ctx}, Package.class, "pkg"));
      return (_R)applyBuilder(new Object[]{_h, pkg, _ctx}, false);
   }
   public <_R> _R traverseNoPackage(NoPackage _h, Object _ctx){
      if(control.isBuiltIn(NoPackage.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseLookDef(LookDef _h, Object _ctx){
      if(control.isBuiltIn(LookDef.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof LookAhead) return this.<_R>traverseLookAhead((LookAhead)_h, _ctx);
      if(_h instanceof NoLook) return this.<_R>traverseNoLook((NoLook)_h, _ctx);
      else throw new RuntimeException("Unknown LookDef Variant");
   }
   public <_R> _R traverseLookAhead(LookAhead _h, Object _ctx){
      if(control.isBuiltIn(LookAhead.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object n = (control.skip(LookAhead.class, "n"))?(_h.getN()):this.<Object>traverseint(_h.getN(), applyAugment(new Object[]{_h, _ctx}, LookAhead.class, "n"));
      return (_R)applyBuilder(new Object[]{_h, n, _ctx}, false);
   }
   public <_R> _R traverseNoLook(NoLook _h, Object _ctx){
      if(control.isBuiltIn(NoLook.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseImport(Import _h, Object _ctx){
      if(control.isBuiltIn(Import.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object pkg = (control.skip(Import.class, "pkg"))?(_h.getPkg()):this.<Object>traverseNEPkgList(_h.getPkg(), applyAugment(new Object[]{_h, _ctx}, Import.class, "pkg"));
      return (_R)applyBuilder(new Object[]{_h, pkg, _ctx}, false);
   }
   public <_R> _R traversePkgList(PkgList _h, Object _ctx){
      if(control.isBuiltIn(PkgList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof PkgCons) return this.<_R>traversePkgCons((PkgCons)_h, _ctx);
      if(_h instanceof PkgStar) return this.<_R>traversePkgStar((PkgStar)_h, _ctx);
      if(_h instanceof PkgEmpty) return this.<_R>traversePkgEmpty((PkgEmpty)_h, _ctx);
      else throw new RuntimeException("Unknown PkgList Variant");
   }
   public <_R> _R traverseNEPkgList(NEPkgList _h, Object _ctx){
      if(control.isBuiltIn(NEPkgList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object id = (control.skip(NEPkgList.class, "id"))?(_h.getId()):this.<Object>traverseident(_h.getId(), applyAugment(new Object[]{_h, _ctx}, NEPkgList.class, "id"));
      Object rest = (control.skip(NEPkgList.class, "rest"))?(_h.getRest()):this.<Object>traversePkgList(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, NEPkgList.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, id, rest, _ctx}, false);
   }
   public <_R> _R traversePkgCons(PkgCons _h, Object _ctx){
      if(control.isBuiltIn(PkgCons.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object id = (control.skip(PkgCons.class, "id"))?(_h.getId()):this.<Object>traverseident(_h.getId(), applyAugment(new Object[]{_h, _ctx}, PkgCons.class, "id"));
      Object rest = (control.skip(PkgCons.class, "rest"))?(_h.getRest()):this.<Object>traversePkgList(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, PkgCons.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, id, rest, _ctx}, false);
   }
   public <_R> _R traversePkgStar(PkgStar _h, Object _ctx){
      if(control.isBuiltIn(PkgStar.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traversePkgEmpty(PkgEmpty _h, Object _ctx){
      if(control.isBuiltIn(PkgEmpty.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseImportList(ImportList _h, Object _ctx){
      if(control.isBuiltIn(ImportList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof ImportCons) return this.<_R>traverseImportCons((ImportCons)_h, _ctx);
      if(_h instanceof ImportEmpty) return this.<_R>traverseImportEmpty((ImportEmpty)_h, _ctx);
      else throw new RuntimeException("Unknown ImportList Variant");
   }
   public <_R> _R traverseImportCons(ImportCons _h, Object _ctx){
      if(control.isBuiltIn(ImportCons.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(ImportCons.class, "first"))?(_h.getFirst()):this.<Object>traverseImport(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, ImportCons.class, "first"));
      Object rest = (control.skip(ImportCons.class, "rest"))?(_h.getRest()):this.<Object>traverseImportList(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, ImportCons.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }
   public <_R> _R traverseImportEmpty(ImportEmpty _h, Object _ctx){
      if(control.isBuiltIn(ImportEmpty.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseTypeDef(TypeDef _h, Object _ctx){
      if(control.isBuiltIn(TypeDef.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof IntfcDef) return this.<_R>traverseIntfcDef((IntfcDef)_h, _ctx);
      if(_h instanceof ClassDef) return this.<_R>traverseClassDef((ClassDef)_h, _ctx);
      else throw new RuntimeException("Unknown TypeDef Variant");
   }
   public <_R> _R traverseIntfcDef(IntfcDef _h, Object _ctx){
      if(control.isBuiltIn(IntfcDef.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object gen = (control.skip(IntfcDef.class, "gen"))?(_h.getGen()):this.<Object>traverseDoGen(_h.getGen(), applyAugment(new Object[]{_h, _ctx}, IntfcDef.class, "gen"));
      Object name = (control.skip(IntfcDef.class, "name"))?(_h.getName()):this.<Object>traverseident(_h.getName(), applyAugment(new Object[]{_h, _ctx}, IntfcDef.class, "name"));
      Object tparams = (control.skip(IntfcDef.class, "tparams"))?(_h.getTparams()):this.<Object>traverseTypeDefParams(_h.getTparams(), applyAugment(new Object[]{_h, _ctx}, IntfcDef.class, "tparams"));
      Object subtypes = (control.skip(IntfcDef.class, "subtypes"))?(_h.getSubtypes()):this.<Object>traversePESubtypeList(_h.getSubtypes(), applyAugment(new Object[]{_h, _ctx}, IntfcDef.class, "subtypes"));
      return (_R)applyBuilder(new Object[]{_h, gen, name, tparams, subtypes, _ctx}, false);
   }
   public <_R> _R traverseClassDef(ClassDef _h, Object _ctx){
      if(control.isBuiltIn(ClassDef.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object gen = (control.skip(ClassDef.class, "gen"))?(_h.getGen()):this.<Object>traverseDoGen(_h.getGen(), applyAugment(new Object[]{_h, _ctx}, ClassDef.class, "gen"));
      Object name = (control.skip(ClassDef.class, "name"))?(_h.getName()):this.<Object>traverseident(_h.getName(), applyAugment(new Object[]{_h, _ctx}, ClassDef.class, "name"));
      Object tparams = (control.skip(ClassDef.class, "tparams"))?(_h.getTparams()):this.<Object>traverseTypeDefParams(_h.getTparams(), applyAugment(new Object[]{_h, _ctx}, ClassDef.class, "tparams"));
      Object subtypes = (control.skip(ClassDef.class, "subtypes"))?(_h.getSubtypes()):this.<Object>traversePESubtypeList(_h.getSubtypes(), applyAugment(new Object[]{_h, _ctx}, ClassDef.class, "subtypes"));
      Object fields = (control.skip(ClassDef.class, "fields"))?(_h.getFields()):this.<Object>traverseFieldList(_h.getFields(), applyAugment(new Object[]{_h, _ctx}, ClassDef.class, "fields"));
      Object ext = (control.skip(ClassDef.class, "ext"))?(_h.getExt()):this.<Object>traverseImpl(_h.getExt(), applyAugment(new Object[]{_h, _ctx}, ClassDef.class, "ext"));
      return (_R)applyBuilder(new Object[]{_h, gen, name, tparams, subtypes, fields, ext, _ctx}, false);
   }
   public <_R> _R traverseDoGen(DoGen _h, Object _ctx){
      if(control.isBuiltIn(DoGen.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof NoParse) return this.<_R>traverseNoParse((NoParse)_h, _ctx);
      if(_h instanceof NoGen) return this.<_R>traverseNoGen((NoGen)_h, _ctx);
      if(_h instanceof Extern) return this.<_R>traverseExtern((Extern)_h, _ctx);
      if(_h instanceof YesGen) return this.<_R>traverseYesGen((YesGen)_h, _ctx);
      else throw new RuntimeException("Unknown DoGen Variant");
   }
   public <_R> _R traverseNoGen(NoGen _h, Object _ctx){
      if(control.isBuiltIn(NoGen.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseNoParse(NoParse _h, Object _ctx){
      if(control.isBuiltIn(NoParse.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseExtern(Extern _h, Object _ctx){
      if(control.isBuiltIn(Extern.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseYesGen(YesGen _h, Object _ctx){
      if(control.isBuiltIn(YesGen.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseTypeDefParams(TypeDefParams _h, Object _ctx){
      if(control.isBuiltIn(TypeDefParams.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof DefParams) return this.<_R>traverseDefParams((DefParams)_h, _ctx);
      if(_h instanceof EmptyDefParams) return this.<_R>traverseEmptyDefParams((EmptyDefParams)_h, _ctx);
      else throw new RuntimeException("Unknown TypeDefParams Variant");
   }
   public <_R> _R traverseDefParams(DefParams _h, Object _ctx){
      if(control.isBuiltIn(DefParams.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object types = (control.skip(DefParams.class, "types"))?(_h.getTypes()):this.<Object>traverseNENameList(_h.getTypes(), applyAugment(new Object[]{_h, _ctx}, DefParams.class, "types"));
      return (_R)applyBuilder(new Object[]{_h, types, _ctx}, false);
   }
   public <_R> _R traverseEmptyDefParams(EmptyDefParams _h, Object _ctx){
      if(control.isBuiltIn(EmptyDefParams.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseNameDef(NameDef _h, Object _ctx){
      if(control.isBuiltIn(NameDef.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object id = (control.skip(NameDef.class, "id"))?(_h.getId()):this.<Object>traverseident(_h.getId(), applyAugment(new Object[]{_h, _ctx}, NameDef.class, "id"));
      Object bnd = (control.skip(NameDef.class, "bnd"))?(_h.getBnd()):this.<Object>traverseBound(_h.getBnd(), applyAugment(new Object[]{_h, _ctx}, NameDef.class, "bnd"));
      return (_R)applyBuilder(new Object[]{_h, id, bnd, _ctx}, false);
   }
   public <_R> _R traverseBound(Bound _h, Object _ctx){
      if(control.isBuiltIn(Bound.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof ClassBound) return this.<_R>traverseClassBound((ClassBound)_h, _ctx);
      if(_h instanceof NoBound) return this.<_R>traverseNoBound((NoBound)_h, _ctx);
      else throw new RuntimeException("Unknown Bound Variant");
   }
   public <_R> _R traverseClassBound(ClassBound _h, Object _ctx){
      if(control.isBuiltIn(ClassBound.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object bound = (control.skip(ClassBound.class, "bound"))?(_h.getBound()):this.<Object>traverseTypeUse(_h.getBound(), applyAugment(new Object[]{_h, _ctx}, ClassBound.class, "bound"));
      return (_R)applyBuilder(new Object[]{_h, bound, _ctx}, false);
   }
   public <_R> _R traverseNoBound(NoBound _h, Object _ctx){
      if(control.isBuiltIn(NoBound.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseImpl(Impl _h, Object _ctx){
      if(control.isBuiltIn(Impl.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof IntfImpl) return this.<_R>traverseIntfImpl((IntfImpl)_h, _ctx);
      if(_h instanceof NoImpl) return this.<_R>traverseNoImpl((NoImpl)_h, _ctx);
      else throw new RuntimeException("Unknown Impl Variant");
   }
   public <_R> _R traverseNoImpl(NoImpl _h, Object _ctx){
      if(control.isBuiltIn(NoImpl.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseIntfImpl(IntfImpl _h, Object _ctx){
      if(control.isBuiltIn(IntfImpl.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object intf = (control.skip(IntfImpl.class, "intf"))?(_h.getIntf()):this.<Object>traverseNETypeUseList(_h.getIntf(), applyAugment(new Object[]{_h, _ctx}, IntfImpl.class, "intf"));
      return (_R)applyBuilder(new Object[]{_h, intf, _ctx}, false);
   }
   public <_R> _R traverseNameList(NameList _h, Object _ctx){
      if(control.isBuiltIn(NameList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof NameCons) return this.<_R>traverseNameCons((NameCons)_h, _ctx);
      if(_h instanceof NameEmpty) return this.<_R>traverseNameEmpty((NameEmpty)_h, _ctx);
      else throw new RuntimeException("Unknown NameList Variant");
   }
   public <_R> _R traverseNENameList(NENameList _h, Object _ctx){
      if(control.isBuiltIn(NENameList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(NENameList.class, "first"))?(_h.getFirst()):this.<Object>traverseNameDef(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, NENameList.class, "first"));
      Object rest = (control.skip(NENameList.class, "rest"))?(_h.getRest()):this.<Object>traverseNameList(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, NENameList.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }
   public <_R> _R traverseNameCons(NameCons _h, Object _ctx){
      if(control.isBuiltIn(NameCons.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(NameCons.class, "first"))?(_h.getFirst()):this.<Object>traverseNameDef(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, NameCons.class, "first"));
      Object rest = (control.skip(NameCons.class, "rest"))?(_h.getRest()):this.<Object>traverseNameList(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, NameCons.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }
   public <_R> _R traverseNameEmpty(NameEmpty _h, Object _ctx){
      if(control.isBuiltIn(NameEmpty.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseTypeUse(TypeUse _h, Object _ctx){
      if(control.isBuiltIn(TypeUse.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object name = (control.skip(TypeUse.class, "name"))?(_h.getName()):this.<Object>traverseident(_h.getName(), applyAugment(new Object[]{_h, _ctx}, TypeUse.class, "name"));
      Object tparams = (control.skip(TypeUse.class, "tparams"))?(_h.getTparams()):this.<Object>traverseTypeUseParams(_h.getTparams(), applyAugment(new Object[]{_h, _ctx}, TypeUse.class, "tparams"));
      return (_R)applyBuilder(new Object[]{_h, name, tparams, _ctx}, false);
   }
   public <_R> _R traverseTypeUseParams(TypeUseParams _h, Object _ctx){
      if(control.isBuiltIn(TypeUseParams.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof UseParams) return this.<_R>traverseUseParams((UseParams)_h, _ctx);
      if(_h instanceof EmptyUseParams) return this.<_R>traverseEmptyUseParams((EmptyUseParams)_h, _ctx);
      else throw new RuntimeException("Unknown TypeUseParams Variant");
   }
   public <_R> _R traverseUseParams(UseParams _h, Object _ctx){
      if(control.isBuiltIn(UseParams.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object types = (control.skip(UseParams.class, "types"))?(_h.getTypes()):this.<Object>traverseNETypeUseList(_h.getTypes(), applyAugment(new Object[]{_h, _ctx}, UseParams.class, "types"));
      return (_R)applyBuilder(new Object[]{_h, types, _ctx}, false);
   }
   public <_R> _R traverseEmptyUseParams(EmptyUseParams _h, Object _ctx){
      if(control.isBuiltIn(EmptyUseParams.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseTypeUseList(TypeUseList _h, Object _ctx){
      if(control.isBuiltIn(TypeUseList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof TypeUseCons) return this.<_R>traverseTypeUseCons((TypeUseCons)_h, _ctx);
      if(_h instanceof TypeUseEmpty) return this.<_R>traverseTypeUseEmpty((TypeUseEmpty)_h, _ctx);
      else throw new RuntimeException("Unknown TypeUseList Variant");
   }
   public <_R> _R traverseNETypeUseList(NETypeUseList _h, Object _ctx){
      if(control.isBuiltIn(NETypeUseList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(NETypeUseList.class, "first"))?(_h.getFirst()):this.<Object>traverseTypeUse(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, NETypeUseList.class, "first"));
      Object rest = (control.skip(NETypeUseList.class, "rest"))?(_h.getRest()):this.<Object>traverseTypeUseList(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, NETypeUseList.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }
   public <_R> _R traverseTypeUseCons(TypeUseCons _h, Object _ctx){
      if(control.isBuiltIn(TypeUseCons.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(TypeUseCons.class, "first"))?(_h.getFirst()):this.<Object>traverseTypeUse(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, TypeUseCons.class, "first"));
      Object rest = (control.skip(TypeUseCons.class, "rest"))?(_h.getRest()):this.<Object>traverseTypeUseList(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, TypeUseCons.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }
   public <_R> _R traverseTypeUseEmpty(TypeUseEmpty _h, Object _ctx){
      if(control.isBuiltIn(TypeUseEmpty.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseField(Field _h, Object _ctx){
      if(control.isBuiltIn(Field.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object name = (control.skip(Field.class, "name"))?(_h.getName()):this.<Object>traverseident(_h.getName(), applyAugment(new Object[]{_h, _ctx}, Field.class, "name"));
      Object type = (control.skip(Field.class, "type"))?(_h.getType()):this.<Object>traverseTypeUse(_h.getType(), applyAugment(new Object[]{_h, _ctx}, Field.class, "type"));
      return (_R)applyBuilder(new Object[]{_h, name, type, _ctx}, false);
   }
   public <_R> _R traverseFieldOrSyntax(FieldOrSyntax _h, Object _ctx){
      if(control.isBuiltIn(FieldOrSyntax.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof Field) return this.<_R>traverseField((Field)_h, _ctx);
      if(_h instanceof Syntax) return this.<_R>traverseSyntax((Syntax)_h, _ctx);
      else throw new RuntimeException("Unknown FieldOrSyntax Variant");
   }
   public <_R> _R traverseSyntax(Syntax _h, Object _ctx){
      if(control.isBuiltIn(Syntax.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof AddSpace) return this.<_R>traverseAddSpace((AddSpace)_h, _ctx);
      if(_h instanceof AddTab) return this.<_R>traverseAddTab((AddTab)_h, _ctx);
      if(_h instanceof AddLine) return this.<_R>traverseAddLine((AddLine)_h, _ctx);
      if(_h instanceof AddReturn) return this.<_R>traverseAddReturn((AddReturn)_h, _ctx);
      if(_h instanceof Plus) return this.<_R>traversePlus((Plus)_h, _ctx);
      if(_h instanceof Minus) return this.<_R>traverseMinus((Minus)_h, _ctx);
      if(_h instanceof AddToken) return this.<_R>traverseAddToken((AddToken)_h, _ctx);
      if(_h instanceof TheEOF) return this.<_R>traverseTheEOF((TheEOF)_h, _ctx);
      else throw new RuntimeException("Unknown Syntax Variant");
   }
   public <_R> _R traverseAddSpace(AddSpace _h, Object _ctx){
      if(control.isBuiltIn(AddSpace.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseAddTab(AddTab _h, Object _ctx){
      if(control.isBuiltIn(AddTab.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseAddLine(AddLine _h, Object _ctx){
      if(control.isBuiltIn(AddLine.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseAddReturn(AddReturn _h, Object _ctx){
      if(control.isBuiltIn(AddReturn.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traversePlus(Plus _h, Object _ctx){
      if(control.isBuiltIn(Plus.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseMinus(Minus _h, Object _ctx){
      if(control.isBuiltIn(Minus.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseAddToken(AddToken _h, Object _ctx){
      if(control.isBuiltIn(AddToken.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object str = (control.skip(AddToken.class, "str"))?(_h.getStr()):this.<Object>traverseString(_h.getStr(), applyAugment(new Object[]{_h, _ctx}, AddToken.class, "str"));
      return (_R)applyBuilder(new Object[]{_h, str, _ctx}, false);
   }
   public <_R> _R traverseTheEOF(TheEOF _h, Object _ctx){
      if(control.isBuiltIn(TheEOF.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseSumToken(SumToken _h, Object _ctx){
      if(control.isBuiltIn(SumToken.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof RealToken) return this.<_R>traverseRealToken((RealToken)_h, _ctx);
      if(_h instanceof EmptyToken) return this.<_R>traverseEmptyToken((EmptyToken)_h, _ctx);
      else throw new RuntimeException("Unknown SumToken Variant");
   }
   public <_R> _R traverseRealToken(RealToken _h, Object _ctx){
      if(control.isBuiltIn(RealToken.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object str = (control.skip(RealToken.class, "str"))?(_h.getStr()):this.<Object>traverseString(_h.getStr(), applyAugment(new Object[]{_h, _ctx}, RealToken.class, "str"));
      return (_R)applyBuilder(new Object[]{_h, str, _ctx}, false);
   }
   public <_R> _R traverseEmptyToken(EmptyToken _h, Object _ctx){
      if(control.isBuiltIn(EmptyToken.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseTypeDefList(TypeDefList _h, Object _ctx){
      if(control.isBuiltIn(TypeDefList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof TypeDefCons) return this.<_R>traverseTypeDefCons((TypeDefCons)_h, _ctx);
      if(_h instanceof TypeDefEmpty) return this.<_R>traverseTypeDefEmpty((TypeDefEmpty)_h, _ctx);
      else throw new RuntimeException("Unknown TypeDefList Variant");
   }
   public <_R> _R traverseTypeDefCons(TypeDefCons _h, Object _ctx){
      if(control.isBuiltIn(TypeDefCons.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(TypeDefCons.class, "first"))?(_h.getFirst()):this.<Object>traverseTypeDef(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, TypeDefCons.class, "first"));
      Object rest = (control.skip(TypeDefCons.class, "rest"))?(_h.getRest()):this.<Object>traverseTypeDefList(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, TypeDefCons.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }
   public <_R> _R traverseTypeDefEmpty(TypeDefEmpty _h, Object _ctx){
      if(control.isBuiltIn(TypeDefEmpty.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseFieldList(FieldList _h, Object _ctx){
      if(control.isBuiltIn(FieldList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof FieldCons) return this.<_R>traverseFieldCons((FieldCons)_h, _ctx);
      if(_h instanceof FieldEmpty) return this.<_R>traverseFieldEmpty((FieldEmpty)_h, _ctx);
      else throw new RuntimeException("Unknown FieldList Variant");
   }
   public <_R> _R traverseFieldCons(FieldCons _h, Object _ctx){
      if(control.isBuiltIn(FieldCons.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(FieldCons.class, "first"))?(_h.getFirst()):this.<Object>traverseFieldOrSyntax(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, FieldCons.class, "first"));
      Object rest = (control.skip(FieldCons.class, "rest"))?(_h.getRest()):this.<Object>traverseFieldList(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, FieldCons.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }
   public <_R> _R traverseFieldEmpty(FieldEmpty _h, Object _ctx){
      if(control.isBuiltIn(FieldEmpty.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traversePESubtypeList(PESubtypeList _h, Object _ctx){
      if(control.isBuiltIn(PESubtypeList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof NESubtypeList) return this.<_R>traverseNESubtypeList((NESubtypeList)_h, _ctx);
      if(_h instanceof SubtypeEmpty) return this.<_R>traverseSubtypeEmpty((SubtypeEmpty)_h, _ctx);
      else throw new RuntimeException("Unknown PESubtypeList Variant");
   }
   public <_R> _R traverseNESubtypeList(NESubtypeList _h, Object _ctx){
      if(control.isBuiltIn(NESubtypeList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(NESubtypeList.class, "first"))?(_h.getFirst()):this.<Object>traverseTypeUse(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, NESubtypeList.class, "first"));
      Object rest = (control.skip(NESubtypeList.class, "rest"))?(_h.getRest()):this.<Object>traverseSubtypeList(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, NESubtypeList.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }
   public <_R> _R traverseSubtypeList(SubtypeList _h, Object _ctx){
      if(control.isBuiltIn(SubtypeList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof SubtypeCons) return this.<_R>traverseSubtypeCons((SubtypeCons)_h, _ctx);
      if(_h instanceof SubtypeEmpty) return this.<_R>traverseSubtypeEmpty((SubtypeEmpty)_h, _ctx);
      else throw new RuntimeException("Unknown SubtypeList Variant");
   }
   public <_R> _R traverseSubtypeCons(SubtypeCons _h, Object _ctx){
      if(control.isBuiltIn(SubtypeCons.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(SubtypeCons.class, "first"))?(_h.getFirst()):this.<Object>traverseTypeUse(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, SubtypeCons.class, "first"));
      Object rest = (control.skip(SubtypeCons.class, "rest"))?(_h.getRest()):this.<Object>traverseSubtypeList(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, SubtypeCons.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }
   public <_R> _R traverseSubtypeEmpty(SubtypeEmpty _h, Object _ctx){
      if(control.isBuiltIn(SubtypeEmpty.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseBehFile(BehFile _h, Object _ctx){
      if(control.isBuiltIn(BehFile.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object incl = (control.skip(BehFile.class, "incl"))?(_h.getIncl()):this.<Object>traverseIncludeList(_h.getIncl(), applyAugment(new Object[]{_h, _ctx}, BehFile.class, "incl"));
      Object behs = (control.skip(BehFile.class, "behs"))?(_h.getBehs()):this.<Object>traverseBehDefList(_h.getBehs(), applyAugment(new Object[]{_h, _ctx}, BehFile.class, "behs"));
      return (_R)applyBuilder(new Object[]{_h, incl, behs, _ctx}, false);
   }
   public <_R> _R traverseBehDefList(BehDefList _h, Object _ctx){
      if(control.isBuiltIn(BehDefList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof BehDefCons) return this.<_R>traverseBehDefCons((BehDefCons)_h, _ctx);
      if(_h instanceof BehDefEmpty) return this.<_R>traverseBehDefEmpty((BehDefEmpty)_h, _ctx);
      else throw new RuntimeException("Unknown BehDefList Variant");
   }
   public <_R> _R traverseBehDefCons(BehDefCons _h, Object _ctx){
      if(control.isBuiltIn(BehDefCons.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(BehDefCons.class, "first"))?(_h.getFirst()):this.<Object>traverseBehDef(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, BehDefCons.class, "first"));
      Object rest = (control.skip(BehDefCons.class, "rest"))?(_h.getRest()):this.<Object>traverseBehDefList(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, BehDefCons.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }
   public <_R> _R traverseBehDefEmpty(BehDefEmpty _h, Object _ctx){
      if(control.isBuiltIn(BehDefEmpty.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseBehDef(BehDef _h, Object _ctx){
      if(control.isBuiltIn(BehDef.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object name = (control.skip(BehDef.class, "name"))?(_h.getName()):this.<Object>traverseident(_h.getName(), applyAugment(new Object[]{_h, _ctx}, BehDef.class, "name"));
      Object body = (control.skip(BehDef.class, "body"))?(_h.getBody()):this.<Object>traverseverbatim(_h.getBody(), applyAugment(new Object[]{_h, _ctx}, BehDef.class, "body"));
      return (_R)applyBuilder(new Object[]{_h, name, body, _ctx}, false);
   }
   public <_R> _R traverseEmptyList(EmptyList _h, Object _ctx){
      if(control.isBuiltIn(EmptyList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof IncludeEmpty) return this.<_R>traverseIncludeEmpty((IncludeEmpty)_h, _ctx);
      if(_h instanceof PkgStar) return this.<_R>traversePkgStar((PkgStar)_h, _ctx);
      if(_h instanceof PkgEmpty) return this.<_R>traversePkgEmpty((PkgEmpty)_h, _ctx);
      if(_h instanceof ImportEmpty) return this.<_R>traverseImportEmpty((ImportEmpty)_h, _ctx);
      if(_h instanceof EmptyDefParams) return this.<_R>traverseEmptyDefParams((EmptyDefParams)_h, _ctx);
      if(_h instanceof NameEmpty) return this.<_R>traverseNameEmpty((NameEmpty)_h, _ctx);
      if(_h instanceof EmptyUseParams) return this.<_R>traverseEmptyUseParams((EmptyUseParams)_h, _ctx);
      if(_h instanceof TypeUseEmpty) return this.<_R>traverseTypeUseEmpty((TypeUseEmpty)_h, _ctx);
      if(_h instanceof TypeDefEmpty) return this.<_R>traverseTypeDefEmpty((TypeDefEmpty)_h, _ctx);
      if(_h instanceof FieldEmpty) return this.<_R>traverseFieldEmpty((FieldEmpty)_h, _ctx);
      if(_h instanceof SubtypeEmpty) return this.<_R>traverseSubtypeEmpty((SubtypeEmpty)_h, _ctx);
      else throw new RuntimeException("Unknown EmptyList Variant");
   }
   public <_R> _R traverseConsList(ConsList _h, Object _ctx){
      if(control.isBuiltIn(ConsList.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof IncludeCons) return this.<_R>traverseIncludeCons((IncludeCons)_h, _ctx);
      if(_h instanceof NEPkgList) return this.<_R>traverseNEPkgList((NEPkgList)_h, _ctx);
      if(_h instanceof PkgCons) return this.<_R>traversePkgCons((PkgCons)_h, _ctx);
      if(_h instanceof ImportCons) return this.<_R>traverseImportCons((ImportCons)_h, _ctx);
      if(_h instanceof NENameList) return this.<_R>traverseNENameList((NENameList)_h, _ctx);
      if(_h instanceof NameCons) return this.<_R>traverseNameCons((NameCons)_h, _ctx);
      if(_h instanceof NETypeUseList) return this.<_R>traverseNETypeUseList((NETypeUseList)_h, _ctx);
      if(_h instanceof TypeUseCons) return this.<_R>traverseTypeUseCons((TypeUseCons)_h, _ctx);
      if(_h instanceof TypeDefCons) return this.<_R>traverseTypeDefCons((TypeDefCons)_h, _ctx);
      if(_h instanceof FieldCons) return this.<_R>traverseFieldCons((FieldCons)_h, _ctx);
      if(_h instanceof NESubtypeList) return this.<_R>traverseNESubtypeList((NESubtypeList)_h, _ctx);
      if(_h instanceof SubtypeCons) return this.<_R>traverseSubtypeCons((SubtypeCons)_h, _ctx);
      else throw new RuntimeException("Unknown ConsList Variant");
   }
   public <_R> _R traverseLitToken(LitToken _h, Object _ctx){
      if(control.isBuiltIn(LitToken.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof AddToken) return this.<_R>traverseAddToken((AddToken)_h, _ctx);
      if(_h instanceof TheEOF) return this.<_R>traverseTheEOF((TheEOF)_h, _ctx);
      if(_h instanceof SumToken) return this.<_R>traverseSumToken((SumToken)_h, _ctx);
      else throw new RuntimeException("Unknown LitToken Variant");
   }
   public <_R> _R traverseRuntimeException(RuntimeException _h, Object _ctx){
      if(control.isBuiltIn(RuntimeException.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof TE) return this.<_R>traverseTE((TE)_h, _ctx);
      if(_h instanceof RTParseException) return this.<_R>traverseRTParseException((RTParseException)_h, _ctx);
      if(_h instanceof RTFileNotFound) return this.<_R>traverseRTFileNotFound((RTFileNotFound)_h, _ctx);
      else throw new RuntimeException("Unknown RuntimeException Variant");
   }
   public <_R> _R traverseTE(TE _h, Object _ctx){
      if(control.isBuiltIn(TE.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseRTParseException(RTParseException _h, Object _ctx){
      if(control.isBuiltIn(RTParseException.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseRTFileNotFound(RTFileNotFound _h, Object _ctx){
      if(control.isBuiltIn(RTFileNotFound.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseDGPFunc(DGPFunc _h, Object _ctx){
      if(control.isBuiltIn(DGPFunc.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof DummyDGP) return this.<_R>traverseDummyDGP((DummyDGP)_h, _ctx);
      else throw new RuntimeException("Unknown DGPFunc Variant");
   }
   public <_R> _R traverseDummyDGP(DummyDGP _h, Object _ctx){
      if(control.isBuiltIn(DummyDGP.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object behavior = (control.skip(DummyDGP.class, "behavior"))?(_h.getBehavior()):this.<Object>traverseString(_h.getBehavior(), applyAugment(new Object[]{_h, _ctx}, DummyDGP.class, "behavior"));
      return (_R)applyBuilder(new Object[]{_h, behavior, _ctx}, false);
   }
   public <_R> _R traverseDummyTrav(DummyTrav _h, Object _ctx){
      if(control.isBuiltIn(DummyTrav.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object dfgl = (control.skip(DummyTrav.class, "dfgl"))?(_h.getDfgl()):this.<Object>traverseList_CDFile_(_h.getDfgl(), applyAugment(new Object[]{_h, _ctx}, DummyTrav.class, "dfgl"));
      Object tdl = (control.skip(DummyTrav.class, "tdl"))?(_h.getTdl()):this.<Object>traverseList_TypeDef_(_h.getTdl(), applyAugment(new Object[]{_h, _ctx}, DummyTrav.class, "tdl"));
      Object dgpl = (control.skip(DummyTrav.class, "dgpl"))?(_h.getDgpl()):this.<Object>traverseList_DGPFunc_(_h.getDgpl(), applyAugment(new Object[]{_h, _ctx}, DummyTrav.class, "dgpl"));
      Object otdl = (control.skip(DummyTrav.class, "otdl"))?(_h.getOtdl()):this.<Object>traverseOption_List_TypeDef__(_h.getOtdl(), applyAugment(new Object[]{_h, _ctx}, DummyTrav.class, "otdl"));
      Object flds = (control.skip(DummyTrav.class, "flds"))?(_h.getFlds()):this.<Object>traverseList_FieldOrSyntax_(_h.getFlds(), applyAugment(new Object[]{_h, _ctx}, DummyTrav.class, "flds"));
      return (_R)applyBuilder(new Object[]{_h, dfgl, tdl, dgpl, otdl, flds, _ctx}, false);
   }
   public <_R> _R traverseRBColor(RBColor _h, Object _ctx){
      if(control.isBuiltIn(RBColor.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof RED) return this.<_R>traverseRED((RED)_h, _ctx);
      if(_h instanceof BLACK) return this.<_R>traverseBLACK((BLACK)_h, _ctx);
      else throw new RuntimeException("Unknown RBColor Variant");
   }
   public <_R> _R traverseRED(RED _h, Object _ctx){
      if(control.isBuiltIn(RED.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseBLACK(BLACK _h, Object _ctx){
      if(control.isBuiltIn(BLACK.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }

   public <_R> _R traverseList_FieldOrSyntax_(List<FieldOrSyntax> _h, Object _ctx){
      if(control.isBuiltIn(List.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof Cons) return this.<_R>traverseCons_FieldOrSyntax_((Cons<FieldOrSyntax>)_h, _ctx);
      if(_h instanceof Empty) return this.<_R>traverseEmpty_FieldOrSyntax_((Empty<FieldOrSyntax>)_h, _ctx);
      else throw new RuntimeException("Unknown List Variant");
   }
   public <_R> _R traverseEmpty_FieldOrSyntax_(Empty<FieldOrSyntax> _h, Object _ctx){
      if(control.isBuiltIn(Empty.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseCons_FieldOrSyntax_(Cons<FieldOrSyntax> _h, Object _ctx){
      if(control.isBuiltIn(Cons.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(Cons.class, "first"))?(_h.getFirst()):this.<Object>traverseFieldOrSyntax(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, Cons.class, "first"));
      Object rest = (control.skip(Cons.class, "rest"))?(_h.getRest()):this.<Object>traverseList_FieldOrSyntax_(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, Cons.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }
   public <_R> _R traverseOption_List_TypeDef__(Option<List<TypeDef>> _h, Object _ctx){
      if(control.isBuiltIn(Option.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof Some) return this.<_R>traverseSome_List_TypeDef__((Some<List<TypeDef>>)_h, _ctx);
      if(_h instanceof None) return this.<_R>traverseNone_List_TypeDef__((None<List<TypeDef>>)_h, _ctx);
      else throw new RuntimeException("Unknown Option Variant");
   }
   public <_R> _R traverseNone_List_TypeDef__(None<List<TypeDef>> _h, Object _ctx){
      if(control.isBuiltIn(None.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseSome_List_TypeDef__(Some<List<TypeDef>> _h, Object _ctx){
      if(control.isBuiltIn(Some.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object just = (control.skip(Some.class, "just"))?(_h.getJust()):this.<Object>traverseList_TypeDef_(_h.getJust(), applyAugment(new Object[]{_h, _ctx}, Some.class, "just"));
      return (_R)applyBuilder(new Object[]{_h, just, _ctx}, false);
   }
   public <_R> _R traverseList_DGPFunc_(List<DGPFunc> _h, Object _ctx){
      if(control.isBuiltIn(List.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof Cons) return this.<_R>traverseCons_DGPFunc_((Cons<DGPFunc>)_h, _ctx);
      if(_h instanceof Empty) return this.<_R>traverseEmpty_DGPFunc_((Empty<DGPFunc>)_h, _ctx);
      else throw new RuntimeException("Unknown List Variant");
   }
   public <_R> _R traverseEmpty_DGPFunc_(Empty<DGPFunc> _h, Object _ctx){
      if(control.isBuiltIn(Empty.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseCons_DGPFunc_(Cons<DGPFunc> _h, Object _ctx){
      if(control.isBuiltIn(Cons.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(Cons.class, "first"))?(_h.getFirst()):this.<Object>traverseDGPFunc(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, Cons.class, "first"));
      Object rest = (control.skip(Cons.class, "rest"))?(_h.getRest()):this.<Object>traverseList_DGPFunc_(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, Cons.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }
   public <_R> _R traverseList_TypeDef_(List<TypeDef> _h, Object _ctx){
      if(control.isBuiltIn(List.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof Cons) return this.<_R>traverseCons_TypeDef_((Cons<TypeDef>)_h, _ctx);
      if(_h instanceof Empty) return this.<_R>traverseEmpty_TypeDef_((Empty<TypeDef>)_h, _ctx);
      else throw new RuntimeException("Unknown List Variant");
   }
   public <_R> _R traverseEmpty_TypeDef_(Empty<TypeDef> _h, Object _ctx){
      if(control.isBuiltIn(Empty.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseCons_TypeDef_(Cons<TypeDef> _h, Object _ctx){
      if(control.isBuiltIn(Cons.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(Cons.class, "first"))?(_h.getFirst()):this.<Object>traverseTypeDef(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, Cons.class, "first"));
      Object rest = (control.skip(Cons.class, "rest"))?(_h.getRest()):this.<Object>traverseList_TypeDef_(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, Cons.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }
   public <_R> _R traverseList_CDFile_(List<CDFile> _h, Object _ctx){
      if(control.isBuiltIn(List.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      if(_h instanceof Cons) return this.<_R>traverseCons_CDFile_((Cons<CDFile>)_h, _ctx);
      if(_h instanceof Empty) return this.<_R>traverseEmpty_CDFile_((Empty<CDFile>)_h, _ctx);
      else throw new RuntimeException("Unknown List Variant");
   }
   public <_R> _R traverseEmpty_CDFile_(Empty<CDFile> _h, Object _ctx){
      if(control.isBuiltIn(Empty.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      return (_R)applyBuilder(new Object[]{_h, _ctx}, false);
   }
   public <_R> _R traverseCons_CDFile_(Cons<CDFile> _h, Object _ctx){
      if(control.isBuiltIn(Cons.class))
          return (_R)applyBuilder(new Object[]{_h, _ctx}, true);
      Object first = (control.skip(Cons.class, "first"))?(_h.getFirst()):this.<Object>traverseCDFile(_h.getFirst(), applyAugment(new Object[]{_h, _ctx}, Cons.class, "first"));
      Object rest = (control.skip(Cons.class, "rest"))?(_h.getRest()):this.<Object>traverseList_CDFile_(_h.getRest(), applyAugment(new Object[]{_h, _ctx}, Cons.class, "rest"));
      return (_R)applyBuilder(new Object[]{_h, first, rest, _ctx}, false);
   }


}