これは、属性を割り当てる対象のタイプと、(それほどではありませんが) 空白ポリシーが何であるか、つまり文法でスキッパーを使用するかどうかに大きく依存します。
とりあえず、以下のように書きます。
#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