Jquery中文网 www.jquerycn.cn
Jquery中文网 >  脚本编程  >  C语言  >  正文 C boost库spirit使用手册

C boost库spirit使用手册

发布时间:2018-09-15   编辑:www.jquerycn.cn
jquery中文网为您提供C boost库spirit使用手册等资源,欢迎您收藏本站,我们将为您提供最新的C boost库spirit使用手册资源
Boost库是一个可移植、提供源代码的C 库,作为标准库的后备,是C 标准化进程的开发引擎之一。 本文我们来学习一下boost库的spirit使用。

尝试通过cpp-netlib来做http服务器,但是这个库只能简单的解析http结构,像cookie等结构,都要自己解析,了解到spirit可以通过类似bnf范式格式定义字符串格式并解析。

boost本身有个类似的例子,解析的是通过分号或者&符号分割的键值对字符串,并放到对应的map中去。具体代码可以参照这里
http://www.boost.org/doc/libs/1_55_0/libs/spirit/example/qi/key_value_sequence.cpp。所以基于这个代码,简单的进行修改之后,就能解析http cookie了。

首先,http cookie的格式,定义在rfc6265上。这里定义了服务器发送给浏览器的Set-Cookie头格式,和浏览器发给服务器的Cookie头的BNF范式。这里定义的太复杂,解析的时候没有考虑到这么多字符(特别是排除一些控制字符),大致的代码:

<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy4061')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy4061>namespace parser
{
    namespace qi = boost::spirit::qi;
    typedef std::map<std::string, std::string> pairs_type;
  
    template <typename Iterator>
    struct cooke_sequence : qi::grammar<Iterator, pairs_type()> {
        qi::rule<Iterator, pairs_type()> query;
        qi::rule<Iterator, std::pair<std::string, std::string>()> pair;
        qi::rule<Iterator, std::string()> key, value;
      
        cooke_sequence() : cooke_sequence::base_type(query) {
            query =  pair >> *(qi::lit(';') >> pair);
            pair  =  *qi::lit(' ') >> key >> *qi::lit(' ') >> -('=' >> *qi::lit(' ') >> value >> *qi::lit(' '));
            key   =  qi::char_("a-zA-Z_%") >> *qi::char_("a-zA-Z_0-9%");
            value = (qi::char_ - ';');
        }
    };
}</td></tr></table>



这里简化了key和value,特别是value,只要是非分号的,都能解析到value中。使用也非常简单:

<table width="620" align="center" border="0" cellpadding="1" cellspacing="1" style="background:#FB7"> <tr> <td width="464" height="27" bgcolor="#FFE7CE"> 代码如下</td> <td width="109" align="center" bgcolor="#FFE7CE" style="cursor:pointer;" onclick="doCopy('copy8334')">复制代码</td> </tr> <tr> <td height="auto" colspan="2" valign="top" bgcolor="#FFFFFF" style="padding:10px;" class="copyclass" id=copy8334>namespace qi = boost::spirit::qi;
parser::cooke_sequence<std::string::const_iterator> p;
parser::pairs_type value;
if(qi::parse(c.begin(), c.end(), p, value)) {
    for(auto &entry : value) {
        cookies.insert(std::make_pair(entry.first, entry.second));
    }
}</td></tr></table>



直接实例化cooe_sequence,将cookie字符串传入,就可以解析成map,然后再放入到自己的结构体中。这里直接抄了示例中的代码,所以直接使用了map,一般cookie没必要排序,可以直接使用unordered_map,通过hash表存放。

您可能感兴趣的文章:
C boost库spirit使用手册
C 库boost进行CRC64计算的方法实例
boost异步网络通信初探
pcre是什么?
基于boost asio开发的http server了解
boost::preprocessor库之文件重复与自我重复
MySQL5.7 的编译安装的完整教程
C 标准库 – 参考手册
工作中的几个Drupal小问题记录总结
cgi 网站开发学习实例

[关闭]