如何使用boost :: spirit中的`c_escape_ch_p`解析转义字符串?

时间:2011-12-08 01:51:48

标签: boost escaping boost-spirit

我正在尝试使用c_escape_ch_p中的boost::spirit(请参阅here)来解析转义的C++字符串。但我收到编译错误。这是我的代码:

#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/home/classic/utility/escape_char.hpp>
#include <boost/spirit/home/classic/utility/confix.hpp>
#include <iostream>
#include <string>

namespace client {
  namespace qi = boost::spirit::qi;
  namespace ascii = boost::spirit::ascii;

  template <typename Iterator>
  bool parse(Iterator first, Iterator last) {
    using qi::char_;
    qi::rule< Iterator, std::string(), ascii::space_type > text;

    using namespace boost::spirit::classic;
    qi::rule<Iterator, std::string()> myword2 =
      confix_p('"', *c_escape_ch_p, '"') ; // ERROR!   
    text = myword2;

    bool r = qi::phrase_parse(first, last, text, ascii::space);
    if (first != last)
      return false;
    return r;
  }
}

int main () {
  std::string s = "\"foo\"";
  bool ok = client::parse(s.begin(), s.end());
  std::cout << "OK? " << (ok ? "y" : "n") << std::endl;
  return 0;
}

编译器错误是从confix

行实例化的失败静态断言
    // Report invalid expression error as early as possible.                                                            
    // If you got an error_invalid_expression error message here,                                                       
    // then the expression (expr) is not a valid spirit qi expression.                                                  
    BOOST_SPIRIT_ASSERT_MATCH(qi::domain, Expr);

所以,它说这不是一个有效的表达。它是如何正确使用的?

P.S。:我正在使用Boost 1.45。

1 个答案:

答案 0 :(得分:1)

你正试图结合经典(旧的,V1,...)boost :: spirit :: classic和(new,V2)boost :: spirit :: qi。

这不起作用。较新的东西是完整的,不兼容的,重写。请参阅文档中的“从精神移植1.8.x”注释。 至于如何使用boost :: spirit :: qi解析转义的C / C ++字符串的问题,以下文章将有所帮助:

Parsing Escaped String Input Using Spirit.Qi