boost :: spirit :: qi - необязательное совпадение - PullRequest
0 голосов
/ 03 ноября 2011

Я новичок в повышении :: духа.Я наткнулся на простую вещь.Для такой строки:

Optional text KEYWORD further text

Мне нужно разобрать ее в строку, подобную этой:

T KEYWORD further text

, где 'T' появляется, только если существует необязательный текст.Я пришел к такому правилу:

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

Но оно не работает.Может ли кто-нибудь помочь мне, пожалуйста?

1 Ответ

3 голосов
/ 03 ноября 2011

Это сильно зависит от целевых типов, которым вы назначаете атрибуты, и (в меньшей степени), какова политика пропусков, т.е. использует ли ваша грамматика шкипер или нет.

На данный момент, вотчто бы я написал:

#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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...