public static void ParseDiGraphToStateMachine(IGStateConfiguration gStateConfiguration = default) { const string pattern = @"\s*(?<State>.+?)\s*->\s*(?<NextState>.+?)\s*\[label\s*=\s*""(?<Trigger>[^""\]]+?)""\]"; Regex regex = new Regex(pattern); //StringBuilder diGraphSB = new StringBuilder(); //diGraph.ForEach(sc => { // sc.GStateTransitions.ForEach(st => { // diGraphSB.Append(st); // }); //}); var diGraphStates = regex.Matches(string.Join(" ", gStateConfiguration.GDOTGraphStatements)).Cast <Match>() .Select(x => (State: x.Groups["State"].Value, Trigger: x.Groups["Trigger"].Value, NextState: x.Groups["NextState"].Value, GuardPredicate: x.Groups["GuardPredicate"].Value)); //var stateNames = diGraphStates.Select(x => x.State).Concat(diGraphStates.Select(x => x.NextState)).Distinct(); //var triggerNames = diGraphStates.Select(x => x.Trigger).Distinct(); //var transitionNames = diGraphStates.Select(x => (fromState: x.State,toState: x.NextState, trigger:x.Trigger).Distinct(); var stateConfigurations = diGraphStates.Select(x => $"new StateConfiguration(state:State.{x.State},trigger:Trigger.{x.Trigger},nextState:State.{x.NextState}),"); gStateConfiguration.GDiGraphStates.AddRange(diGraphStates); gStateConfiguration.GStateNames.AddRange(diGraphStates.Select(x => x.State).Concat(diGraphStates.Select(x => x.NextState)).Distinct()); gStateConfiguration.GTriggerNames.AddRange(diGraphStates.Select(x => x.Trigger).Distinct()); //return (stateNames, triggerNames, stateConfigurations); }
public GMethod(IGMethodDeclaration gDeclaration = default, IGBody gBody = default, IGComment gComment = default, bool isForInterface = false, IGStateConfiguration gStateConfiguration = default) { GDeclaration = gDeclaration == default ? new GMethodDeclaration() : gDeclaration; GBody = gBody == default ? new GBody() : gBody; GComment = gComment == default ? new GComment() : gComment; IsForInterface = isForInterface; GStateConfiguration = gStateConfiguration == default ? new GStateConfiguration() : gStateConfiguration; Id = new GMethodId <TValue>(); }