0

私はブースト::精神に不慣れです。私は簡単なことにつまずいた。次のような文字列を指定します。

Optional text KEYWORD further text

次のような文字列に解析する必要があります。

T KEYWORD further text

'T' は、オプションのテキストが存在する場合にのみ表示されます。私がたどり着いたのは、次のルールです。

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

しかし、それは失敗します。誰か助けてくれませんか?

4

1 に答える 1

3

これは、属性を割り当てる対象のタイプと、(それほどではありませんが) 空白ポリシーが何であるか、つまり文法でスキッパーを使用するかどうかに大きく依存します。

とりあえず、以下のように書きます。

#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
于 2011-11-03T01:53:22.003 に答える