Exemplo n.º 1
0
        public void DFA_RemoveTrapStates()
        {
            var dfa = new DFATable();
            var a   = dfa.CreateNode();
            var c   = dfa.CreateNode();

            a.IsFinal = true;

            dfa.StartState = a;

            dfa.AddTransition(a, a, "0");
            dfa.AddTransition(a, c, "1");

            dfa.AddTransition(c, c, "1");
            dfa.AddTransition(c, c, "0");

            var nfa = dfa.RemoveTrapStates();

            Assert.AreEqual(1, nfa.Nodes.Count());
            Assert.AreEqual(1, nfa.Transitions.Count());
            Assert.AreEqual(0, nfa.Transitions.First().Source.ID);
            Assert.AreEqual(0, nfa.Transitions.First().Destination.ID);
            Assert.AreEqual("0", nfa.Transitions.First().Symbol);
            Assert.AreEqual(1, nfa.GetAllPossibleSymbols().Count);
            Assert.IsTrue(nfa.GetAllPossibleSymbols().Contains("0"));
        }
Exemplo n.º 2
0
        public DFATests()
        {
            dfa = new DFATable();
            a   = dfa.CreateNode();
            b   = dfa.CreateNode();
            c   = dfa.CreateNode();
            d   = dfa.CreateNode();
            e   = dfa.CreateNode();
            f   = dfa.CreateNode();

            dfa.StartState = a;

            c.IsFinal = true;
            d.IsFinal = true;
            e.IsFinal = true;

            dfa.AddTransition(a, b, "0");
            dfa.AddTransition(a, c, "1");

            dfa.AddTransition(b, a, "0");
            dfa.AddTransition(b, d, "1");

            dfa.AddTransition(c, f, "1");
            dfa.AddTransition(c, e, "0");

            dfa.AddTransition(d, e, "0");
            dfa.AddTransition(d, f, "1");

            dfa.AddTransition(e, e, "0");
            dfa.AddTransition(e, f, "1");

            dfa.AddTransition(f, f, "1");
            dfa.AddTransition(f, f, "0");
        }
Exemplo n.º 3
0
        internal DFATable ToDFATable()
        {
            var dfa   = new DFATable();
            var nodes = dfa.CreateNodes(this._rows.Count);

            foreach (var row in this._rows)
            {
                var node = nodes[this._rowMapping[row.GetStatesIdentifier()]];
                node.IsFinal = row.IsRowFinal();

                foreach (var n in row.States)
                {
                    node.UnionTags(n.GetTags());
                }

                foreach (var symbol in this._symbols)
                {
                    if (symbol == NFATable.Epsilon)
                    {
                        continue;
                    }

                    var source      = node;
                    var destination = nodes[this._rowMapping[row.GetTransition(symbol).GetIdentifier()]];
                    dfa.AddTransition(source, destination, symbol);
                }
            }

            // First row should be the start state.
            dfa.StartState = nodes[this._rowMapping[this._rows[0].GetStatesIdentifier()]];

            return(dfa);
        }
Exemplo n.º 4
0
        public void MakeOneFinalState()
        {
            // It converts dfa to nfa
            if (this.Finish.Count > 1)
            {
                this.Alphabet = this.Alphabet.Concat(new char[] { 'ε' }.ToList()).ToList();

                // Adding eps trans to nothing for every state
                for (int i = 0; i < this.DFATable.Count; i++)
                {
                    this.DFATable[i].Add(new List <int>());
                }

                // Adding new state to direct  prev final states to this one
                var newFinalState = new List <List <int> >();

                // Adding empty trans
                for (int i = 0; i < Alphabet.Count; i++)
                {
                    newFinalState.Add(new List <int>());
                }


                DFATable.Add(newFinalState);


                // Point prev final states to new state
                for (int i = 0; i < this.Finish.Count; i++)
                {
                    DFATable[this.Finish[i]][this.Alphabet.IndexOf(Translation.Eps)].Add(this.DFATable.IndexOf(newFinalState));
                }

                this.Finish = new List <int>()
                {
                    this.DFATable.IndexOf(newFinalState)
                };
            }
        }