Лексема Boost Spirit vs no_skip - PullRequest
       56

Лексема Boost Spirit vs no_skip

1 голос
/ 03 августа 2020

Как и в описании Boost.Spirit , единственная разница между лексемой и no_skip - это pre_skip.

Но после некоторого теста я все еще не понимаю, что именно означает pre_skip.

Итак, какое условие будет иметь значение, может быть, пример поможет мне лучше понять это.

Спасибо!

1 Ответ

1 голос
/ 04 августа 2020

Предварительный пропуск игнорирует пробелы в начале выражения.

Контраст:

Live On Coliru

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

namespace qi = boost::spirit::qi;
static std::string const input = " 42j";

int main() {
    auto run_test = [](auto p) {
        auto f = input.begin(), l = input.end();
        int i;
        return qi::phrase_parse(f, l, p, qi::space, i)
            ? std::to_string(i)
            : "unparsed";
    };

    std::cout << "no_skip: " << run_test(qi::no_skip[ qi::int_ >> 'j' ]) << "\n";
    std::cout << "lexeme: "  << run_test(qi::lexeme[ qi::int_ >> 'j' ]) << "\n";
}

Печатает:

no_skip: unparsed
lexeme: 42

Как видите, lexeme незаметно съедает начальное белое пространство. Это предварительный пропуск.

...