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;
}