在Boost :: Spirit中,我该如何解析后跟分号或带有可选分号的换行符的条目?如何解析条目后跟分号或换行符(boost :: spirit)?
示例输入,其中每个条目是一个int和双:
12 1.4;
63 13.2
2423 56.4 ; 5 8.1
下面是示例代码只是解析条目随后空白:
#include <iostream>
#include <boost/foreach.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_istream_iterator.hpp>
#include <boost/fusion/include/std_pair.hpp>
namespace qi = boost::spirit::qi;
typedef std::pair<int, double> Entry;
template <typename Iterator, typename Skipper>
struct MyGrammar : qi::grammar<Iterator, std::vector<Entry>(), Skipper> {
MyGrammar() : MyGrammar::base_type(entries) {
entry = qi::int_ >> qi::double_;
entries = +entry;
}
qi::rule<Iterator, Entry(), Skipper> entry;
qi::rule<Iterator, std::vector<Entry>(), Skipper> entries;
};
int main() {
typedef boost::spirit::istream_iterator It;
std::cin.unsetf(std::ios::skipws);
It it(std::cin), end;
MyGrammar<It, qi::space_type> entry_grammar;
std::vector<Entry> entries;
if (qi::phrase_parse(it, end, entry_grammar, qi::space, entries)
&& it == end) {
BOOST_FOREACH(Entry const& entry, entries) {
std::cout << entry.first << " and " << entry.second << std::endl;
}
}
else {
std::cerr << "FAIL" << std::endl;
exit(1);
}
return 0;
}
现在,来解析方式予想要(每个条目后面跟着分号或换行符,可选择分号),我将其替换为:
entries = +entry;
通过这样的:
entries = +(entry >> (qi::no_skip[qi::eol] || ';'));
其中boost::spirit
操作者||
指:(a后跟可选B)或b。
12 1.4
63 13.2
这是有道理的,因为no_skip
的空间不匹配,但我没能找到一个解决办法:但是如果在这个例子中输入1.4
后空间给出了一个错误。
不是boost ::精神对于这么简单的任务来说有点矫枉过正? –
我刚在这里做了一个小例子,我的真实语法比较复杂。 – Frank