public TlaState(TlaAutomaton owner, int id, string name, bool isInitial, bool isAccepting) { _owner = owner; this.Id = id; this.Name = name; //.LowerFirstCharacter(); this.IsInitial = isInitial; this.IsAccepting = isAccepting; }
//public static string LowerFirstCharacter(this string str) //{ // if (string.IsNullOrWhiteSpace(str)) // return str; // return char.ToLower(str[0]) + str.Substring(1); //} public static TlaAutomaton ToTlaAutomaton(this Automaton automaton, bool useTransitionConditions) { var result = new TlaAutomaton(); foreach (var state in automaton.States) { result.CreateState(state.Name, state.IsInitial, state.IsAccepting); } foreach (var state in automaton.States) { foreach (var transition in state.Outgoing) { if (transition.Actions == null || transition.Actions.Count == 0) { result.CreateTransition( result.GetState(automaton.States.First(s => s.Id == transition.FromId).Name).Id, result.GetState(automaton.States.First(s => s.Id == transition.ToId).Name).Id, transition.MakeConditionFormula(useTransitionConditions) ); } else { if (string.IsNullOrWhiteSpace(transition.EventName)) { throw new NotImplementedException(""); } var statesSeq = transition.Actions.Select(actionName => result.CreateState(string.Format("{0}|{1}_before_{2}", state.Name, transition.EventName, actionName), false, false)) .Concat(new[] { result.GetState(automaton.States.First(s => s.Id == transition.ToId).Name) }) .ToArray(); result.CreateTransition( result.GetState(automaton.States.First(s => s.Id == transition.FromId).Name).Id, statesSeq.First().Id, new TlaTransitionConditionFormula(new TransitionConditionExpr.VarExpr(transition.EventName)) ); for (int i = 0; i < transition.Actions.Count; i++) { var actionName = transition.Actions[i]; var condition = new TlaTransitionConditionFormula(new TransitionConditionExpr.VarExpr(actionName)); result.CreateTransition(statesSeq[i].Id, statesSeq[i + 1].Id, condition); } } } } return(result); }