xpressive_lexer.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 136 行
HPP
136 行
/*============================================================================= Boost.Wave: A Standard compliant C++ preprocessor library Xpressive based generic lexer http://www.boost.org/ 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(XPRESSIVE_LEXER_HPP)#define XPRESSIVE_LEXER_HPP#include <string>#include <vector>#include <utility>#include <algorithm>#include <boost/detail/iterator.hpp>#include <boost/xpressive/xpressive.hpp>namespace boost {namespace wave {namespace cpplexer {namespace xlex {///////////////////////////////////////////////////////////////////////////////template < typename Iterator = char const*, typename Token = int, typename Callback = bool (*)( Iterator const&, Iterator&, Iterator const&, Token const&)>class xpressive_lexer{private: typedef typename boost::detail::iterator_traits<Iterator>::value_type char_type; typedef std::basic_string<char_type> string_type; // this represents a single token to match struct regex_info { typedef boost::xpressive::basic_regex<Iterator> regex_type; string_type str; Token token; regex_type regex; Callback callback; regex_info(string_type const& str, Token const& token, Callback const& callback) : str(str), token(token), regex(regex_type::compile(str)), callback(callback) {} // these structures are to be ordered by the token id friend bool operator< (regex_info const& lhs, regex_info const& rhs) { return lhs.token < rhs.token; } }; typedef std::vector<regex_info> regex_list_type;public: typedef Callback callback_type; xpressive_lexer() {} // register a the regex with the lexer void register_regex(string_type const& regex, Token const& id, Callback const& cb = Callback()); // match the given input and return the next recognized token Token next_token(Iterator &first, Iterator const& last, string_type& token);private: regex_list_type regex_list;};///////////////////////////////////////////////////////////////////////////////template <typename Iterator, typename Token, typename Callback>inline voidxpressive_lexer<Iterator, Token, Callback>::register_regex( string_type const& regex, Token const& id, Callback const& cb){ regex_list.push_back(regex_info(regex, id, cb));}///////////////////////////////////////////////////////////////////////////////template <typename Iterator, typename Token, typename Callback>inline Tokenxpressive_lexer<Iterator, Token, Callback>::next_token( Iterator &first, Iterator const& last, string_type& token){ typedef typename regex_list_type::iterator iterator; xpressive::match_results<Iterator> regex_result; for (iterator it = regex_list.begin(), end = regex_list.end(); it != end; ++it) { namespace xpressive = boost::xpressive; regex_info const& curr_regex = *it;// xpressive::match_results<Iterator> regex_result; if (xpressive::regex_search(first, last, regex_result, (*it).regex, xpressive::regex_constants::match_continuous)) { Iterator saved = first; Token rval = (*it).token; std::advance(first, regex_result.length()); token = string_type(saved, first); if (NULL != (*it).callback) { // execute corresponding callback if ((*it).callback(saved, first, last, (*it).token)) rval = next_token(first, last, token); } return rval; } } return Token(-1); // TODO: change this to use token_traits<Token>}///////////////////////////////////////////////////////////////////////////////}}}} // boost::wave::cpplexer::xlex#endif // !defined(XPRESSIVE_LEXER_HPP)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?