我是新手boost::spirit。我被一件简单的事情绊倒了。给定一个如下所示的字符串:
Optional text KEYWORD further text我需要将其解析为如下所示的字符串:
T KEYWORD further text其中,只有当存在可选文本时,才会出现'T‘。我得到的是这条规则:
start = (+(char_ - "KEYWORD")) [_val += 'T'] | eps
>> "KEYWORD" [_val += _1]
>> *char_ [_val += _1];但它失败了。有人能帮帮我吗?
发布于 2011-11-03 09:53:22
这在很大程度上取决于您为其分配属性的目标类型,以及(在较小程度上)空白策略是什么,即您的语法是否使用skipper。
现在,以下是我要写的:
#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 texthttps://stackoverflow.com/questions/7987344
复制相似问题