gpt4 book ai didi

c++ - 如何在 boost::spirit 中抑制跳过以解析带引号的字符串?

转载 作者:搜寻专家 更新时间:2023-10-31 01:06:06 24 4
gpt4 key购买 nike

<分区>

我正在尝试使用 boost::spirit 实现一个简单的解析器,它(除其他外)接受双引号中的字符串,例如“ Hello World ”。这是一个说明我的问题的精简程序:

#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 rule 是 unescapedChar 的 Kleene 星在双引号内。

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

unescapedChar 都不是也不是 string规则声明指定跳过类型。我还尝试使用 lexemeno_skip单独和一起的指令(如上所示)。我试过 boost 1.49 和 boost 1.55。在每种情况下,输出都没有嵌入空格。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com