【问题标题】:Parsing escaped strings using Boost::Spirit使用 Boost::Spirit 解析转义字符串
【发布时间】:2011-10-04 09:20:34
【问题描述】:

我想编写一个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 << "Fail\n";
  return 0;
}

它遵循Parsing escaped strings with boost spirit 上的示例,但输出为“失败”。我怎样才能让它工作?

【问题讨论】:

    标签: c++ parsing boost boost-spirit


    【解决方案1】:

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

    试试:

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

    代替:

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

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

    【讨论】:

    • 如何修改此语法以便捕获 \?
    猜你喜欢
    • 1970-01-01
    • 2012-05-04
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多