/// <summary> /// Generate a tree from a tree definition /// </summary> public bool AddTree(TreeDef def, FastTransducerInstance fti, Dictionary<string, Def> defs) { switch (def.tdkind) { case TreeDefKind.Witness: { TreeWitnessDef ce = def as TreeWitnessDef; TreeTransducer language = OperationTranGen.getTreeAutomatonFromExpr(ce.language, fti, defs); var res = language.GenerateWitness(); if(res!=null) this.trees.Add(def.func.name.text, new Expr[] { res }); else this.trees.Add(def.func.name.text, new Expr[] { }); break; } case TreeDefKind.Apply: { TreeAppDef ce = def as TreeAppDef; IEnumerable<Expr> t = null; if (ce.expr.kind == FExpKind.Var) { foreach (var treeDef in fti.treeDefinitions) if (treeDef.Value.trees.TryGetValue(ce.expr.token.text, out t)) break; if (t == null) { this.trees.Add(def.func.name.text, null); return true; } } else { Expr t1 = GenerateZ3ExprFromToExpr(ce.expr, alphabet, null, 0, null, null, defs, fti, null).Simplify(); List<Expr> tl = new List<Expr>(); tl.Add(t1); t = tl; } TreeTransducer a = OperationTranGen.getTreeAutomatonFromExpr(ce.transducer, fti, defs); var results = a.Apply(t); this.trees.Add(def.func.name.text, results.ToList()); break; } case TreeDefKind.Tree: { TreeExpDef ce = def as TreeExpDef; IEnumerable<Expr> t = null; if (ce.expr.kind == FExpKind.Var) { foreach (var treeDef in fti.treeDefinitions) if (treeDef.Value.trees.TryGetValue(ce.expr.token.text, out t)) break; if (t == null) { this.trees.Add(def.func.name.text, null); return true; } } else { Expr t1 = GenerateZ3ExprFromToExpr(ce.expr, alphabet, null, 0, null, null, defs, fti, null).Simplify(); List<Expr> tl = new List<Expr>(); tl.Add(t1); t = tl; } this.trees.Add(def.func.name.text, t); break; } } return true; }
//Generate the C# corresponding to one constant private static bool GenerateTree(TreeDef def, StringBuilder sb) { sb.Append("public static Tree"+def.domain.name.text+" "+def.func.name.text +" = "); switch (def.tdkind) { case TreeDefKind.Apply: throw new FastException(FastExceptionKind.NotImplemented); case TreeDefKind.Tree: PrintOutputTree(null, (def as TreeExpDef).expr, def.domain.name.text, sb, false); break; case TreeDefKind.Witness: throw new FastException(FastExceptionKind.NotImplemented); } sb.AppendLine(";"); sb.AppendLine(); return true; }