public TransitionTable GetTransitionTable()
        {

            string alphabet = this.CalculateAlphabet();

            DottedItemSet currentState = this.InitialSet;

            DottedItemSetIndex states = new DottedItemSetIndex();

            states.Add(currentState);

            Queue<int> unexpandedStates = new Queue<int>();
            unexpandedStates.Enqueue(0);

            TransitionTable transitionTable = new TransitionTable();

            while (unexpandedStates.Count > 0)
            {

                int currentStateIndex = unexpandedStates.Dequeue();
                currentState = states.GetItemSet(currentStateIndex);

                foreach (char input in alphabet)
                {

                    DottedItemSet nextState = currentState.GetFollowingSet(input);

                    if (nextState.IsEmpty)
                        continue;

                    int nextStateIndex;

                    if (states.Contains(nextState))
                    {
                        nextStateIndex = states.GetIndexFor(nextState);
                    }
                    else
                    {
                        states.Add(nextState);
                        nextStateIndex = states.GetIndexFor(nextState);
                        unexpandedStates.Enqueue(nextStateIndex);
                    }

                    transitionTable.SetTransition(currentStateIndex, input, nextStateIndex);

                    nextState
                        .TryReduceTokenClass()
                        .ForEach((tokenClass) => transitionTable.SetReduction(nextStateIndex, tokenClass));

                }

            }

            return transitionTable;

        }
 public TransitionTableVisualizer(TransitionTable table)
 {
     Contract.Requires<ArgumentNullException>(table != null, "Transition table must be non-null.");
     this.Table = table;
 }
Ejemplo n.º 3
0
 public TableDrivenLexer(TransitionTable transitionTable)
 {
     Contract.Requires<ArgumentNullException>(transitionTable != null, "Transition table must be non-null.");
     this.Table = transitionTable;
 }