使用 Boost.spirit 解析简单的重复文本宏

2024-04-29

我正在学习如何使用 Boost.Spirit 库来解析字符串。这似乎是一个非常好的工具,但也很困难。所以,我想解析一个字符串,其中一些单词用/并将它们放入字符串向量中。这是一个例子:word1/word2/word3。这是一个简单的任务,我可以使用以下函数来完成此任务:

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

where v is std::vector<std::string>。但总的来说,我想解析类似的东西w1/[w2/w3]2/w4这相当于w1/w2/w3/w2/w3/w4, 那是[w2/w3]2意思是w2/w3重复两次。有人能给我一些关于这方面的想法吗?我读了文档 http://www.boost.org/doc/libs/1_48_0/libs/spirit/doc/html/index.html但仍然存在一些问题。

先感谢您!


完全工作的演示:住在科利鲁 http://coliru.stacked-crooked.com/view?id=a5d6bd0dfd0fd832103f5165dac13ead-f468fd186ebe6d5f25efae86bd4f0130

与天真的方法相比,这增加了raw值可以选择结束于]如果状态是in_group.

我选择通过该州使用继承属性 (bool).

这个实现允许nested以及子组,例如:"[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"));
}

Prints:

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

(除了调试信息)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Boost.spirit 解析简单的重复文本宏 的相关文章

随机推荐