Exemplo n.º 1
0
        public static TlaAutomaton TranslateToTlaAutomaton(this automaton root, bool useTransitionConditions, AutomatonParsingContext ctx)
        {
            var automaton = new TlaAutomaton();

            foreach (var state in root.states)
            {
                var name = state.stateName.identifier.@string;
                automaton.CreateState(name, name.EndsWith("_init"), name.StartsWith("accept_"));
            }

            foreach (var state in root.states)
            {
                foreach (var target in state.transitions)
                {
                    var condition = target.condition.Translate(useTransitionConditions, ctx);
                    automaton.CreateTransition(state.stateName.identifier.@string, target.stateName.identifier.@string, condition);
                }

                if (state.skip != null)
                {
                    automaton.CreateTransition(
                        state.stateName.identifier.@string, state.stateName.identifier.@string,
                        useTransitionConditions ? new TlaTransitionConditionFormula(new Model.TransitionConditionExpr.ConstExpr(true))
                                                : (TlaFormula) new TlaExprFormula(new TlaExpr.Const(true))
                        );
                }
            }

            return(automaton);
        }
        public static Automaton TranslateToModel(this automaton root, AutomatonParsingContext ctx)
        {
            var transitionIdCount = 0;

            var a = new Automaton()
            {
                States = root.states.Select((s, n) => new State(n)
                {
                    Name        = s.stateName.identifier.@string,
                    IsInitial   = [email protected]("_init"),
                    IsAccepting = [email protected]("accept_"),
                }).ToList()
            };

            foreach (var state in root.states)
            {
                var st = a.States.First(s => s.Name == state.stateName.identifier.@string);

                st.Outgoing = state.transitions != null?state.transitions.Select(t => new Transition(transitionIdCount++)
                {
                    ToId      = a.States.First(s => s.Name == t.stateName.identifier.@string).Id,
                    FromId    = st.Id,
                    Condition = t.condition.exprSeq.TranslateToConditionExpr(ctx)
                }).ToList() : new List <Transition>();

                if (state.skip != null)
                {
                    st.Outgoing.Add(new Transition(transitionIdCount++)
                    {
                        ToId = st.Id, FromId = st.Id
                    });
                }
            }

            foreach (var st in a.States)
            {
                st.Incoming = a.States.SelectMany(s => s.Outgoing).Where(t => t.ToId == st.Id).ToList();
            }

            return(a);
        }