我必须使用boost :: spirit进行解析,我想使用phrase_parse函数:
qi::phrase_parse(str.begin(), str.end(), grammar, ascii::space - qi::eol);
Run Code Online (Sandbox Code Playgroud)
但是我的编译器不允许第四个术语(ascii :: space - qi :: eol).我如何使用船长ascii :: space没有跳过eol?
我有一个记录解析器,它会抛出几个异常中的一个来指示哪个规则失败了.
前面的事:
#include <iostream>
#include <sstream>
#include <stdexcept>
#include <string>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
#include <boost/spirit/include/classic_position_iterator.hpp>
using namespace boost::spirit;
using namespace boost::spirit::ascii;
using namespace boost::spirit::qi;
using namespace boost::spirit::qi::labels;
using boost::phoenix::function;
using boost::phoenix::ref;
using boost::spirit::qi::eol;
using boost::spirit::qi::fail;
using boost::spirit::qi::lit;
using boost::spirit::qi::on_error;
using BOOST_SPIRIT_CLASSIC_NS::file_position;
using BOOST_SPIRIT_CLASSIC_NS::position_iterator;
Run Code Online (Sandbox Code Playgroud)
我们使用position_iterator来自Spirit.Classic,因此以下流插入运算符非常方便.
std::ostream&
operator<<(std::ostream& o, const file_position &fp)
{
o << fp.file << ": " << fp.line << ',' << fp.column;
return o;
}
Run Code Online (Sandbox Code Playgroud)
模板会err_t因为抛出与不同形式的解析失败相关的异常而触发样板.
template <typename Exception>
struct err_t { …Run Code Online (Sandbox Code Playgroud)