我如何抑制跳过boost ::精神来解析引用的字符串

How do I suppress skipping in boost::spirit for parsing a quoted string?

本文关键字:引用 字符串 何抑制 boost      更新时间:2023-10-16

我正在尝试使用boost :: Spirit(除其他事项)以双引号接受字符串,例如"你好世界"。这是一个剥离程序,说明了我的问题:

#include <iostream>
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_istream_iterator.hpp>
namespace qi = boost::spirit::qi;
static void print(const std::vector<char>& v) {
   std::cout << std::string(v.begin(), v.end()) << 'n';
}
template<typename Iterator>
class Grammar : public qi::grammar<Iterator, boost::spirit::ascii::space_type> {
   typedef boost::spirit::ascii::space_type space_type;
   qi::rule<Iterator, space_type> start;
   qi::rule<Iterator, std::vector<char>()> string;
   qi::rule<Iterator, char()> unescapedChar;
public:
   Grammar() : Grammar::base_type(start) {
      start = string[&print];
      string %= qi::lexeme['"' >> qi::no_skip[*unescapedChar] >> '"'];
      unescapedChar %= qi::char_ - qi::lit('"');
   }
};
int main() {
   const std::string s(""how now brown cow"");
   boost::iostreams::filtering_istream fs(boost::make_iterator_range(s.begin(), s.end()));;
   typedef boost::spirit::istream_iterator iterator;
   qi::phrase_parse(
      iterator(fs), iterator(),
      Grammar<iterator>(),
      boost::spirit::ascii::space);
   return 0;
}

在此程序中,unescapedChar规则定义了字符串中的允许字符(除了双引号),而string规则是unescapedChar的Kleene Star。

通过"how now brown cow"(引号作为字符串的一部分)是hownowbrowncow时,该程序的输出的输出。stringstd::vector<char>属性缺少所有空间。我希望这些空间在解析结果中。

unescapedCharstring规则声明均未指定跳过类型。我还尝试单独和一起使用lexemeno_skip指令(如上所示)。我尝试了Boost 1.49,并提升1.55。在每种情况下,输出都没有嵌入式空间。

在我的实际解析器中,我确实想跳过空间,只是不在引用的字符串中。我在做什么错误?

我认为您的问题是输入流,跳过了空格

请参阅http://en.cppreference.com/w/cpp/io/manip/skipws

添加

fs.unsetf(std::ios::skipws);

修复了东西

请参阅 Live on Coliru