Я хочу разбирать специальные конструкции и отбрасывать остальные. Но я не хочу использовать шкипера.Boost Spirit Qi: Опустить элемент в парсеры Kleene Star
Я хочу получить вектор этих конструкций, поэтому я использую парсер Kleene Star в качестве основного правила. Но каждый раз, когда что-то отбрасывается, встроенный элемент по умолчанию вставляется в вектор.
Настоящий пример. Он просто ищет строку Test
и выбрасывает остальных, по крайней мере, это план. Но каждый раз, когда правило garbage
преуспевает, он добавляет построенный по умолчанию элемент к вектору в правиле all
, давая результат 7 insteat of 1. Как я могу сказать, что Spirit просто добавляет к вектору, если правило item
преуспевает?
#define BOOST_SPIRIT_USE_PHOENIX_V3
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/fusion/adapted/struct.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <iostream>
#include <string>
#include <vector>
namespace qi = boost::spirit::qi;
struct container {
std::string name;
bool dummy;
};
BOOST_FUSION_ADAPT_STRUCT(::container,
(std::string, name)
(bool, dummy))
int main() {
typedef std::string::const_iterator iterator;
qi::rule<iterator, std::vector<container>()> all;
qi::rule<iterator, container()> item;
qi::rule<iterator, std::string()> string_rule;
qi::rule<iterator> garbage;
all = *(garbage | item);
garbage = qi::char_ - qi::lit("Test");
string_rule = qi::string("Test");
item = string_rule >> qi::attr(true);
std::vector<container> ast;
std::string input = "blaTestbla";
iterator first = input.begin();
iterator last = input.end();
bool result = qi::parse(first, last, all, ast);
if (result) {
result = first == last;
}
if (result) {
std::cout << "Parsed " << ast.size() << " element(s)" << std::endl;
} else {
std::cout << "failure" << std::endl;
}
}
Еще впечатляющий ответ. Я забыл некоторые из этих вещей. +1 +1 снова. – sehe