⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 syntax2.h

📁 vsstylemanager1.0.4希望对大家有用啊,
💻 H
📖 第 1 页 / 共 3 页
字号:
        {
            tok = EXT_UNKNOWN;
            ++icur;
            if( m_flags & EXTENDED )
                for( ; iend != icur && detail::regex_isspace( *icur ); ++icur ) {}
            if( iend != icur )
            {
                switch( *icur )
                {
                case REGEX_CHAR(CharT,':'):
                    tok = EXT_NOBACKREF;
                    ++icur;
                    break;
                case REGEX_CHAR(CharT,'='):
                    tok = EXT_POS_LOOKAHEAD;
                    ++icur;
                    break;
                case REGEX_CHAR(CharT,'!'):
                    tok = EXT_NEG_LOOKAHEAD;
                    ++icur;
                    break;
                case REGEX_CHAR(CharT,'#'):
                    tok = EXT_COMMENT;
                    ++icur;
                    break;
                case REGEX_CHAR(CharT,'('):
                    tok = EXT_CONDITION;
                    ++icur;
                    break;
                case REGEX_CHAR(CharT,'R'):
                    tok = EXT_RECURSE;
                    ++icur;
                    break;
                case REGEX_CHAR(CharT,'<'):
                    if( iend == eat_whitespace( ++icur, iend ) )
                        break;
                    switch( *icur )
                    {
                    case REGEX_CHAR(CharT,'='):
                        tok = EXT_POS_LOOKBEHIND;
                        ++icur;
                        break;
                    case REGEX_CHAR(CharT,'!'):
                        tok = EXT_NEG_LOOKBEHIND;
                        ++icur;
                        break;
                    }
                    break;
                case REGEX_CHAR(CharT,'>'):
                    tok = EXT_INDEPENDENT;
                    ++icur;
                    break;
                default:
                    finclude = true;
                    do
                    {
                        if( REGEX_CHAR(CharT,':') == *icur )
                        {
                            tok = EXT_NOBACKREF;
                            ++icur;
                            break;
                        }
                        if( REGEX_CHAR(CharT,')') == *icur )
                        {
                            tok = EXT_NOBACKREF;
                            break;
                        }
                        if( REGEX_CHAR(CharT,'-') == *icur && finclude )
                            finclude = false;
                        else if( REGEX_CHAR(CharT,'i') == *icur )
                            m_flags = ( REGEX_FLAGS ) ( finclude ? ( m_flags | NOCASE )     : ( m_flags & ~NOCASE ) );
                        else if( REGEX_CHAR(CharT,'m') == *icur )
                            m_flags = ( REGEX_FLAGS ) ( finclude ? ( m_flags | MULTILINE )  : ( m_flags & ~MULTILINE ) );
                        else if( REGEX_CHAR(CharT,'s') == *icur )
                            m_flags = ( REGEX_FLAGS ) ( finclude ? ( m_flags | SINGLELINE ) : ( m_flags & ~SINGLELINE ) );
                        else if( REGEX_CHAR(CharT,'x') == *icur )
                            m_flags = ( REGEX_FLAGS ) ( finclude ? ( m_flags | EXTENDED )   : ( m_flags & ~EXTENDED ) );
                        else
                            break;
                    } while( iend != eat_whitespace( ++icur, iend ) );
                    break;
                }
            }
        }
        return tok;
    }

    // Functions used for making user-defined intrinsic character sets
    static detail::charset_map<CharT> & get_charset_map()
    {
        return detail::get_perl_charset_map( CharT() );
    }
    static bool invalid_charset( CharT ch )
    {
        return _invalid_charset( ch );
    }
    static void register_intrinsic_charset( CharT ch, std::basic_string<CharT> const & str ) //throw( bad_regexpr, std::bad_alloc )
    {
        perl_syntax sy( NOFLAGS );
        if( invalid_charset( ch ) )
            throw bad_regexpr( "invalid character specified to register_intrinsic_charset" );
        std::basic_string<CharT> pat = str;
        typename std::basic_string<CharT>::iterator ibegin = pat.begin();
        if( BEGIN_CHARSET != sy.reg_token( ibegin, pat.end() ) )
            throw bad_regexpr( "expecting beginning of charset" );
        regex::detail::charset_map<CharT> & charset_map = get_charset_map();
        regex::detail::charset_map_node<CharT> & map_node = charset_map[ ch ];
        map_node.set( std::basic_string<CharT>( ibegin, pat.end() ) );
    }
 private:
    static bool _invalid_charset( char ch )
    {
        using namespace std;
        return NO_TOKEN != s_rgescape[ static_cast<unsigned char>( ch ) ]
            || isdigit( ch ) || 'e' == ch || 'x' == ch || 'c' == ch;
    }
    static bool _invalid_charset( wchar_t ch )
    {
        return UCHAR_MAX >= ch && _invalid_charset( static_cast<char>( ch ) );
    }
};

