ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 使用Boost.spirit解析一个简单的重复文本宏

2019-08-31 16:05:42  阅读:162  来源: 互联网

标签:boost-spirit-qi c parsing


我正在学习如何使用Boost.Spirit库来解析字符串.它似乎是一个非常好的工具,但也很难.所以,我想用一些用/分隔的单词解析一个字符串,并将它们放在一个字符串向量中.这是一个例子:word1 / word2 / word3.这是一个简单的任务,我可以通过以下结果执行此操作:

bool r = phrase_parse(first, last, (+~char_("/") % qi::lit("/")),space,v)

其中v是std :: vector< std :: string>.但总的来说,我想解析类似w1 / [w2 / w3] 2 / w4的东西,相当于w1 / w2 / w3 / w2 / w3 / w4,即[w2 / w3] 2意味着w2 / w3重复两次.有人能给我一些想法吗?我读过documentation但仍有一些问题.

先感谢您!

解决方法:

完全工作的演示:live on Coliru

如果状态为in_group,那么通过一种天真的方法增加的原因是原始值可选地结束于].

我选择使用继承属性(bool)传递状态.

此实现也允许嵌套的子组,例如:“[w1 / [w2 / w3] 2 / w4] 3”

#define BOOST_SPIRIT_DEBUG
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>

namespace phx = boost::phoenix;

int main()
{
    typedef std::string::const_iterator It;
    const std::string input = "[w1/[w2/w3]2/w4]3";

    std::vector<std::string> v;
    It first(input.begin()), last(input.end());

    using namespace boost::spirit::qi;

    rule<It, std::string(bool in_group)> raw;
    rule<It, std::vector<std::string>(bool in_group), space_type> 
        group, 
        delimited;

    _r1_type in_group; // friendly alias for the inherited attribute

    raw       = eps(in_group) >> +~char_("/]") 
              | +~char_("/");

    delimited = (group(in_group)|raw(in_group)) % '/';

    group     = ('[' >> delimited(in_group=true) >> ']' >> int_) 
        [ phx::while_(_2--) 
            [ phx::insert(_val, phx::end(_val), phx::begin(_1), phx::end(_1)) ]
        ];

    BOOST_SPIRIT_DEBUG_NODES((raw)(delimited)(group));

    bool r = phrase_parse(first, last, 
            delimited(false),
            space,v);

    if (r)
        std::copy(v.begin(), v.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
}

打印:

w1
w2
w3
w2
w3
w4
w1
w2
w3
w2
w3
w4
w1
w2
w3
w2
w3
w4

(除了调试信息)

标签:boost-spirit-qi,c,parsing
来源: https://codeday.me/bug/20190831/1776898.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有