Как разобрать экранированную строку, используя `c_escape_ch_p` из boost :: spirit? - PullRequest
0 голосов
/ 08 декабря 2011

Я пытаюсь использовать c_escape_ch_p (см. здесь ) из boost::spirit для анализа экранированной строки 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);

Итак, он говорит, что это недопустимое выражение.Как это правильно использовать?

PS: Я использую Boost 1.45.

1 Ответ

1 голос
/ 24 октября 2012

Вы пытаетесь объединить классический (старый, V1, ...) boost :: spirit :: classic и (новый, V2) boost :: spirit :: qi.

Это не сработает. Более новый материал - это полная и несовместимая перезапись. См. Примечания «Porting from Spirit 1.8.x» в документации. Что касается вопроса о том, как анализировать экранированные строки C / C ++ с использованием boost :: spirit :: qi, будет полезна следующая статья:

Синтаксический анализ входных данных с использованием Spirit.Qi

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...