x
Yes
No
Do you want to visit DriveHQ English website?
首页
产品服务
价格
免费试用
下载客户端
关于我们
云文件服务
|
云备份服务
|
FTP服务
|
企业邮箱服务
|
网站托管
|
客户端软件
云文件服务
云备份服务
FTP服务
企业级邮箱服务
网站托管
客户端软件
symbols.hpp - Hosted on DriveHQ Cloud IT Platform
返回上层目录
上传
下载
共享
发布
新建文件夹
新建文件
复制
剪切
删除
粘贴
评论
升级服务
路径: \\game3dprogramming\materials\GameFactory\GameFactoryDemo\references\boost_1_35_0\boost\spirit\symbols\symbols.hpp
旋转
特效
属性
历史版本
/*============================================================================= Copyright (c) 2001-2003 Joel de Guzman http://spirit.sourceforge.net/ Use, modification and distribution is subject to 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) =============================================================================*/ #ifndef BOOST_SPIRIT_SYMBOLS_HPP #define BOOST_SPIRIT_SYMBOLS_HPP /////////////////////////////////////////////////////////////////////////////// #include
#include
#include
#include
#include
/////////////////////////////////////////////////////////////////////////////// namespace boost { namespace spirit { /////////////////////////////////////////////////////////////////////////////// // // symbols class // // This class implements a symbol table. The symbol table holds a // dictionary of symbols where each symbol is a sequence of CharTs. // The template class can work efficiently with 8, 16 and 32 bit // characters. Mutable data of type T is associated with each // symbol. // // The class is a parser. The parse member function returns // additional information in the symbol_match class (see below). // The additional data is a pointer to some data associated with // the matching symbol. // // The actual set implementation is supplied by the SetT template // parameter. By default, this uses the tst class (see tst.ipp). // // Symbols are added into the symbol table statically using the // construct: // // sym = a, b, c, d ...; // // where sym is a symbol table and a..d are strings. Example: // // sym = "pineapple", "orange", "banana", "apple"; // // Alternatively, symbols may be added dynamically through the // member functor 'add' (see symbol_inserter below). The member // functor 'add' may be attached to a parser as a semantic action // taking in a begin/end pair: // // p[sym.add] // // where p is a parser (and sym is a symbol table). On success, // the matching portion of the input is added to the symbol table. // // 'add' may also be used to directly initialize data. Examples: // // sym.add("hello", 1)("crazy", 2)("world", 3); // /////////////////////////////////////////////////////////////////////////////// template
class symbols : private SetT , public parser
> { public: typedef parser
> parser_base_t; typedef symbols
self_t; typedef self_t const& embed_t; typedef T symbol_data_t; typedef boost::reference_wrapper
symbol_ref_t; symbols(); symbols(symbols const& other); ~symbols(); symbols& operator=(symbols const& other); symbol_inserter
const& operator=(CharT const* str); template
struct result { typedef typename match_result
::type type; }; template
typename parser_result
::type parse_main(ScannerT const& scan) const { typedef typename ScannerT::iterator_t iterator_t; iterator_t first = scan.first; typename SetT::search_info result = SetT::find(scan); if (result.data) return scan. create_match( result.length, symbol_ref_t(*result.data), first, scan.first); else return scan.no_match(); } template
typename parser_result
::type parse(ScannerT const& scan) const { typedef typename parser_result
::type result_t; return impl::implicit_lexeme_parse
(*this, scan, scan); } template < typename ScannerT > T* find(ScannerT const& scan) const { return SetT::find(scan).data; } symbol_inserter
const add; }; /////////////////////////////////////////////////////////////////////////////// // // Symbol table utilities // // add // // adds a symbol 'sym' (string) to a symbol table 'table' plus an // optional data 'data' associated with the symbol. Returns a pointer to // the data associated with the symbol or NULL if add failed (e.g. when // the symbol is already added before). // // find // // finds a symbol 'sym' (string) from a symbol table 'table'. Returns a // pointer to the data associated with the symbol or NULL if not found // /////////////////////////////////////////////////////////////////////////////// template
T* add(symbols
& table, CharT const* sym, T const& data = T()); template
T* find(symbols
const& table, CharT const* sym); /////////////////////////////////////////////////////////////////////////////// // // symbol_inserter class // // The symbols class holds an instance of this class named 'add'. // This can be called directly just like a member function, // passing in a first/last iterator and optional data: // // sym.add(first, last, data); // // Or, passing in a C string and optional data: // // sym.add(c_string, data); // // where sym is a symbol table. The 'data' argument is optional. // This may also be used as a semantic action since it conforms // to the action interface (see action.hpp): // // p[sym.add] // /////////////////////////////////////////////////////////////////////////////// template
class symbol_inserter { public: symbol_inserter(SetT& set_) : set(set_) {} typedef symbol_inserter const & result_type; template
symbol_inserter const& operator()(IteratorT first, IteratorT const& last, T const& data = T()) const { set.add(first, last, data); return *this; } template
symbol_inserter const& operator()(CharT const* str, T const& data = T()) const { CharT const* last = str; while (*last) last++; set.add(str, last, data); return *this; } template
symbol_inserter const& operator,(CharT const* str) const { CharT const* last = str; while (*last) last++; set.add(str, last, T()); return *this; } private: SetT& set; }; /////////////////////////////////////////////////////////////////////////////// }} // namespace boost::spirit #include
#endif
symbols.hpp
网页地址
文件地址
上一页 1/3
下一页
下载
( 7 KB )
Comments
Total ratings:
0
Average rating:
无评论
of 10
Would you like to comment?
Join now
, or
Logon
if you are already a member.