// --------------------------------------------------------------------------
//
// Class:       posix_syntax
//
// Description: Implements the basic POSIX regular expression syntax
//
// Methods:     posix_syntax               -
//              posix_syntax               -
//              get_flags                  -
//              set_flags                  -
//              reg_token                  -
//              quant_token                -
//              charset_token              -
//              subst_token                -
//              ext_token                  -
//              get_charset_map            -
//              invalid_charset            -
//              register_intrinsic_charset -
//
// Members:     m_flags                    -
//              s_charset_map              -
//
// Typedefs:    iterator                   -
//              const_iterator             -
//              char_type                  -
//
// History:     11/16/2001 - ericne - Created
//
// --------------------------------------------------------------------------
template< typename CharT >
class posix_syntax
{
    REGEX_FLAGS m_flags;

public:
    typedef typename std::basic_string<CharT>::iterator iterator;
    typedef typename std::basic_string<CharT>::const_iterator const_iterator;
    typedef CharT char_type;
    template< typename OtherT > struct rebind { typedef posix_syntax<OtherT> other; };

    posix_syntax( REGEX_FLAGS flags )
        : m_flags( flags )
    {
    }

    posix_syntax( posix_syntax<CharT> const & sy )
        : m_flags( sy.m_flags )
    {
    }

    REGEX_FLAGS get_flags() const
    {
        return m_flags;
    }

    void set_flags( REGEX_FLAGS flags )
    {
        m_flags = flags;
    }

