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