使用Boost::Spirit解析转义字符串

Parsing escaped strings using Boost::Spirit

本文关键字:转义 转义字符 字符串 Boost Spirit 使用      更新时间:2023-10-16

我想写一个boost::spirit解析器,解析一个使用转义双引号的双引号中的简单字符串,例如"a "b" c"

这是我尝试的:

#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.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;
    qi::rule< Iterator, std::string() > content;
    qi::rule< Iterator, char() > escChar;
    text = '"' >> content >> '"';
    content = +(~char_('"') | escChar);
    escChar = '' >> char_(""");
    bool r = qi::phrase_parse(first, last, text, ascii::space);
    if (first != last) // fail if we did not get a full match
      return false;
    return r;
  }
}
int main() {
  std::string str = ""a \"b\" c"";
  if (client::parse(str.begin(), str.end()))
    std::cout << str << " Parses OK: " << std::endl;
  else
    std::cout << "Failn";
  return 0;
}

它遵循boost精神解析转义字符串的示例,但输出是"Fail"。我怎样才能使它工作呢?

我已经有一段时间没有尝试精神了,但我认为你的一个规则是错误的。

试题:

content = +(escChar | ~char_('"'))

代替:

content = +(~char_('"') | escChar)

它使用~char('"')匹配您的,因此永远不会检查escChar是否匹配。然后,它读取下一个"作为字符串的结尾,并停止解析。