CDFile{{ /** Add a new TypeDef to this CDFile. */ public CDFile addType(TypeDef td){ return updateTypes(types.push(td)); } }} PackageDef{{ public String toString(){ return ""; } public String name(){ return ""; } public String nameDot(){ return ""; } public String dir(){ return ""; } public String parserPackage(){ return "\n"; } public boolean hasPkg(){ return false; } }} Package{{ public String toString(){ return Diff.d.packageStmt+" "+pkg+Diff.d.packagePrefix+"\n\n"; } public String name(){ return pkg.toString(); } public String nameDot(){ return pkg.toString()+"."; } public String dir(){ return pkg.toString().replace('.',java.io.File.separatorChar); } public String parserPackage(){ return Diff.d.packageStmt+" "+pkg+";\n\n"; } public boolean hasPkg(){ return true; } }} Import{{ public String toString(){ if(Diff.d.isCS() && !pkg.isStar()) return Diff.d.importStmt+" "+pkg.lastId()+" = "+pkg+";\n"; return Diff.d.importStmt+" "+pkg+";\n"; } }} ImportList{{ public ImportList append(ImportList l){ return l; } public String toString(){ return ""; } }} ImportCons{{ public ImportList append(ImportList l){ return new ImportCons(first,rest.append(l)); } public String toString(){ return first+""+rest; } }} PkgList{{ public abstract List toList(); public boolean isStar(){ return false; } public boolean isEmpty(){ return false; } public abstract String lastId(); }} NEPkgList{{ public String toString(){ return id+""+rest; } public List toList(){ return rest.toList().push(id.getName()); } public boolean isStar(){ return rest.isStar(); } public String lastId(){ return rest.isEmpty()?""+id:rest.lastId(); } }} PkgCons{{ public List toList(){ return rest.toList().push(id.getName()); } public String toString(){ return "."+id+rest; } public boolean isStar(){ return rest.isStar(); } public String lastId(){ return rest.isEmpty()?""+id:rest.lastId(); } }} PkgStar{{ public List toList(){ return List.create(); } public String toString(){ return (Diff.d.isJava()?".*":""); } public boolean isStar(){ return true; } public String lastId(){ return "*"; } }} PkgEmpty{{ public List toList(){ return List.create(); } public String toString(){ return ""; } public boolean isEmpty(){ return true; } public String lastId(){ return ""; } }} IncludeList{{ public boolean isEmpty(){ return true; } }} IncludeCons{{ public boolean isEmpty(){ return false; } }} TypeDefList{{ public List toList(){ return List.create(); } public TypeDefList push(TypeDef td){ return new TypeDefCons(td, this); } public boolean anyGen(){ return false; } }} TypeDefCons{{ public List toList(){ return rest.toList().push(first); } public boolean anyGen(){ return first.doGen() || rest.anyGen(); } }} TypeDef{{ public abstract boolean isProd(); public abstract String name(); public abstract List fieldList(); public abstract TypeDefParams typeParams(); public boolean isAbstr(){ return false; } public boolean isIntfc(){ return false; } public boolean doParse(){ return true; } public boolean doGen(){ return true; } public abstract TypeDef addFieldsAndSyntax(List nfs); }} IntfcDef{{ public boolean isProd(){ return false; } public boolean isIntfc(){ return true; } public String name(){ return ""+name; } public List fieldList(){ return List.create(); } public TypeDefParams typeParams(){ return tparams; } public boolean doParse(){ return gen.doParse(); } public boolean doGen(){ return gen.doGen(); } public TypeDef addFieldsAndSyntax(List nfs){ return this; } }} ClassDef{{ public boolean isProd(){ return subtypes.isEmpty(); } public boolean isAbstr(){ return !subtypes.isEmpty(); } public String name(){ return ""+name; } public List fieldList(){ return fields.justFields(); } public TypeDefParams typeParams(){ return tparams; } public boolean doParse(){ return gen.doParse(); } public boolean doGen(){ return gen.doGen(); } public TypeDef addFieldsAndSyntax(List nfs){ return new ClassDef(gen, name, tparams, subtypes, fields.append(nfs), ext); } }} Decl{{ public boolean isProd(){ return false; } }} SumType{{}} ProdType{{ public boolean isProd(){ return true; } }} TypeDefParams{{ public int length(){ return 0; } public boolean isEmpty(){ return true; } public String toString(){ return ""; } public List toList(){ return List.create(); } public String[] toArray(){ return toList().toArray(new String[this.length()]);} }} DefParams{{ public int length(){ return types.length(); } public boolean isEmpty(){ return false; } public String toString(){ return ""+types; } public List toList(){ return types.toList(); } }} NameDef{{ public String toString(){ return ""+id; } public String declString(){ return ""+id+" extends Object"; } }} NameList{{ public int length(){ return 0; } public List toList(){ return List.create(); } }} NENameList{{ public int length(){ return rest.length()+1; } public String toString(){ return "<"+first+rest; } public List toList(){ return rest.toList().push(""+first); } }} NameCons{{ public int length(){ return rest.length()+1; } public String toString(){ return ","+first+rest; } public List toList(){ return rest.toList().push(""+first); } }} NameEmpty{{ public String toString(){ return ">"; } }} TypeUse{{ public String toString(){ return ""+name+tparams; } /** Make a TypeUse from a String, throw a RuntimeException if there are issues */ public static TypeUse makeType(String s){ try{ return TypeUse.parse(s.replace('<', '(').replace('>',')')); }catch(Exception e){ throw new RTParseException(e.getMessage()); } } }} TypeUseParams{{ public int length(){ return 0; } public boolean isEmpty(){ return true; } public String toString(){ return ""; } public List toList(){ return List.create(); } public List toTUList(){ return List.create(); } public String[] toArray(){ return toTUList().map(new List.Map(){ public String map(TypeUse tu){ return tu.print(); } }).toArray(new String[this.length()]); } }} UseParams{{ public int length(){ return types.length(); } public boolean isEmpty(){ return false; } public String toString(){ return ""+types; } public List toList(){ return types.toList(); } public List toTUList(){ return types.toTUList(); } }} TypeUseList{{ public int length(){ return 0; } public List toList(){ return List.create(); } public List toTUList(){ return List.create(); } }} NETypeUseList{{ public int length(){ return rest.length()+1; } public String toString(){ return "<"+first+rest; } public List toList(){ return rest.toList().push(""+first); } public List toTUList(){ return rest.toTUList().push(first); } }} TypeUseCons{{ public int length(){ return rest.length()+1; } public String toString(){ return ","+first+rest; } public List toList(){ return rest.toList().push(""+first); } public List toTUList(){ return rest.toTUList().push(first); } }} TypeUseEmpty{{ public String toString(){ return ">"; } }} PESubtypeList{{ public boolean isEmpty(); }} NESubtypeList{{ public boolean isEmpty(){ return false; } }} SubtypeList{{ public abstract boolean isEmpty(); }} SubtypeCons{{ public boolean isEmpty(){ return false; } }} SubtypeEmpty{{ public boolean isEmpty(){ return true; } }} LitToken{{ public String string(); }} AddToken{{ public String string(){ return str; } }} TheEOF{{ public String string(){ return ""; } }} EmptyToken{{ public String string(){ return ""; } }} RealToken{{ public String string(){ return str; } }} BehFile{{ public BehDef findDef(String n){ return behs.findDef(n); } public boolean hasDef(String n){ return behs.hasDef(n); } }} BehDefList{{ public abstract BehDef findDef(String name); public abstract boolean hasDef(String name); public abstract List toList(); }} BehDefCons{{ public BehDef findDef(String n){ return (n.equals(""+first.name)?first:rest.findDef(n)); } public boolean hasDef(String n){ return (n.equals(""+first.name) || rest.hasDef(n)); } public List toList(){ return rest.toList().push(first); } }} BehDefEmpty{{ public BehDef findDef(String n){ throw new RE("No Behaviour for \'"+n+"\'"); } public boolean hasDef(String n){ return false; } public List toList(){ return List.create(); } }} DoGen{{ public boolean doGen(){ return true; } public boolean doParse(){ return true; } public DoGen merge(YesGen g){ return this; } public DoGen merge(Extern g){ return g; } public abstract DoGen merge(DoGen g); public abstract DoGen merge(NoGen g); public abstract DoGen merge(NoParse g); }} NoGen{{ public boolean doGen(){ return false; } public DoGen merge(DoGen g){ return g.merge(this); } public DoGen merge(NoGen g){ return g; } public DoGen merge(NoParse g){ return new Extern(); } }} NoParse{{ public boolean doParse(){ return false; } public DoGen merge(DoGen g){ return g.merge(this); } public DoGen merge(NoGen g){ return g; } public DoGen merge(NoParse g){ return new Extern(); } }} Extern{{ public boolean doGen(){ return false; } public boolean doParse(){ return false; } public DoGen merge(DoGen g){ return g.merge(this); } public DoGen merge(NoGen g){ return this; } public DoGen merge(NoParse g){ return this; } }} YesGen{{ public DoGen merge(DoGen g){ return g.merge(this); } public DoGen merge(NoGen g){ return g; } public DoGen merge(NoParse g){ return g; } }} FieldOrSyntax{{ public abstract boolean isSyntax(); }} Field{{ public boolean isSyntax(){ return false; } }} Syntax{{ public boolean isSyntax(){ return true; } }} FieldList{{ public abstract List justFields(); public abstract List toList(); public abstract FieldList append(FieldList l); public abstract FieldList append(List l); public abstract boolean isEmpty(); public FieldList push(FieldOrSyntax f){ return new FieldCons(f,this); } }} FieldCons{{ public List justFields(){ List r = rest.justFields(); return first.isSyntax()?r:r.push((Field)first); } public List toList(){ return rest.toList().push(first); } public FieldList append(FieldList l){ return rest.append(l).push(first); } public FieldList append(List l){ return rest.append(l).push(first); } public boolean isEmpty(){ return false; } }} FieldEmpty{{ public List justFields(){ return List.create(); } public List toList(){ return List.create(); } public FieldList append(FieldList l){ return l; } public FieldList append(List l){ return l.foldr(new List.Fold(){ public FieldList fold(FieldOrSyntax f, FieldList r){ return r.push(f); } }, new FieldEmpty()); } public boolean isEmpty(){ return true; } }} LookDef{{ public boolean isLook(){ return false; } public int look(){ return 0; } }} LookAhead{{ public boolean isLook(){ return true; } public int look(){ return n; } }} NoLook{{}} RE{{ public RE(String s){ super(s); } }} TE{{ public TE(String s){ super(s); } }} RTParseException{{ public RTParseException(String s){ super(s); } }} RTFileNotFound{{ public RTFileNotFound(String s){ super(s); } }} DummyDGP{{ public String docComment(){ return "Dummy DGP Class"; } public FC functionObj(String beh){ return this; } public String combine(Some> ts, String s){ return ""; } public Trav traversalObj(final String beh) { return wrapTrav(Factory.newTraversal(functionObj(beh), control())); } }}