public static IFiniteAutomaton <T> AssertTransition <T>(this IFiniteAutomaton <T> @this, T symbol, int stateID) { IFiniteAutomatonState <T> state = @this.State[symbol]; Assert.IsNotNull(state); Assert.AreEqual(state.ID, stateID); return(@this); }
public static string GetStateLabel <TAlphabet, TState>(this IFiniteAutomaton <TAlphabet, TState> fa, TState state, string sep) { return(state is IFiniteAutomatonState faState ? faState.Label // state type have an opinion : fa is IFiniteAutomatonStateHomomorphism <TState> faStateH ? faStateH.GetStateLabel(state, sep) // automaton have en opinion : state.ToString()); }
public void StringMatchAutomatonBuilderTest2() { IFiniteAutomaton <char> finiteAutomaton = CreateFiniteAutomaton("ABCDABD"); finiteAutomaton.AssertID(0); finiteAutomaton.AssertDegree(1); finiteAutomaton.AssertTransition('A', 1); Assert.IsFalse(finiteAutomaton.IsStringAccepted); finiteAutomaton.MakeTransition('A'); finiteAutomaton.AssertID(1); finiteAutomaton.AssertDegree(2); finiteAutomaton.AssertTransition('B', 2); finiteAutomaton.AssertTransition('A', 1); Assert.IsFalse(finiteAutomaton.IsStringAccepted); finiteAutomaton.MakeTransition('B'); finiteAutomaton.AssertID(2); finiteAutomaton.AssertDegree(2); finiteAutomaton.AssertTransition('C', 3); finiteAutomaton.AssertTransition('A', 1); Assert.IsFalse(finiteAutomaton.IsStringAccepted); finiteAutomaton.MakeTransition('C'); finiteAutomaton.AssertID(3); finiteAutomaton.AssertDegree(2); finiteAutomaton.AssertTransition('D', 4); finiteAutomaton.AssertTransition('A', 1); Assert.IsFalse(finiteAutomaton.IsStringAccepted); finiteAutomaton.MakeTransition('D'); finiteAutomaton.AssertID(4); finiteAutomaton.AssertDegree(1); finiteAutomaton.AssertTransition('A', 5); Assert.IsFalse(finiteAutomaton.IsStringAccepted); finiteAutomaton.MakeTransition('A'); finiteAutomaton.AssertID(5); finiteAutomaton.AssertDegree(2); finiteAutomaton.AssertTransition('B', 6); finiteAutomaton.AssertTransition('A', 1); Assert.IsFalse(finiteAutomaton.IsStringAccepted); finiteAutomaton.MakeTransition('B'); finiteAutomaton.AssertID(6); finiteAutomaton.AssertDegree(3); finiteAutomaton.AssertTransition('D', 7); finiteAutomaton.AssertTransition('C', 3); finiteAutomaton.AssertTransition('A', 1); Assert.IsFalse(finiteAutomaton.IsStringAccepted); finiteAutomaton.MakeTransition('D'); finiteAutomaton.AssertID(7); finiteAutomaton.AssertDegree(1); finiteAutomaton.AssertTransition('A', 1); Assert.IsTrue(finiteAutomaton.IsStringAccepted); }
/// <summary> /// Implements <see cref="IFiniteAutomaton{TState, TSymbol}.RemoveUnreachable"/>. /// </summary> /// <typeparam name="TState">The state type.</typeparam> /// <typeparam name="TSymbol">The symbol type.</typeparam> /// <param name="automaton">The automaton to remove unreachable states from.</param> /// <returns>True, if there were unreachable states removed.</returns> public static bool RemoveUnreachable <TState, TSymbol>(IFiniteAutomaton <TState, TSymbol> automaton) { var unreachable = automaton.States.Except(automaton.ReachableStates, automaton.StateComparer).ToList(); var result = false; foreach (var state in unreachable) { if (automaton.States.Remove(state)) { result = true; } } return(result); }
public void StringMatchAutomatonBuilderTest1() { IFiniteAutomaton <char> finiteAutomaton = CreateFiniteAutomaton("ababaca"); finiteAutomaton.AssertID(0); finiteAutomaton.AssertDegree(1); finiteAutomaton.AssertTransition('a', 1); Assert.IsFalse(finiteAutomaton.IsStringAccepted); finiteAutomaton.MakeTransition('a'); finiteAutomaton.AssertID(1); finiteAutomaton.AssertDegree(2); finiteAutomaton.AssertTransition('b', 2); finiteAutomaton.AssertTransition('a', 1); Assert.IsFalse(finiteAutomaton.IsStringAccepted); finiteAutomaton.MakeTransition('b'); finiteAutomaton.AssertID(2); finiteAutomaton.AssertDegree(1); finiteAutomaton.AssertTransition('a', 3); Assert.IsFalse(finiteAutomaton.IsStringAccepted); finiteAutomaton.MakeTransition('a'); finiteAutomaton.AssertID(3); finiteAutomaton.AssertDegree(2); finiteAutomaton.AssertTransition('b', 4); finiteAutomaton.AssertTransition('a', 1); Assert.IsFalse(finiteAutomaton.IsStringAccepted); finiteAutomaton.MakeTransition('b'); finiteAutomaton.AssertID(4); finiteAutomaton.AssertDegree(1); finiteAutomaton.AssertTransition('a', 5); Assert.IsFalse(finiteAutomaton.IsStringAccepted); finiteAutomaton.MakeTransition('a'); finiteAutomaton.AssertID(5); finiteAutomaton.AssertDegree(3); finiteAutomaton.AssertTransition('c', 6); finiteAutomaton.AssertTransition('b', 4); finiteAutomaton.AssertTransition('a', 1); Assert.IsFalse(finiteAutomaton.IsStringAccepted); finiteAutomaton.MakeTransition('c'); finiteAutomaton.AssertID(6); finiteAutomaton.AssertDegree(1); finiteAutomaton.AssertTransition('a', 7); Assert.IsFalse(finiteAutomaton.IsStringAccepted); finiteAutomaton.MakeTransition('a'); finiteAutomaton.AssertID(7); finiteAutomaton.AssertDegree(2); finiteAutomaton.AssertTransition('a', 1); finiteAutomaton.AssertTransition('b', 2); Assert.IsTrue(finiteAutomaton.IsStringAccepted); }
internal ICompiledStringMatcher Compile() { var csc = new CSharpCodeProvider(); var parameters = new CompilerParameters(); parameters.GenerateInMemory = true; parameters.CompilerOptions = "/o"; //optimize the code parameters.ReferencedAssemblies.Add("System.dll"); parameters.ReferencedAssemblies.Add(typeof(IFiniteAutomaton).GetTypeInfo().Assembly.Location); CompilerResults results = csc.CompileAssemblyFromSource(parameters, source); if (results.Errors.HasErrors) { throw new AutomataException("C# compilation error: " + results.Errors[0].ErrorText); } else { var cls = results.CompiledAssembly.GetType(string.Format("{0}.{1}", namespacename, classname)); var cons = cls.GetConstructor(new Type[] { }); IFiniteAutomaton compiledAutomaton = cons.Invoke(new object[] { }) as IFiniteAutomaton; var ismatch = cls.GetMethod("IsMatch", BindingFlags.Static | BindingFlags.Public); return(new CompiledFiniteAutomaton(this.source, compiledAutomaton, ismatch)); } }
public static IFiniteAutomaton <T> AssertDegree <T>(this IFiniteAutomaton <T> @this, int degree) { Assert.AreEqual(degree, @this.State.Degree); return(@this); }
public static IFiniteAutomaton <T> AssertID <T>(this IFiniteAutomaton <T> @this, int id) { Assert.AreEqual(id, @this.State.ID); return(@this); }
public static string ToDotLanguage <TAlphabet, TState>( IFiniteAutomaton <TAlphabet, TState> fa, DotRankDirection direction = DotRankDirection.LeftRight, bool skipStateLabeling = false) { var sb = new StringBuilder(); sb.AppendLine("digraph dfa {"); switch (direction) { case DotRankDirection.TopBottom: sb.AppendLine("size=\"8.25,11\"; /* A4 paper portrait: 8.27 × 11.69 inches */"); sb.AppendLine("rankdir=TB;"); break; case DotRankDirection.LeftRight: sb.AppendLine("size=\"11,8.25\"; /* A4 paper landscape: 11.69 x 8.27 inches */"); sb.AppendLine("rankdir=LR;"); break; } // start state arrow indicator sb.AppendLine("n999999 [style=invis];"); // Invisible pseudo node required sb.AppendLine("n999999 -> n" + fa.GetStateId(fa.StartState) + ";"); // Edge into start state // label states (overriding default n0, n1 names) if (skipStateLabeling) { foreach (TState state in fa.GetTrimmedStates()) { sb.AppendLine("n" + fa.GetStateId(state) + " [label=\"" + fa.GetStateId(state) + "\"];"); } } else { foreach (TState state in fa.GetTrimmedStates()) { sb.AppendLine("n" + fa.GetStateId(state) + " [label=\"" + fa.GetStateLabel(state, "\\l") + "\"];"); } } // accept states are double circles foreach (TState state in fa.GetAcceptStates()) { sb.AppendLine("n" + fa.GetStateId(state) + " [peripheries=2];"); } // nodes and edges are defined by transitions foreach (var t in fa.GetTrimmedTransitions()) { sb.AppendLine("n" + fa.GetStateId(t.SourceState) + " -> n" + fa.GetStateId(t.TargetState) + " [label=\"" + t.Label + "\"];"); } if (skipStateLabeling) { sb.AppendLine("node [shape=box];"); foreach (TState state in fa.GetTrimmedStates().Reverse()) { sb.AppendLine("b" + fa.GetStateId(state) + " [label=\"" + fa.GetStateId(state) + ": " + fa.GetStateLabel(state, "\\l ") + "\"];"); } } sb.AppendLine("}"); return(sb.ToString()); }
public StringMatchFiniteAutomatonDebugView(StringMatchFiniteAutomaton owner) { this.coreOwner = owner; }
public static string GetStateId <TAlphabet, TState>(this IFiniteAutomaton <TAlphabet, TState> fa, TState state) { return(state is IFiniteAutomatonState faState ? faState.Id : state.ToString()); }
public FiniteAutomatonStringMatcher(string pattern) : base(pattern) { this.finiteAutomatonBuilder = new StringMatchAutomatonBuilder(Pattern); this.finiteAutomaton = BuildFiniteAutomaton(); }
public TokenParser(INodeCollection nodes, IClassTable classTable, IFiniteAutomaton finiteAutomaton) { this.nodes = nodes; this.classTable = classTable; this.finiteAutomaton = finiteAutomaton; }