Ejemplo n.º 1
0
        /// <summary>
        /// Performs single computation step of finite state machine.
        /// </summary>
        /// <param name="inputSymbol">Input transition symbol.</param>
        /// <returns></returns>
        public State <TInSymbol, TOutSymbol> MoveNext(TInSymbol inputSymbol)
        {
            Transition <TInSymbol, TOutSymbol> t;

            _status = AutomataStatus.Running;

            // Check if symbol is null
            if (inputSymbol is null)
            {
                SetError();
                throw new ArgumentNullException();
            }
            // Check if input symbol is invalid and proceed accordingly
            else if (!InputSymbols().Contains(inputSymbol))
            {
                return(TryHandleInvalidInput());
            }
            // Check if transition function exist and proceed accordingly
            else if ((t = GetTransition(_currentState, inputSymbol)) is null)
            {
                return(TryHandleMissingTransition());
            }
            // Process valid program step
            else
            {
                TryCallExitAction(_currentState, inputSymbol);
                TryCallTransitionAction(t, inputSymbol);
                _currentState = t.TargetState;
                TryCallEntryAction(_currentState, inputSymbol);
                return(_currentState);
            }
        }
Ejemplo n.º 2
0
 /// <summary>
 /// Performs attempt to reset DFA. Reset is performed if ResetOnTrapState option is eneabled.
 /// </summary>
 private void TryEscapeTrapState()
 {
     if ((_options & FiniteAutomataOptions.ResetOnTrapState) != 0)
     {
         Reset();
     }
     else
     {
         _status = AutomataStatus.Trapped;
     }
 }
Ejemplo n.º 3
0
 /// <summary>
 /// Returns instance of DFA.
 /// </summary>
 /// <param name="transitions">Collection of DFA transitions.</param>
 /// <param name="startState">Reference to start state.</param>
 /// <param name="errorState">Reference to error state.</param>
 /// <param name="options">DFA options.</param>
 public DFA(IEnumerable <Transition <TInSymbol, TOutSymbol> > transitions,
            State <TInSymbol, TOutSymbol> startState,
            State <TInSymbol, TOutSymbol> errorState,
            FiniteAutomataOptions options = FiniteAutomataOptions.None)
 {
     _transitions  = transitions ?? throw new ArgumentNullException();
     _startState   = startState ?? throw new ArgumentNullException();
     _errorState   = errorState ?? throw new ArgumentNullException();
     _currentState = _startState;
     _options      = options;
     _status       = AutomataStatus.Ready;
     if (!IsDeterministic())
     {
         throw new ArgumentOutOfRangeException("Non deterministic transitions passed to DFA class constructor");
     }
 }
Ejemplo n.º 4
0
 /// <summary>
 /// Sets DFA to error state.
 /// </summary>
 private void SetError()
 {
     _status       = AutomataStatus.Error;
     _currentState = _errorState;
 }
Ejemplo n.º 5
0
 /// <summary>
 /// Resets DFA. Calling this method resets internal program counter (next step will be processed from statring state) and clears internal buffer if ClearBufferOnReset option is eneabled.
 /// </summary>
 public void Reset()
 {
     _status       = AutomataStatus.Ready;
     _currentState = _startState;
 }