【发布时间】:2013-11-18 00:42:54
【问题描述】:
我想解析特殊结构并将其余部分丢弃。但我不想使用船长。
我想获得这些结构的向量,所以我使用 Kleene Star 解析器作为主要规则。但是,每次丢弃某些东西时,都会在向量中插入一个默认构造元素。
这是一个虚构的例子。它只是寻找字符串Test 并将其余的扔掉,至少这是计划。但是每次规则 garbage 成功时,它都会向规则 all 中的向量添加一个默认构造项,输出为 7,而不是 1。如果规则 @987654324,我如何告诉 Spirit 只添加到向量中@成功了吗?
#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;
}
}
【问题讨论】:
标签: c++ boost boost-spirit boost-spirit-qi