Boost Spirit - Извлечение списка в одну строку

У меня проблемы с пониманием того, как и когда Дух решает объединить спички в одну сущность. То, что я пытаюсь сделать, это сопоставить список слов в двойных квадратных скобках, и я хотел бы извлечь полный текст внутри скобок. Пример:

[[This is some single-spaced text]] -> "This is some single-spaced text"

Моя грамматика выглядит следующим образом:

qi::rule<Iterator, std::string()> word  = +(char_ - char_(" []"));
qi::rule<Iterator, std::string()> entry = lit("[[") >> word >> *(char_(' ') >> word) >> lit("]]") >> -qi::eol;

std::string text;
bool r = parse( first, last, entry, text );

Тем не менее, это анализирует текст примера следующим образом:

[[This is some single-spaced text]] -> "Thisissomesingle-spacedtext"

Я не понимаю, почему это происходит. Я не пользуюсь lit поскольку пространство, ни какое-либо правило или синтаксический анализатор, кажется, не игнорируют пробел, если я правильно понял Дух. Я не уверен, как проверить, что результаты моей грамматики - это те результаты, которые я хочу (например, чтобы не было пробела в кортеже с каждым словом, вместо того, чтобы объединять).

Что я должен сделать, чтобы получить желаемый результат?

1 ответ

Решение

Вы, вероятно, используете поток (строка). В этом случае вы захотите std::noskipws в потоке:

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

namespace qi = boost::spirit::qi;

int main()
{
    typedef boost::spirit::istream_iterator Iterator;

    std::istringstream iss("[[This is some single-spaced text]]");
    qi::rule<Iterator, std::string()> entry = "[[" >> qi::lexeme [ +(qi::char_ - "]]") ] >> "]]";

    // this is key:
    iss >> std::noskipws; // or:
    iss.unsetf(std::ios::skipws);

    Iterator f(iss), l;
    std::string parsed;
    if (qi::parse(f, l, entry >> -qi::eol, parsed))
    {
        std::cout << "Parsed: '" << parsed << "'\n";
    } else
        std::cout << "Failed";

    if (f!=l)
        std::cout << "Remaining: '" << std::string(f,l) << "'\n";
}

Печать

Parsed: 'This is some single-spaced text'
Другие вопросы по тегам