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

📄 iterator_tokenizer.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
字号:
//  Copyright (c) 2001-2008 Hartmut Kaiser// //  Distributed under the Boost Software License, Version 1.0. (See accompanying //  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#if !defined(BOOST_SPIRIT_LEXERTL_ITERATOR_TOKENISER_MARCH_22_2007_0859AM)#define BOOST_SPIRIT_LEXERTL_ITERATOR_TOKENISER_MARCH_22_2007_0859AM#include <boost/detail/iterator.hpp>#include <boost/spirit/home/support/detail/lexer/state_machine.hpp>#include <boost/spirit/home/support/detail/lexer/consts.hpp>#include <boost/spirit/home/support/detail/lexer/size_t.hpp>#include <boost/spirit/home/support/detail/lexer/char_traits.hpp>#include <vector>namespace boost { namespace spirit { namespace lex {     template<typename Iterator>    class basic_iterator_tokeniser    {    public:        typedef std::vector<std::size_t> size_t_vector;        typedef             typename boost::detail::iterator_traits<Iterator>::value_type         char_type;//         static std::size_t next (const std::size_t * const lookup_,//             std::size_t const dfa_alphabet_, const std::size_t *  const dfa_,//             Iterator const& start_, Iterator &start_token_,//             Iterator const& end_)//         {//             if (start_token_ == end_) return 0;// //             const std::size_t *ptr_ = dfa_ + dfa_alphabet_;//             Iterator curr_ = start_token_;//             bool end_state_ = *ptr_ != 0;//             std::size_t id_ = *(ptr_ + lexer::id_index);//             Iterator end_token_ = start_token_;// //             while (curr_ != end_)//             {//                 std::size_t const BOL_state_ = ptr_[lexer::bol_index];//                 std::size_t const EOL_state_ = ptr_[lexer::eol_index];// //                 if (BOL_state_ && (start_token_ == start_ ||//                     *(start_token_ - 1) == '\n'))//                 {//                     ptr_ = &dfa_[BOL_state_ * dfa_alphabet_];//                 }//                 else if (EOL_state_ && *curr_ == '\n')//                 {//                     ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];//                 }//                 else//                 {//                     std::size_t const state_ = ptr_[lookup_[*curr_++]];// //                     if (state_ == 0)//                     {//                         break;//                     }// //                     ptr_ = &dfa_[state_ * dfa_alphabet_];//                 }// //                 if (*ptr_)//                 {//                     end_state_ = true;//                     id_ = *(ptr_ + lexer::id_index);//                     end_token_ = curr_;//                 }//             }// //             const std::size_t EOL_state_ = ptr_[lexer::eol_index];// //             if (EOL_state_ && curr_ == end_)//             {//                 ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];// //                 if (*ptr_)//                 {//                     end_state_ = true;//                     id_ = *(ptr_ + lexer::id_index);//                     end_token_ = curr_;//                 }//             }// //             if (end_state_) {//                 // return longest match//                 start_token_ = end_token_;//             }//             else {//                 id_ = lexer::npos;//             }// //             return id_;//         }        static std::size_t next (            boost::lexer::basic_state_machine<char_type> const& state_machine_,            std::size_t &dfa_state_, Iterator const& start_,            Iterator &start_token_, Iterator const& end_)        {            if (start_token_ == end_) return 0;        again:            std::size_t const* lookup_ = &state_machine_._lookup[dfa_state_]->                front ();            std::size_t dfa_alphabet_ = state_machine_._dfa_alphabet[dfa_state_];            std::size_t const* dfa_ = &state_machine_._dfa[dfa_state_]->front ();            std::size_t const* ptr_ = dfa_ + dfa_alphabet_;            Iterator curr_ = start_token_;            bool end_state_ = *ptr_ != 0;            std::size_t id_ = *(ptr_ + boost::lexer::id_index);            Iterator end_token_ = start_token_;            while (curr_ != end_)            {                std::size_t const BOL_state_ = ptr_[boost::lexer::bol_index];                std::size_t const EOL_state_ = ptr_[boost::lexer::eol_index];                if (BOL_state_ && (start_token_ == start_ ||                    *(start_token_ - 1) == '\n'))                {                    ptr_ = &dfa_[BOL_state_ * dfa_alphabet_];                }                else if (EOL_state_ && *curr_ == '\n')                {                    ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];                }                else                {                    typedef typename                         boost::detail::iterator_traits<Iterator>::value_type                     value_type;                    typedef typename                         boost::lexer::char_traits<value_type>::index_type                     index_type;                                        index_type index =                         boost::lexer::char_traits<value_type>::call(*curr_++);                    std::size_t const state_ = ptr_[                        lookup_[static_cast<std::size_t>(index)]];                    if (state_ == 0)                    {                        break;                    }                    ptr_ = &dfa_[state_ * dfa_alphabet_];                }                if (*ptr_)                {                    end_state_ = true;                    id_ = *(ptr_ + boost::lexer::id_index);                    dfa_state_ = *(ptr_ + boost::lexer::state_index);                    end_token_ = curr_;                }            }            std::size_t const EOL_state_ = ptr_[boost::lexer::eol_index];            if (EOL_state_ && curr_ == end_)            {                ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];                if (*ptr_)                {                    end_state_ = true;                    id_ = *(ptr_ + boost::lexer::id_index);                    dfa_state_ = *(ptr_ + boost::lexer::state_index);                    end_token_ = curr_;                }            }            if (end_state_) {                // return longest match                start_token_ = end_token_;                if (id_ == 0)                     goto again;            }            else {                id_ = boost::lexer::npos;            }                        return id_;        }        ///////////////////////////////////////////////////////////////////////        static         std::size_t next (            boost::lexer::basic_state_machine<char_type> const& state_machine_,            Iterator const& start_, Iterator &start_token_, Iterator const& end_)        {            if (start_token_ == end_) return 0;            std::size_t const* lookup_ = &state_machine_._lookup[0]->front();            std::size_t dfa_alphabet_ = state_machine_._dfa_alphabet[0];            std::size_t const* dfa_ = &state_machine_._dfa[0]->front ();            std::size_t const* ptr_ = dfa_ + dfa_alphabet_;            Iterator curr_ = start_token_;            bool end_state_ = *ptr_ != 0;            std::size_t id_ = *(ptr_ + boost::lexer::id_index);            Iterator end_token_ = start_token_;            while (curr_ != end_)            {                std::size_t const BOL_state_ = ptr_[boost::lexer::bol_index];                std::size_t const EOL_state_ = ptr_[boost::lexer::eol_index];                if (BOL_state_ && (start_token_ == start_ ||                    *(start_token_ - 1) == '\n'))                {                    ptr_ = &dfa_[BOL_state_ * dfa_alphabet_];                }                else if (EOL_state_ && *curr_ == '\n')                {                    ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];                }                else                {                    typedef typename                         boost::detail::iterator_traits<Iterator>::value_type                     value_type;                    typedef typename                         boost::lexer::char_traits<value_type>::index_type                     index_type;                                        index_type index =                         boost::lexer::char_traits<value_type>::call(*curr_++);                    std::size_t const state_ = ptr_[                        lookup_[static_cast<std::size_t>(index)]];                    if (state_ == 0)                    {                        break;                    }                    ptr_ = &dfa_[state_ * dfa_alphabet_];                }                if (*ptr_)                {                    end_state_ = true;                    id_ = *(ptr_ + boost::lexer::id_index);                    end_token_ = curr_;                }            }            std::size_t const EOL_state_ = ptr_[boost::lexer::eol_index];            if (EOL_state_ && curr_ == end_)            {                ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];                if (*ptr_)                {                    end_state_ = true;                    id_ = *(ptr_ + boost::lexer::id_index);                    end_token_ = curr_;                }            }            if (end_state_) {                // return longest match                start_token_ = end_token_;            }            else {                id_ = boost::lexer::npos;            }                        return id_;        }    };    ///////////////////////////////////////////////////////////////////////////    typedef basic_iterator_tokeniser<char const *> tokeniser;    typedef basic_iterator_tokeniser<wchar_t const *> wtokeniser;}}}#endif

⌨️ 快捷键说明

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