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