    TOKEN reg_token( iterator & icur, const_iterator iend )
    {
        TOKEN tok = NO_TOKEN;
        switch( *icur )
        {
        case REGEX_CHAR(CharT,'.'):
            tok = MATCH_ANY;
            ++icur;
            break;
        case REGEX_CHAR(CharT,'^'):
            tok = BEGIN_LINE;
            ++icur;
            break;
        case REGEX_CHAR(CharT,'$'):
            tok = END_LINE;
            ++icur;
            break;
        case REGEX_CHAR(CharT,'['):
            tok = BEGIN_CHARSET;
            ++icur;
            break;
        case REGEX_CHAR(CharT,'\\'):
            tok = ESCAPE;
            ++icur;
            if( iend != icur )
            {
                switch( *icur )
                {
                case REGEX_CHAR(CharT,'('):
                    tok = BEGIN_GROUP;
                    ++icur;
                    break;
                case REGEX_CHAR(CharT,')'):
                    tok = END_GROUP;
                    ++icur;
                    break;
                case REGEX_CHAR(CharT,'|'):
                    tok = ALTERNATION;
                    ++icur;
                    break;
                }
            }
            break;
        }
        return tok;
    }
    TOKEN quant_token( iterator & icur, const_iterator iend )
    {
        TOKEN tok = NO_TOKEN;
        switch( *icur )
        {
        case REGEX_CHAR(CharT,'*'):
            tok = ZERO_OR_MORE;
            ++icur;
            break;
        case REGEX_CHAR(CharT,','):
            tok = RANGE_SEPARATOR;
            ++icur;
            break;
        case REGEX_CHAR(CharT,'\\'):
            ++icur;
            if( iend != icur )
            {
                switch( *icur )
                {
                case REGEX_CHAR(CharT,'?'):
                    tok = ZERO_OR_ONE;
                    ++icur;
                    break;
                case REGEX_CHAR(CharT,'+'):
                    tok = ONE_OR_MORE;
                    ++icur;
                    break;
                case REGEX_CHAR(CharT,'{'):
                    tok = BEGIN_RANGE;
                    ++icur;
                    break;
                case REGEX_CHAR(CharT,'}'):
                    tok = END_RANGE;
                    ++icur;
                    break;
                default:
                    --icur;
                    break;
                }
            }
            else
            {
                --icur;
            }
        }
        return tok;
    }
    TOKEN charset_token( iterator & icur, const_iterator iend )
    {
        TOKEN tok = NO_TOKEN;
        switch( *icur )
        {
        case REGEX_CHAR(CharT,'^'):
            tok = CHARSET_NEGATE;
            ++icur;
            break;
        case REGEX_CHAR(CharT,'-'):
            tok = CHARSET_RANGE;
            ++icur;
            break;
        case REGEX_CHAR(CharT,']'):
            tok = CHARSET_END;
            ++icur;
            break;
        case REGEX_CHAR(CharT,'['):
            if( REGEX_CHAR(CharT,':') == *( ++icur )-- )
            {
                for( size_t i=0; !tok && i < detail::g_cposix_charsets; ++i )
                {
                    if( detail::is_posix_charset<const_iterator>( icur, iend, detail::g_rgposix_charsets[i].m_szcharset ) )
                    {
                        tok = TOKEN( CHARSET_ALNUM + i );
                        std::advance( icur, detail::g_rgposix_charsets[i].cchars );
                    }
                }
            }
            break;
        }
        return tok;
    }
    TOKEN subst_token( iterator & icur, const_iterator iend )
    {
        TOKEN tok = NO_TOKEN;
        if( REGEX_CHAR(CharT,'\\') == *icur )
        {
            tok = SUBST_ESCAPE;
            ++icur;
            if( iend != icur && REGEX_CHAR(CharT,'0') <= *icur && REGEX_CHAR(CharT,'9') >= *icur )
            {
                tok = SUBST_BACKREF;
            }
        }
        return tok;
    }
    TOKEN ext_token( iterator &, const_iterator )
    {
        return NO_TOKEN;
    }

    // Functions for making user-defined intrinsic character sets
    static detail::charset_map<CharT> & get_charset_map()
    {
        return detail::get_posix_charset_map( CharT() );
    }
    static bool invalid_charset( CharT ch )
    {
        return _invalid_charset( ch );
    }
    static void register_intrinsic_charset( CharT ch, std::basic_string<CharT> const & str ) //throw( bad_regexpr, std::bad_alloc )
    {
        posix_syntax sy( NOFLAGS );
        if( invalid_charset( ch ) )
            throw bad_regexpr( "invalid character specified to register_intrinsic_charset" );
        std::basic_string<CharT> pat = str;
        typename std::basic_string<CharT>::iterator ibegin = pat.begin();
        if( BEGIN_CHARSET != sy.reg_token( ibegin, pat.end() ) )
            throw bad_regexpr( "expecting beginning of charset" );
        regex::detail::charset_map<CharT> & charset_map = get_charset_map();
        regex::detail::charset_map_node<CharT> & map_node = charset_map[ ch ];
        map_node.set( std::basic_string<CharT>( ibegin, pat.end() ) );
    }
 private:
    static bool _invalid_charset( char ch )
    {
        static char const s_invalid[] = "0123456789()|?+{}\\exc";
        return 0 != std::char_traits<CharT>::find( s_invalid, ARRAYSIZE( s_invalid ) - 1, ch );
    }
    static bool _invalid_charset( wchar_t ch )
    {
        return UCHAR_MAX >= ch && _invalid_charset( static_cast<char>( ch ) );
    }
};

} // namespace regex

#ifdef _MSC_VER
#pragma warning( pop )
#endif

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -