boost :: spirit :: qi :: parse — & gt; Безрезультатно

Рассмотрим следующий код:

namespace qi  = boost::spirit::qi;

typedef qi::rule<
std::string::const_iterator
> rule_type;

rule_type value_rule = +qi::char_ - ( '[' | qi::eoi );

std::string input( "Hello World" );
std::string value0, value1;

bool b0 = qi::parse( input.begin( ),
input.end( ),
value_rule,
value0 );

bool b1 = qi::parse( input.begin( ),
input.end( ),
+qi::char_ - ( '[' | qi::eoi ),
value1 );

Результат:

b0 = true
b1 = true
value0 = ""value1 = "Hello World"

Я запутался, почему результат отличается. Какое правильное определение типа qi :: rule, чтобы получить тот же результат?

3

Решение

Вы забыли заставить правило объявлять открытый тип атрибута:

typedef qi::rule<std::string::const_iterator, std::string()> rule_type;

Жить на Колиру

#include <boost/spirit/include/qi.hpp>

namespace qi  = boost::spirit::qi;int main()
{
std::string const input( "Hello World" );

{
typedef qi::rule<std::string::const_iterator, std::string()> rule_type;
rule_type value_rule = +qi::char_ - ( '[' | qi::eoi );

std::string value;
bool ok = qi::parse( input.begin( ),
input.end( ),
value_rule,
value );

std::cout << std::boolalpha << ok << "\t" << value << "\n";
}

{
std::string value;
bool ok = qi::parse( input.begin( ),
input.end( ),
+qi::char_ - ( '[' | qi::eoi ),
value );

std::cout << std::boolalpha << ok << "\t" << value << "\n";
}
}

Выход

true    Hello World
true    Hello World
5

Другие решения


По вопросам рекламы [email protected]