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

📄 debug.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
字号:
// debug.hpp// Copyright (c) 2007 Ben Hanson (http://www.benhanson.net/)//// Distributed under the Boost Software License, Version 1.0. (See accompanying// file licence_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)#ifndef BOOST_LEXER_DEBUG_HPP#define BOOST_LEXER_DEBUG_HPP#include <map>#include <ostream>#include "size_t.hpp"#include "state_machine.hpp"#include "string_token.hpp"#include <vector>namespace boost{namespace lexer{template<typename CharT>class basic_debug{public:    typedef std::basic_ostream<CharT> ostream;    typedef std::basic_string<CharT> string;    typedef std::vector<std::size_t> size_t_vector;    static void escape_control_chars (const string &in_, string &out_)    {        const CharT *ptr_ = in_.c_str ();        std::size_t size_ = in_.size ();#if defined _MSC_VER && _MSC_VER <= 1200        out_.erase ();#else        out_.clear ();#endif        while (size_)        {            switch (*ptr_)            {                case '\0':                    out_ += '\\';                    out_ += '0';                    break;                case '\a':                    out_ += '\\';                    out_ += 'a';                    break;                case '\b':                    out_ += '\\';                    out_ += 'b';                    break;                case 27:                    out_ += '\\';                    out_ += 'x';                    out_ += '1';                    out_ += 'b';                    break;                case '\f':                    out_ += '\\';                    out_ += 'f';                    break;                case '\n':                    out_ += '\\';                    out_ += 'n';                    break;                case '\r':                    out_ += '\\';                    out_ += 'r';                    break;                case '\t':                    out_ += '\\';                    out_ += 't';                    break;                case '\v':                    out_ += '\\';                    out_ += 'v';                    break;                case '\\':                    out_ += '\\';                    out_ += '\\';                    break;                case '"':                    out_ += '\\';                    out_ += '"';                    break;                default:                {                    if (*ptr_ < 32 && *ptr_ >= 0)                    {                        stringstream ss_;                        out_ += '\\';                        out_ += 'x';                        ss_ << std::hex <<                            static_cast<std::size_t> (*ptr_);                        out_ += ss_.str ();                    }                    else                    {                        out_ += *ptr_;                    }                    break;                }            }            ++ptr_;            --size_;        }    }    static void dump (const basic_state_machine<CharT> &state_machine_, ostream &stream_)    {        typename basic_state_machine<CharT>::iterator iter_ =            state_machine_.begin ();        typename basic_state_machine<CharT>::iterator end_ =            state_machine_.end ();        for (std::size_t dfa_ = 0, dfas_ = state_machine_.size ();            dfa_ < dfas_; ++dfa_)        {            const std::size_t states_ = iter_->states;            for (std::size_t i_ = 0; i_ < states_; ++i_)            {                state (stream_);                stream_ << i_ << std::endl;                if (iter_->end_state)                {                    end_state (stream_);                    stream_ << iter_->id;                    dfa (stream_);                    stream_ << iter_->goto_dfa;                    stream_ << std::endl;                }                if (iter_->bol_index != npos)                {                    bol (stream_);                    stream_ << iter_->bol_index << std::endl;                }                if (iter_->eol_index != npos)                {                    eol (stream_);                    stream_ << iter_->eol_index << std::endl;                }                const std::size_t transitions_ = iter_->transitions;                if (transitions_ == 0)                {                    ++iter_;                }                for (std::size_t t_ = 0; t_ < transitions_; ++t_)                {                    std::size_t goto_state_ = iter_->goto_state;                    if (iter_->token.any ())                    {                        any (stream_);                    }                    else                    {                        open_bracket (stream_);                        if (iter_->token._negated)                        {                            negated (stream_);                        }                        string charset_;                        CharT c_ = 0;                        escape_control_chars (iter_->token._charset,                            charset_);                        c_ = *charset_.c_str ();                        if (!iter_->token._negated &&                            (c_ == '^' || c_ == ']'))                        {                            stream_ << '\\';                        }                        stream_ << charset_;                        close_bracket (stream_);                    }                    stream_ << goto_state_ << std::endl;                    ++iter_;                }                stream_ << std::endl;            }        }    }protected:    typedef std::basic_stringstream<CharT> stringstream;    static void state (std::basic_ostream<char> &stream_)    {        stream_ << "State: ";    }    static void state (std::basic_ostream<wchar_t> &stream_)    {        stream_ << L"State: ";    }    static void bol (std::basic_ostream<char> &stream_)    {        stream_ << "  BOL -> ";    }    static void bol (std::basic_ostream<wchar_t> &stream_)    {        stream_ << L"  BOL -> ";    }    static void eol (std::basic_ostream<char> &stream_)    {        stream_ << "  EOL -> ";    }    static void eol (std::basic_ostream<wchar_t> &stream_)    {        stream_ << L"  EOL -> ";    }    static void end_state (std::basic_ostream<char> &stream_)    {        stream_ << "  END STATE, Id = ";    }    static void end_state (std::basic_ostream<wchar_t> &stream_)    {        stream_ << L"  END STATE, Id = ";    }    static void any (std::basic_ostream<char> &stream_)    {        stream_ << "  . -> ";    }    static void any (std::basic_ostream<wchar_t> &stream_)    {        stream_ << L"  . -> ";    }    static void open_bracket (std::basic_ostream<char> &stream_)    {        stream_ << "  [";    }    static void open_bracket (std::basic_ostream<wchar_t> &stream_)    {        stream_ << L"  [";    }    static void negated (std::basic_ostream<char> &stream_)    {        stream_ << "^";    }    static void negated (std::basic_ostream<wchar_t> &stream_)    {        stream_ << L"^";    }    static void close_bracket (std::basic_ostream<char> &stream_)    {        stream_ << "] -> ";    }    static void close_bracket (std::basic_ostream<wchar_t> &stream_)    {        stream_ << L"] -> ";    }    static void dfa (std::basic_ostream<char> &stream_)    {        stream_ << ", dfa = ";    }    static void dfa (std::basic_ostream<wchar_t> &stream_)    {        stream_ << L", dfa = ";    }};typedef basic_debug<char> debug;typedef basic_debug<wchar_t> wdebug;}}#endif

⌨️ 快捷键说明

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