ToFast() public méthode

Generates the corresponding Fast code
public ToFast ( StringBuilder sb ) : void
sb StringBuilder string builder to append the generated code
Résultat void
        //Generate result from query
        private static bool GenerateQueryResult(QueryDef query, Dictionary<string, Def> defs, FastTransducerInstance fti)
        {
            string msg = "";
            switch (query.id.Kind)
            {
                case (Tokens.CONTAINS):
                    {
                        ContainsQueryDef ct = query as ContainsQueryDef;

                        IEnumerable<Expr> t = null;
                        if (ct.expr.kind == FExpKind.Var)
                        {
                            foreach (var treeDef in fti.treeDefinitions)
                                if (treeDef.Value.trees.TryGetValue(ct.expr.token.text, out t))
                                    break;
                        }
                        else
                        {
                            throw new FastException(FastExceptionKind.InternalError);
                        }

                        TreeTransducer lang = OperationTranGen.getTreeAutomatonFromExpr(ct.language, fti, defs);

                        var results = lang.Apply(t).ToList();
                        var containsRes = results.Count>0;

                        msg = string.Format("'{0}' is{1} a member of the language '{2}'", ct.expr, containsRes ? "" : " not", ct.language);
                        if (ct.isAssert)
                        {
                            if (containsRes == ct.assertTrue)
                                return true;
                            else
                                throw new FastAssertException(msg,ct.func.name.line, ct.func.name.position);
                        }
                        break;
                    }
                case (Tokens.TYPECHECK):
                    {
                        TypecheckQueryDef ct = query as TypecheckQueryDef;

                        TreeTransducer input = OperationTranGen.getTreeAutomatonFromExpr(ct.input, fti, defs);
                        TreeTransducer output = OperationTranGen.getTreeAutomatonFromExpr(ct.output, fti, defs);
                        TreeTransducer trans = OperationTranGen.getTreeAutomatonFromExpr(ct.trans, fti, defs);

                        //Preimage of outputcomplement doesn't interesect input
                        var ocomp = output.Complement();
                        var preim = trans.RestrictRange(ocomp).ComputeDomainAcceptor();
                        var badinp = preim.Intersect(input);
                        bool typechecks = badinp.IsEmpty;

                        //For assertions
                        var sb = new StringBuilder();
                        if (!typechecks)
                        {
                            var badInput = badinp.GenerateWitness();
                            FastGen fg = new FastGen(z3p);
                            sb.Append("\n ---> input '");
                            fg.ToFastExpr(badInput, sb, false);
                            sb.Append("' produces output '");
                            // take first bad output
                            foreach (var v in trans.Apply(new Expr[] { badInput }))
                                if(output.Apply(new Expr[] { v })!=null)
                                {
                                    fg.ToFastExpr(v, sb, false);
                                    break;
                                }
                            sb.Append("'");
                        }
                        msg = string.Format("'{0}' has{3} type '{1}' -> '{2}'{4}",
                            ct.trans, ct.input, ct.output, typechecks ? "" : " not",sb.ToString());
                        if (ct.isAssert)
                        {
                            if (typechecks == ct.assertTrue)
                                return true;
                            else
                                throw new FastAssertException(msg, ct.func.name.line, ct.func.name.position);
                        }
                        break;
                    }
                case (Tokens.ID):
                case (Tokens.PRINT):
                    {
                        DisplayQueryDef dt = query as DisplayQueryDef;
                        StringBuilder sb = new StringBuilder();
                        FastGen fastgen = new FastGen(z3p);

                        var toPrintDef = defs[dt.toPrintVar];
                        switch (toPrintDef.kind)
                        {
                            case DefKind.Alphabet:
                            case DefKind.Const:
                            case DefKind.Function:
                            case DefKind.Enum:
                                {
                                    toPrintDef.PrettyPrint(sb);
                                    msg = string.Format("'{0}': {1}", dt.toPrintVar, sb);
                                    break;
                                }
                            case DefKind.Lang:
                                {
                                    LangDef td = toPrintDef as LangDef;
                                    var trans = fti.treeDefinitions[td.domain.name.text].acceptors[dt.toPrintVar];
                                    fastgen.ToFast(dt.toPrintVar,trans, sb,true);
                                    msg = string.Format("{0}", sb);
                                    break;
                                }
                            case DefKind.Trans:
                                {
                                    TransDef td = toPrintDef as TransDef;
                                    var trans = fti.treeDefinitions[td.domain.name.text].transducers[dt.toPrintVar];
                                    fastgen.ToFast(dt.toPrintVar,trans, sb,false);
                                    msg = string.Format("{0}", sb);
                                    break;
                                }
                            case DefKind.Def:
                                {
                                    DefDef df = toPrintDef as DefDef;
                                    switch(df.ddkind){
                                        case DefDefKind.Lang:
                                            {
                                                LangDefDef td = df as LangDefDef;
                                                var trans = fti.treeDefinitions[td.domain.name.text].acceptors[dt.toPrintVar];
                                                fastgen.ToFast(dt.toPrintVar, trans, sb, true);
                                                msg = string.Format("{0}", sb);
                                                break;
                                            }
                                        case DefDefKind.Trans:
                                            {
                                                TransDefDef td = df as TransDefDef;
                                                var trans = fti.treeDefinitions[td.domain.name.text].transducers[dt.toPrintVar];
                                                fastgen.ToFast(dt.toPrintVar, trans, sb, false);
                                                msg = string.Format("{0}", sb);
                                                break;
                                            }
                                        case DefDefKind.Tree:
                                            {
                                                TreeDef td = df as TreeDef;
                                                var trees = new List<Expr>(fti.treeDefinitions[td.domain.name.text].trees[dt.toPrintVar]);
                                                var counter = 1;
                                                if(trees.Count==0){
                                                    msg = string.Format("'{0}' does not contain any tree", dt.toPrintVar);
                                                    break;
                                                }
                                                sb.AppendLine(string.Format("'{0}': [", dt.toPrintVar));
                                                foreach (var tree in trees)
                                                {
                                                    sb.AppendFormat("\t{0}) ",counter);
                                                    fastgen.ToFastExpr(tree, sb, false);
                                                    sb.AppendLine();
                                                    counter++;
                                                }
                                                sb.Append("]");
                                                msg += sb.ToString();
                                                break;
                                            }
                                    }
                                    break;
                                }
                        }
                        break;
                    }
                case (Tokens.STRING):
                    {
                        StringQueryDef ie = query as StringQueryDef;
                        msg = ie.message;
                        break;
                    }
                case (Tokens.IS_EMPTY_TRANS):
                case (Tokens.IS_EMPTY_LANG):
                    {
                        IsEmptyQueryDef ie = query as IsEmptyQueryDef;

                        if (ie.isTrans)
                        {
                            IsEmptyTransQueryDef te = ie as IsEmptyTransQueryDef;
                            TreeTransducer trans = OperationTranGen.getTreeAutomatonFromExpr(te.trans, fti, defs);

                            if (trans.IsEmpty)
                                msg = string.Format("The transformation '{0}' is empty", te.trans);
                            else
                            {
                                FastGen fg = new FastGen(z3p);
                                StringBuilder sb = new StringBuilder();
                                var tre = trans.ComputeDomainAcceptor().GenerateWitness();
                                fg.ToFastExpr(tre, sb, false);
                                msg = string.Format("The transformation '{0}' is not empty\n ---> '{0}' accepts the tree '{1}'", te.trans, sb.ToString());
                            }
                            //For assertions
                            if (te.isAssert)
                            {
                                if (trans.IsEmpty == te.assertTrue)
                                    return true;
                                else
                                    throw new FastAssertException(msg, te.func.name.line, te.func.name.position);
                            }

                        }
                        else
                        {
                            IsEmptyLangQueryDef te = ie as IsEmptyLangQueryDef;
                            TreeTransducer lang = OperationTranGen.getTreeAutomatonFromExpr(te.lang, fti, defs);

                            if (lang.IsEmpty)
                            {
                                msg = string.Format("The transformation '{0}' is empty", te.lang);
                            }
                            else
                            {
                                FastGen fg = new FastGen(z3p);
                                StringBuilder sb = new StringBuilder();
                                var tre = lang.GenerateWitness();
                                fg.ToFastExpr(tre, sb, false);
                                msg = string.Format("The language '{0}' is not empty\n ---> '{0}' accepts the tree '{1}'", te.lang, sb.ToString());
                            }

                            if (te.isAssert)
                            {
                                if (lang.IsEmpty == te.assertTrue)
                                    return true;
                                else
                                    throw new FastAssertException(msg, te.func.name.line, te.func.name.position);
                            }
                        }
                        break;
                    }
                case (Tokens.EQ_TRANS):
                case (Tokens.EQ_LANG):
                    {
                        EquivQueryDef ie = query as EquivQueryDef;

                        if (ie.isTransEquiv)
                        {
                            TransEquivQueryDef te = ie as TransEquivQueryDef;
                            TreeTransducer trans1 = OperationTranGen.getTreeAutomatonFromExpr(te.trans1, fti, defs);
                            TreeTransducer trans2 = OperationTranGen.getTreeAutomatonFromExpr(te.trans2, fti, defs);

                            throw new FastException(FastExceptionKind.NotImplemented);

                            //if (te.isAssert)
                            //{
                            //    if (lang.IsEmpty == te.assertTrue)
                            //        return true;
                            //    else
                            //        throw new FastAssertException(ct.func.name.line, ct.func.name.position);
                            //}
                            //msg = string.Format("The transformation '{0}' is{1} empty", te.trans, trans.IsEmpty ? "" : " not");
                        }
                        else
                        {
                            StringBuilder sb = new StringBuilder();
                            FastGen fg = new FastGen(z3p);
                            StringBuilder msgBd = new StringBuilder();
                            LangEquivQueryDef te = ie as LangEquivQueryDef;
                            TreeTransducer lang1 = OperationTranGen.getTreeAutomatonFromExpr(te.lang1, fti, defs);
                            TreeTransducer lang2 = OperationTranGen.getTreeAutomatonFromExpr(te.lang2, fti, defs);

                            var areEquiv = false;
                            string counterex ="";
                            //var lang1m = lang1.MinimizeMoore();
                            TreeTransducer lang1_compl = lang1.Complement();
                            TreeTransducer lang = lang1_compl.Intersect(lang2);
                            if (lang.IsEmpty)
                            {
                                lang = lang2.Complement().Intersect(lang1);
                                areEquiv = lang.IsEmpty;
                                if (!areEquiv)
                                {
                                    fg.ToFastExpr(lang.GenerateWitness(), sb, false);
                                    counterex = string.Format("---> the language '{0}' contains the tree '{1}' while '{2}' doesn't.", te.lang1, sb.ToString(), te.lang2);
                                }
                            }
                            else
                            {
                                var tre = lang.GenerateWitness();
                                fg.ToFastExpr(tre, sb, false);
                                counterex = string.Format("---> the language '{0}' contains the tree '{1}' while '{2}' doesn't.", te.lang2, sb.ToString(),te.lang1);
                            }

                            msgBd.AppendFormat("The language '{0}' is{1} equivalent to language '{2}':", te.lang1, lang.IsEmpty ? "" : " not",te.lang2);
                            if (!areEquiv)
                            {
                                msgBd.AppendLine();
                                msgBd.Append(counterex);
                            }
                            msg = msgBd.ToString();

                            //Assertion case
                            if (te.isAssert)
                            {
                                if (areEquiv == te.assertTrue)
                                    return true;
                                else
                                    throw new FastAssertException(msg, te.func.name.line, te.func.name.position);
                            }
                        }
                        break;
                    }
                case (Tokens.GEN_CSHARP):
                    {
                        GenCodeQueryDef cge = query as GenCodeQueryDef;
                        StringBuilder sb = new StringBuilder();

                        switch (cge.language)
                        {
                            case PLang.CSharp:
                                fti.ToFast(sb);
                                FastPgm pgm = Parser.ParseFromString(sb.ToString());
                                sb = new StringBuilder();
                                sb.AppendLine("generated C# [");
                                CsharpGenerator.GenerateCode(pgm, sb);
                                sb.AppendLine("]");
                                msg = sb.ToString();
                                break;
                            case PLang.Javascript:
                                throw new FastException(FastExceptionKind.NotImplemented);
                        }
                        break;
                    }
                default:
                    throw new FastException(FastExceptionKind.InternalError);
            }
            fti.fastLog.WriteLog(LogLevel.Minimal, msg);
            fti.queryRes.Add(new QueryResult(msg));
            return true;
        }