如何使用Boost Spirit解析CSV之类的转义字符串?

问题描述 投票:0回答:1

对于我的快速解析器项目,我想像转义一样使用CSV:""转义为"

示例:

 "\"hello\"",
 "   \"  hello \"  ",
 "  \"  hello \"\"stranger\"\" \"  ",

在线编译和尝试:https://wandbox.org/permlink/5uchQM8guIN1k7aR

我当前的解析规则仅解析前两个测试

qi::rule<std::string::const_iterator, qi::blank_type, utree()> double_quoted_string
    = '"' >> qi::no_skip[+~qi::char_('"')] >> '"';

我已经找到了这个stackoverflow问题,并使用了Spirit给出了一个答案:

How can I read and parse CSV files in C++?

start       = field % ',';
field       = escaped | non_escaped;
escaped     = lexeme['"' >> *( char_ -(char_('"') | ',') | COMMA | DDQUOTE)  >> '"'];
non_escaped = lexeme[       *( char_ -(char_('"') | ',')                  )        ];
DDQUOTE     = lit("\"\"")       [_val = '"'];
COMMA       = lit(",")          [_val = ','];

((我不知道如何链接答案,因此如果有兴趣搜索“当您使用boost :: spirit之类​​的精美内容时,您会感到骄傲)]

不幸的是,它无法为我编译-甚至多年的C ++错误信息分析也没有使我做好准备应对精神错误信息:)如果我理解正确,则规则将等待,作为字符串定界符,对于我的表达式解析器项目,可能不正确的事情

expression = "strlen( \"hello \"\"you\"\" \" )+1";
expression = "\"hello \"";
expression = "strlen(concat(\"hello\",\"you\")+3";

或者在这种情况下,规则是否需要等待,)

我希望我不要问太多愚蠢的问题,但是答案可以帮助我充分振作起来表达式解析本身几乎可以正常工作,除了字符串转义

向任何帮助致谢

UPDATE:这似乎对我有用,至少它解析了字符串但是从字符串中删除了转义的",是否有更好的调试输出可用于字符串? " " " " "h" "e" "l" "l" "o" " " "s" "t" "r" "a" "n" "g" "e" "r" " "不太可读

qi::rule<std::string::const_iterator, utree()> double_quoted_string
  = qi::lexeme['"' >> *(qi::char_ - (qi::char_('"')) | qi::lit("\"\"")) >> '"'];
c++ boost boost-spirit boost-spirit-qi
1个回答
0
投票

您可以简化此问题。如何使双引号字符串接受“双双引号”以转义嵌入的双引号字符?

一个没有转义的简单字符串解析器:

qi::rule<It, std::string()> s = '"' >> *~qi::char_('"') >> '"';

现在,要根据需要也接受单个转义的",只需添加:

s = '"' >> *("\"\"" >> qi::attr('"') | ~qi::char_('"')) >> '"';

[其他说明:

  • 在您的在线示例中,对no_skip的使用很草率:它将"foo bar"" foo bar "解析为foo bar(修剪空白)。
© www.soinside.com 2019 - 2024. All rights reserved.