我怎么能得到这个想法编译在pre 2.X提升精神

How can I get this idea to compile in pre 2.x boost spirit?

本文关键字:pre 编译 怎么能      更新时间:2023-10-16

我有一个巨大的xml语法解析,但写了一段时间前2。X提升精神。我想要更有意义的错误信息所以我想说:

#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类:

  • http://www.boost.org/doc/libs/1_41_0/libs/spirit/classic/doc/error_handling.html
您将需要查看显式指定的parse_error,就像boost 1.41中的error_handling.cpp示例

同样,如果有人想花更多的时间在上面的例子上,这里是一个修改后的版本,实际编译(模坏的异常处理):

#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;
    //}
}