c++ - Spirit X3,如何在非 ascii 输入上解析失败?
问题描述
所以目标是不容忍输入字符串中从 80h 到 FFh 的字符。我的印象是
using ascii::char_;
会照顾这个。但正如您在示例代码中看到的那样,它会很高兴地打印 Parsing succeeded。
在下面的 Spirit 邮件列表帖子中,Joel 建议让解析在这些非 ascii 字符上失败。但我不确定他是否继续这样做。 [Spirit-general] ascii 编码断言无效输入...
这是我的示例代码:
#include <iostream>
#include <boost/spirit/home/x3.hpp>
namespace client::parser
{
namespace x3 = boost::spirit::x3;
namespace ascii = boost::spirit::x3::ascii;
using ascii::char_;
using ascii::space;
using x3::lexeme;
using x3::skip;
const auto quoted_string = lexeme[char_('"') >> *(char_ - '"') >> char_('"')];
const auto entry_point = skip(space) [ quoted_string ];
}
int main()
{
for(std::string const input : { "\"naughty \x80" "bla bla bla\"" }) {
std::string output;
if (parse(input.begin(), input.end(), client::parser::entry_point, output)) {
std::cout << "Parsing succeeded\n";
std::cout << "input: " << input << "\n";
std::cout << "output: " << output << "\n";
} else {
std::cout << "Parsing failed\n";
}
}
}
如何更改示例以使 Spirit 在此无效输入上失败?
此外,但非常相关,我想知道我应该如何使用定义 char_set 编码的字符解析器。你char_(charset)
从X3 文档中知道:字符解析器开发分支。
文档缺乏如此强烈的描述基本功能。为什么提升顶级人员不能强制图书馆作者提供至少在 cppreference.com 级别的文档?
解决方案
这里的文档没什么不好。这只是一个库错误。
代码在哪里any_char
说:
template <typename Char, typename Context>
bool test(Char ch_, Context const&) const
{
return ((sizeof(Char) <= sizeof(char_type)) || encoding::ischar(ch_));
}
应该说
template <typename Char, typename Context>
bool test(Char ch_, Context const&) const
{
return ((sizeof(Char) <= sizeof(char_type)) && encoding::ischar(ch_));
}
这使您的程序按预期和要求运行。该行为也符合 Qi 行为:
#include <boost/spirit/include/qi.hpp>
int main() {
namespace qi = boost::spirit::qi;
char const* input = "\x80";
assert(!qi::parse(input, input+1, qi::ascii::char_));
}
推荐阅读
- r - 在 R 中创建嵌套列表
- visual-studio-code - 如何让vscode在保存时自动重命名文件?
- android - 如何使用 Firestore 集合中的经度和纬度在地图上显示带有标记的位置?
- ruby - postgresql 中枚举类型列的包含过滤
- java - 为什么android程序不能在我的手机上运行(它可以在虚拟手机上正常运行)
- php - 使用数组的 PHP 递归
- java - Flutter 说它“无法解决项目”
- angular - 同一页面上的多个 Angular 数据表错误显示分页控件
- java - @ApiResponse 响应体为空(Spring Boot)
- r - 对 0 和 1 的 p 值执行 qnorm()