Это сильно зависит от целевых типов, которым вы назначаете атрибуты, и (в меньшей степени), какова политика пропусков, т.е. использует ли ваша грамматика шкипер или нет.
На данный момент, вотчто бы я написал:
#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"));
}
Ouput:
KEYWORD further text
T KEYWORD further text
T KEYWORD further text