Exemple #1
0
        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());
 }
Exemple #3
0
        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);
        }
Exemple #4
0
    /// <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);
    }
Exemple #5
0
        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));
            }
        }
Exemple #7
0
 public static IFiniteAutomaton <T> AssertDegree <T>(this IFiniteAutomaton <T> @this, int degree)
 {
     Assert.AreEqual(degree, @this.State.Degree);
     return(@this);
 }
Exemple #8
0
 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());
        }
Exemple #10
0
 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();
 }
Exemple #13
0
 public TokenParser(INodeCollection nodes, IClassTable classTable, IFiniteAutomaton finiteAutomaton)
 {
     this.nodes           = nodes;
     this.classTable      = classTable;
     this.finiteAutomaton = finiteAutomaton;
 }