/// <summary> /// Write the alphabet definition into sb. /// E.g. A[s:string,b:bool,i:int]{zero(0),one(1),two(2)} /// </summary> public void ToFast(RankedAlphabet ra, StringBuilder sb) { sb.Append("Alphabet "); sb.Append(ra.AlphabetSort.Name.ToString()); FuncDecl[] attrFields; try { attrFields = ((TupleSort)ra.AttrSort).FieldDecls; } catch { throw new AutomataException(AutomataExceptionKind.Fast_AttributeMustBeTuple); } sb.Append("["); for (int i = 0; i < attrFields.Length; i++) { if (i > 0) { sb.Append(","); } sb.Append(attrFields[i].Name.ToString()); sb.Append(":"); sb.Append(GetSortName(tt.Z.GetRange(attrFields[i]))); } sb.Append("]{"); for (int i = 0; i < ra.constructors.Length; i++) { if (i > 0) { sb.Append(","); } sb.Append(ra.constructors[i].Name.ToString()); sb.Append("("); sb.Append(ra.ranks[i]); sb.Append(")"); } sb.AppendLine("}"); }
public static TreeTransducer ParseVataFormat(string vataString) { var lines = vataString.Split('\r', '\n'); Z3Provider Z = new Z3Provider(); RankedAlphabet A = null; string name = null; List <int> finStates = new List <int>(); var rules = new List <TreeRule>(); Dictionary <string, int> names = new Dictionary <string, int>(); List <string> constructorNames = new List <string>(); List <int> constructorArities = new List <int>(); bool transitionsStarted = false; foreach (var line in lines) { if (!transitionsStarted) { if (line.StartsWith("Ops")) { var constructors = line.Split(' '); foreach (var constructor in constructors) { var sp = constructor.Split(':'); if (sp.Length > 1) { if (!constructorNames.Contains(sp[0])) { constructorNames.Add(sp[0]); int ar = int.Parse(sp[1]); constructorArities.Add(ar); } } } if (constructorNames.Count == 0) { return(null); } A = Z.TT.MkRankedAlphabet("A", Z.UnitSort, constructorNames.ToArray(), constructorArities.ToArray()); } if (line.StartsWith("Automaton")) { var sp = line.Split(' '); name = sp[1]; } if (line.StartsWith("Final")) { var sp = line.Split(' '); for (int i = 2; i < sp.Length; i++) { if (sp[i].Length > 0) { finStates.Add(GetState(sp[i], names)); } } } if (line.StartsWith("Transit")) { transitionsStarted = true; } } else { var sp = line.Split('-', '>'); if (sp.Length > 1) { var pieces = sp[0].Split('(', ',', ')', ' '); var constructor = pieces[0]; List <int> from = new List <int>(); for (int i = 1; i < pieces.Length - 1; i++) { if (pieces[i].Length > 0) { from.Add(GetState(pieces[i], names)); } } var to = GetState(sp[sp.Length - 1], names); rules.Add(Z.TT.MkTreeAcceptorRule(A, to, constructor, Z.True, from.ToArray())); } } } return(Z.TT.MkTreeAutomaton(finStates, A, A, rules)); }