首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::spirit::qi -可选匹配

boost::spirit::qi -可选匹配
EN

Stack Overflow用户
提问于 2011-11-03 05:09:09
回答 1查看 862关注 0票数 0

我是新手boost::spirit。我被一件简单的事情绊倒了。给定一个如下所示的字符串:

代码语言:javascript
复制
Optional text KEYWORD further text

我需要将其解析为如下所示的字符串:

代码语言:javascript
复制
T KEYWORD further text

其中,只有当存在可选文本时,才会出现'T‘。我得到的是这条规则:

代码语言:javascript
复制
start = (+(char_ - "KEYWORD"))  [_val += 'T']  |  eps
        >> "KEYWORD"            [_val += _1]   
        >> *char_               [_val += _1];

但它失败了。有人能帮帮我吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-03 09:53:22

这在很大程度上取决于您为其分配属性的目标类型,以及(在较小程度上)空白策略是什么,即您的语法是否使用skipper。

现在,以下是我要写的:

代码语言:javascript
复制
#include <boost/spirit/include/qi.hpp>

namespace qi = boost::spirit::qi;

template <typename V>
   void test(const V& input)
{
    typedef typename V::const_iterator It;

    using namespace qi;
    rule<It, bool(), space_type>        preambule = +(!lit("KEYWORD") > omit[char_]) > attr(true) | attr(false);
    rule<It, std::string(), space_type> word      = +char_;

    It first(input.begin()), last(input.end());

    bool hasPreamble;
    std::string furtherText;

    bool ok = phrase_parse(first, last,
            preambule > "KEYWORD" > raw[ *char_ ], space,
            hasPreamble, furtherText);

    if (ok)
        std::cout << (hasPreamble?"T ":"") << "KEYWORD " << furtherText << std::endl;

    if (first!=last)
        std::cout << "hmmm: '" << std::string(first, last) << "'" << std::endl;
}

int main()
{
    test(std::string("KEYWORD further text"));
    test(std::string("one KEYWORD further text"));
    test(std::string("one two KEYWORD further text"));
}

输出:

代码语言:javascript
复制
KEYWORD further text
T KEYWORD further text
T KEYWORD further text
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7987344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档