Inheritance: DefDef
コード例 #1
0
        /// <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;
        }
コード例 #2
0
        //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;
        }