使用Boost :: Spirit解析转义字符串:: Spirit
问题描述:
我想编写一个boost::spirit
解析器,该解析器在使用双引号的双引号中解析简单字符串,例如, "a \"b\" c"
。使用Boost :: Spirit解析转义字符串:: Spirit
这里是我的尝试:
#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的例子,但输出为“失败”。我怎样才能使它工作?
答
过了一段时间,因为我在精神上走了一步,但我认为你的一条规则是错误的。
尝试:
content = +(escChar | ~char_('"'))
代替:
content = +(~char_('"') | escChar)
它使用~char('"')
符合\
,因此从来轮到达如果escChar
匹配检查。然后它读取下一个"
作为字符串的结尾并停止解析。
如何修改此语法以便捕获\? – Addy