windows-nt/Source/XPSP1/NT/net/ias/providers/nap/regex/state.hxx
2020-09-26 16:20:57 +08:00

282 lines
6.5 KiB
C++

//+-------------------------------------------------------------------------
//
// Copyright (C) 1991, Microsoft Corporation.
//
// File: State.hxx
//
// Contents: Finite automata state classes
//
// Classes:
//
// History: 01-21-92 KyleP Created
// 03-11-97 arunk Modified for regex lib
//--------------------------------------------------------------------------
#ifndef __STATE_HXX__
#define __STATE_HXX__
#include <windows.h>
#include <xlatchar.hxx>
class CStateSet;
class CSymbolSet;
//
// Special transition 'states'.
//
UINT const stateUncomputed = (1 << (sizeof( UINT ) * 8)) - 1; // Uncomputed move.
UINT const stateUndefined = (1 << (sizeof( UINT ) * 8)) - 2; // Undefined move.
UINT const stateUninitialized = (1 << (sizeof( UINT ) * 8)) - 3; // Uninitialized
//+-------------------------------------------------------------------------
//
// Class: CFAState
//
// Purpose: Basic finite automata state.
//
// History: 20-Jan-92 KyleP Created
//
//--------------------------------------------------------------------------
class CFAState
{
public:
inline CFAState() {};
inline CFAState( UINT iState, BOOL fFinal = false );
inline void Init( UINT iState );
inline UINT StateNumber() const;
inline BOOL IsFinal() const;
inline void MakeFinal();
protected:
UINT _iState;
BOOL _fFinal;
};
//+-------------------------------------------------------------------------
//
// Class: CNFAState
//
// Purpose: Nondeterministic finite automata state.
//
// History: 20-Jan-92 KyleP Created
//
// Notes: The array of moves is split into two pieces. Since most
// states only have a small number of transitions each
// CNFAState will hold a small number in the CNFAState
// object itself. Overflow is on the heap.
//
//--------------------------------------------------------------------------
const int CNFAState_cFirst = 2; // Default number of moves per state
class CNFAState : public CFAState
{
public:
inline CNFAState();
CNFAState( CNFAState const & src );
CNFAState & operator=( CNFAState const & src );
void Init( CNFAState & src );
void Init( UINT iState ) { CFAState::Init( iState ); }
inline ~CNFAState();
void AddTransition( UINT symbol, UINT StateNum );
void RemoveTransition( UINT symbol, UINT StateNum );
void Move( CStateSet & ss, UINT symbol = symEpsilon );
void Move( CStateSet & ss, CSymbolSet & symset );
protected:
class CMove
{
public:
inline CMove();
inline CMove( UINT symbol, UINT iState );
UINT _symbol;
UINT _iState;
};
CMove _moveFirst[CNFAState_cFirst];
CMove * _pmoveRest;
int _cmoveRest;
int _cMove;
};
//+-------------------------------------------------------------------------
//
// Member: CFAState::CFAState, public
//
// Synopsis: Initialize new state.
//
// Arguments: [iState] -- State number.
// [fFinal] -- true if state is a final state.
//
// History: 20-Jan-92 KyleP Created
//
//--------------------------------------------------------------------------
inline CFAState::CFAState( UINT iState, BOOL fFinal )
: _iState( iState ),
_fFinal( fFinal )
{
}
//+-------------------------------------------------------------------------
//
// Member: CFAState::Init, public
//
// Synopsis: Initialize a new state.
//
// Arguments: [iState] -- State number.
//
// History: 10-Jul-92 KyleP Created
// 23-Jul-92 KyleP Default states to non-final.
//
//--------------------------------------------------------------------------
inline void CFAState::Init( UINT iState )
{
_iState = iState;
_fFinal = false;
}
//+-------------------------------------------------------------------------
//
// Member: CFAState::StateNumber, public
//
// Returns: The state number.
//
// History: 20-Jan-92 KyleP Created
//
//--------------------------------------------------------------------------
inline UINT CFAState::StateNumber() const
{
return( _iState );
}
//+-------------------------------------------------------------------------
//
// Member: CFAState::IsFinal, public
//
// Returns: true if this state is a final state.
//
// History: 20-Jan-92 KyleP Created
//
//--------------------------------------------------------------------------
inline BOOL CFAState::IsFinal() const
{
return( _fFinal );
}
//+-------------------------------------------------------------------------
//
// Member: CFAState::MakeFinal, public
//
// Synopsis: Indicates state is a final state.
//
// History: 20-Jan-92 KyleP Created
//
//--------------------------------------------------------------------------
inline void CFAState::MakeFinal()
{
_fFinal = true;
}
//+-------------------------------------------------------------------------
//
// Member: CNFAState::CMove::CMove, private
//
// Synopsis: Initializes move.
//
// History: 20-Jan-92 KyleP Created
//
//--------------------------------------------------------------------------
inline CNFAState::CMove::CMove()
{
_symbol = symInvalid;
}
//+-------------------------------------------------------------------------
//
// Member: CNFAState::CMove::CMove, private
//
// Synopsis: Initializes move.
//
// Arguments: [symbol] -- On symbol, move to ...
// [iState] -- this new state.
//
// History: 20-Jan-92 KyleP Created
//
//--------------------------------------------------------------------------
inline CNFAState::CMove::CMove( UINT symbol, UINT iState )
: _symbol( symbol ),
_iState( iState )
{
}
//+-------------------------------------------------------------------------
//
// Member: CNFAState::CNFAState, public
//
// Synopsis: Initialize a state (no transitions)
//
// History: 20-Jan-92 KyleP Created
//--------------------------------------------------------------------------
inline CNFAState::CNFAState()
: _cMove( 0 ),
_pmoveRest( 0 ),
_cmoveRest( 0 )
{
}
//+-------------------------------------------------------------------------
//
// Member: CNFAState::~CNFAState, public
//
// Effects: Clean up any spillover moves.
//
// History: 20-Jan-92 KyleP Created
//
//--------------------------------------------------------------------------
inline CNFAState::~CNFAState()
{
delete _pmoveRest;
}
#endif // __STATE_HXX__