我正在尝试使用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。
答案 0 :(得分:1)
你正试图结合经典(旧的,V1,...)boost :: spirit :: classic和(new,V2)boost :: spirit :: qi。
这不起作用。较新的东西是完整的,不兼容的,重写。请参阅文档中的“从精神移植1.8.x”注释。 至于如何使用boost :: spirit :: qi解析转义的C / C ++字符串的问题,以下文章将有所帮助: