我如何抑制跳过boost ::精神来解析引用的字符串
How do I suppress skipping in boost::spirit for parsing a quoted string?
我正在尝试使用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
时,该程序的输出的输出。string
的std::vector<char>
属性缺少所有空间。我希望这些空间在解析结果中。
unescapedChar
和string
规则声明均未指定跳过类型。我还尝试单独和一起使用lexeme
和no_skip
指令(如上所示)。我尝试了Boost 1.49,并提升1.55。在每种情况下,输出都没有嵌入式空间。
在我的实际解析器中,我确实想跳过空间,只是不在引用的字符串中。我在做什么错误?
我认为您的问题是输入流,跳过了空格
请参阅http://en.cppreference.com/w/cpp/io/manip/skipws
添加
fs.unsetf(std::ios::skipws);
修复了东西
请参阅 Live on Coliru
相关文章:
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 在C++17中,引用const字符串的语义应该是什么
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 我如何通过引用将 c++ 字符串分配给另一个字符串
- C++引用 C 字符串是可能的吗?
- 引用字符串成员变量
- 在 C++ 中取消引用字符串时会发生什么情况
- 反向函数不反转类实例化的引用字符串
- 如何使操作员返回引用字符串元素
- 如何在C++中引用字符串的有限字符
- 查看VS2008中引用字符串的值
- 如何在不使用 variable_name.at() 的情况下引用字符串的最后一个字符
- 取消引用字符串向量的 .end() 时的行为
- 取消引用字符串迭代器无法编译
- 使用传递给运行时加载的dll函数的引用字符串数组
- 在C++中引用字符串
- 引用字符串参数导致Segmentation错误
- 如何在字符串向量中引用字符串的特定字符
- 比较引用字符串和字符串
- 解引用字符串迭代器和性能影响