0

我是 boost::spirit 的新手。我偶然发现了一件简单的事情。给定这样的字符串:

Optional text KEYWORD further text

我需要将它解析成这样的字符串:

T KEYWORD further text

其中“T”仅在可选文本存在时出现。我得出的是这条规则:

start = (+(char_ - "KEYWORD"))  [_val += 'T']  |  eps
        >> "KEYWORD"            [_val += _1]   
        >> *char_               [_val += _1];

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

4

1 回答 1

3

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

现在,这是我要写的:

#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"));
}

输出:

KEYWORD further text
T KEYWORD further text
T KEYWORD further text
于 2011-11-03T01:53:22.003 回答