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

📄 lexertl_generate_static.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
📖 第 1 页 / 共 2 页
字号:
            os_ << "    static const std::size_t dfa_alphabet_ = " <<              sm_._dfa_alphabet.front () << ";\n";            os_ << "    static const std::size_t dfa_[" <<              sm_._dfa[0]->size () << "] = {";                count_ = sm_._dfa[0]->size () / 8;            for (i_ = 0; i_ < count_; ++i_)            {                const std::size_t index_ = i_ * 8;                os_ << dfa_[index_];                for (j_ = 1; j_ < 8; ++j_)                {                    os_ << ", " << dfa_[index_ + j_];                }                if (i_ < count_ - 1)                {                    os_ << "," << std::endl << "        ";                }            }            const std::size_t mod_ = sm_._dfa[0]->size () % 8;            if (mod_)            {                const std::size_t index_ = count_ * 8;                if (count_)                {                    os_ << ",\n        ";                }                os_ << dfa_[index_];                for (j_ = 1; j_ < mod_; ++j_)                {                    os_ << ", " << dfa_[index_ + j_];                }            }            os_ << "};\n";        }        os_ << "\n    if (start_token_ == end_) return 0;\n\n";        if (dfas_ > 1)        {            os_ << "again:\n";            os_ << "    const std::size_t * lookup_ = lookup_arr_[start_state_];\n";            os_ << "    std::size_t dfa_alphabet_ = dfa_alphabet_arr_[start_state_];\n";            os_ << "    const std::size_t *dfa_ = dfa_arr_[start_state_];\n";        }        os_ << "    const std::size_t *ptr_ = dfa_ + dfa_alphabet_;\n";        os_ << "    Iterator curr_ = start_token_;\n";        os_ << "    bool end_state_ = *ptr_ != 0;\n";        os_ << "    std::size_t id_ = *(ptr_ + id_index);\n";        os_ << "    Iterator end_token_ = start_token_;\n";        os_ << '\n';        os_ << "    while (curr_ != end_)\n";        os_ << "    {\n";        if (sm_._seen_BOL_assertion)        {            os_ << "        std::size_t const BOL_state_ = ptr_[bol_index];\n";        }        if (sm_._seen_EOL_assertion)        {            os_ << "        std::size_t const EOL_state_ = ptr_[eol_index];\n";        }        if (sm_._seen_BOL_assertion || sm_._seen_EOL_assertion)        {            os_ << '\n';        }        if (sm_._seen_BOL_assertion && sm_._seen_EOL_assertion)        {            os_ << "        if (BOL_state_ && (start_token_ == start_ ||\n";            os_ << "            *(start_token_ - 1) == '\\n'))\n";            os_ << "        {\n";            os_ << "            ptr_ = &dfa_[BOL_state_ * dfa_alphabet_];\n";            os_ << "        }\n";            os_ << "        else if (EOL_state_ && *curr_ == '\\n')\n";            os_ << "        {\n";            os_ << "            ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];\n";            os_ << "        }\n";            os_ << "        else\n";            os_ << "        {\n";            os_ << "            std::size_t const state_ =\n";            if (lookups_ == 256)            {                os_ << "                ptr_[lookup_[<typename Traits::index_type>"                    "(*curr_++)]];\n";            }            else            {                os_ << "                ptr_[lookup_[*curr_++]];\n";            }            os_ << '\n';            os_ << "            if (state_ == 0) break;\n";            os_ << '\n';            os_ << "            ptr_ = &dfa_[state_ * dfa_alphabet_];\n";            os_ << "        }\n";        }        else if (sm_._seen_BOL_assertion)        {            os_ << "        if (BOL_state_ && (start_token_ == start_ ||\n";            os_ << "            *(start_token_ - 1) == '\\n'))\n";            os_ << "        {\n";            os_ << "            ptr_ = &dfa_[BOL_state_ * dfa_alphabet_];\n";            os_ << "        }\n";            os_ << "        else\n";            os_ << "        {\n";            os_ << "            std::size_t const state_ =\n";            if (lookups_ == 256)            {                os_ << "                ptr_[lookup_[static_cast<unsigned char>\n";                os_ << "                (*curr_++)]];\n";            }            else            {                os_ << "                ptr_[lookup_[*curr_++]];\n";            }            os_ << '\n';            os_ << "            if (state_ == 0) break;\n";            os_ << '\n';            os_ << "            ptr_ = &dfa_[state_ * dfa_alphabet_];\n";            os_ << "        }\n";        }        else if (sm_._seen_EOL_assertion)        {            os_ << "        if (EOL_state_ && *curr_ == '\\n')\n";            os_ << "        {\n";            os_ << "            ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];\n";            os_ << "        }\n";            os_ << "        else\n";            os_ << "        {\n";            os_ << "            std::size_t const state_ =\n";            if (lookups_ == 256)            {                os_ << "                ptr_[lookup_[static_cast<unsigned char>\n";                os_ << "                (*curr_++)]];\n";            }            else            {                os_ << "                ptr_[lookup_[*curr_++]];\n";            }            os_ << '\n';            os_ << "            if (state_ == 0) break;\n";            os_ << '\n';            os_ << "            ptr_ = &dfa_[state_ * dfa_alphabet_];\n";            os_ << "        }\n";        }        else        {            os_ << "        std::size_t const state_ =\n";            if (lookups_ == 256)            {                os_ << "            ptr_[lookup_[static_cast<unsigned char>\n";                os_ << "            (*curr_++)]];\n";            }            else            {                os_ << "            ptr_[lookup_[*curr_++]];\n";            }            os_ << '\n';            os_ << "        if (state_ == 0) break;\n";            os_ << '\n';            os_ << "        ptr_ = &dfa_[state_ * dfa_alphabet_];\n";        }        os_ << '\n';        os_ << "        if (*ptr_)\n";        os_ << "        {\n";        os_ << "            end_state_ = true;\n";        os_ << "            id_ = *(ptr_ + id_index);\n";        if (dfas_ > 1)        {            os_ << "            start_state_ = *(ptr_ + state_index);\n";        }        os_ << "            end_token_ = curr_;\n";        os_ << "        }\n";        os_ << "    }\n";        os_ << '\n';        if (sm_._seen_EOL_assertion)        {            os_ << "    const std::size_t EOL_state_ = ptr_[eol_index];\n";            os_ << '\n';            os_ << "    if (EOL_state_ && curr_ == end_)\n";            os_ << "    {\n";            os_ << "        ptr_ = &dfa_[EOL_state_ * dfa_alphabet_];\n";            os_ << '\n';            os_ << "        if (*ptr_)\n";            os_ << "        {\n";            os_ << "            end_state_ = true;\n";            os_ << "            id_ = *(ptr_ + id_index);\n";            if (dfas_ > 1)            {                os_ << "            start_state_ = *(ptr_ + state_index);\n";            }            os_ << "            end_token_ = curr_;\n";            os_ << "        }\n";            os_ << "    }\n";            os_ << '\n';        }        os_ << "    if (end_state_)\n";        os_ << "    {\n";        os_ << "        // return longest match\n";        os_ << "        start_token_ = end_token_;\n";        if (dfas_ > 1)        {            os_ << '\n';            os_ << "        if (id_ == 0) goto again;\n";        }        os_ << "    }\n";        os_ << "    else\n";        os_ << "    {\n";              if (skip_on_nomatch)        {            os_ << "        // No match causes char to be skipped\n";            os_ << "        ++start_token_;\n";        }              os_ << "        id_ = npos;\n";        os_ << "    }\n";        os_ << '\n';        os_ << "    return id_;\n";        os_ << "}\n\n";        os_ << "}}}}  // namespace boost::spirit::lex::static_\n\n";                os_ << "#endif\n";                return os_.good();    }    ///////////////////////////////////////////////////////////////////////////////}}}}   // namespace boost::spirit::lex::detail///////////////////////////////////////////////////////////////////////////////namespace boost { namespace spirit { namespace lex {     ///////////////////////////////////////////////////////////////////////////    template <typename Lexer>    inline bool     generate_static(Lexer const& lexer, std::ostream& os,         char const* name_suffix = "")    {        if (!lexer.get_definition().init_dfa())            return false;        return detail::generate_cpp(lexer.get_definition().state_machine,             lexer.get_definition().rules, os, name_suffix, false, false);    }///////////////////////////////////////////////////////////////////////////////}}}#endif

⌨️ 快捷键说明

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