Exemplo n.º 1
0
            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;
            }
Exemplo n.º 2
0
        //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);
        }