// ** 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 without a Context */
public class StaticTrav extends edu.neu.ccs.demeterf.Traversal{
   public <_R> _R traversebyte(byte o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverseshort(short o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverseint(int o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverselong(long o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traversefloat(float o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traversedouble(double o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traversechar(char o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverseboolean(boolean o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverseString(String o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverseident(ident o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverseverbatim(verbatim o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverseByte(Byte o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverseShort(Short o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverseInteger(Integer o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverseLong(Long o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverseFloat(Float o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverseDouble(Double o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverseCharacter(Character o){ return (_R)applyBuilder(new Object[]{o}, true); }
   public <_R> _R traverseBoolean(Boolean o){ return (_R)applyBuilder(new Object[]{o}, true); }


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


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

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


}