c++ - 我怎样才能让这个想法以 pre 2.x boost spirit 编译?

标签 c++ boost boost-spirit

我有大量用于 xml 解析的语法,但在 2.x 之前的 boost spirit 中写了一段时间。我想要更有意义的错误消息,所以我想说:

#include <boost/spirit/core.hpp>
#include <boost/spirit/iterator/multi_pass.hpp>

const char* sourcefile;

typedef const char* base_iteratory_type
typedef boost::spirit::multi_pass<base_iterator_type> forward_iterator_type;
typedef boost::spirit::position_iterator2<forward_iterator_type> pos_iterator_t;

base_iterator_type begin(m_document.c_str());
base_iterator_type end = m_document.c_str() + m_document.size();

forward_iterator_type fwd_begin = boost::spirit::make_multi_pass(begin);
forward_iterator_type fwd_end;

pos_iterator_t pos_begin(fwd_begin, fwd_end, sourcefile);
pos_iterator_t pos_end;

try{
parse(pos_begin, pos_end, document_p);
}
catch(const boost::spirit::qi::expectation_failure<pos_iterator_t>& e)
{
//retrieve info from e.first.get_position of type file_position_base;
}

然而,这并没有在捕获异常的行上编译错误并提示 expected unqualified-id before::token...我可以在 2.x 之前的 spirit 中实现这一点吗?所谓的“经典”界面?如果是这样,这需要进行哪些修改?

最佳答案

据我所知,expectation_failure 类在经典 Spirit 中不存在:

您需要查看明确指定的parse_error,例如 error_handling.cpp sample 来自 boost 1.41。

此外,如果有人想在上面的示例上花费更多时间,这里有一个实际编译的修改版本(对损坏的异常处理取模):

#include <boost/spirit/include/classic_core.hpp>
#include <boost/spirit/include/classic_multi_pass.hpp>
#include <boost/spirit/include/classic_position_iterator.hpp>

typedef const char* base_iterator_type;
typedef boost::spirit::classic::multi_pass<base_iterator_type> forward_iterator_type;
typedef boost::spirit::classic::position_iterator2<forward_iterator_type> pos_iterator_t;

int main()
{
    const char* sourcefile;


    std::string m_document;
    base_iterator_type begin(m_document.c_str());
    base_iterator_type end = m_document.c_str() + m_document.size();

    forward_iterator_type fwd_begin = boost::spirit::classic::make_multi_pass(begin);
    forward_iterator_type fwd_end;

    pos_iterator_t pos_begin(fwd_begin, fwd_end, sourcefile);
    pos_iterator_t pos_end;

    try{
        parse(pos_begin, pos_end, boost::spirit::classic::real_p);
    }
    catch(...) {}
    //catch(const boost::spirit::classic::expectation_failure<pos_iterator_t>& e)
    //{
        ////retrieve info from e.first.get_position of type file_position_base;
    //}

}

关于c++ - 我怎样才能让这个想法以 pre 2.x boost spirit 编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8387213/

相关文章:

c++ - 从 QML 简单访问 C++ 对象数据

c++ - 重新分配分离的 boost::thread 是否安全

c++ - 创建一个用于 spirit 规则的凤凰函数

c++ - boost spirit x3 : parse into structs

c++:在构造函数中将shared_ptr的 vector 初始化为不同的指针

c++ - 构建 Qt 5.3.0 时出错

c++ - 再次调用 async_read 会抛出异常

c++ - 将 kleene 运算符解析为一组替代方案,适配器?有精神x3

C++ 字符串/字符* 连接

c++ - std::make_pair 错误与 boost::bind 在 VS2010