gpt4 book ai didi

c++ - Spirit X3,如何在非 ascii 输入上解析失败?

转载 作者:行者123 更新时间:2023-11-30 03:15:37 35 4
gpt4 key购买 nike

所以目标是不允许输入字符串中从 80h 到 FFh 的字符。我的印象是

using ascii::char_;

会处理这个。但正如您在示例代码中看到的那样,它会愉快地打印 Parsing succeeded。

在下面的 Spirit 邮件列表帖子中,Joel 建议让解析在这些非 ascii 字符上失败。但我不确定他是否继续这样做。 [Spirit-general] ascii encoding assert on invalid input ...

这里是我的示例代码:

#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 编码的字符解析器。你从 X3 docs: Character Parsers develop branch 知道 char_(charset) .

文档缺乏对基本功能的强烈描述。为什么 boost 高层人员不能强制图书馆作者提供至少在 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 行为:

Live On Coliru

#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_));
}

在此处提交错误:https://github.com/boostorg/spirit/issues/520

关于c++ - Spirit X3,如何在非 ascii 输入上解析失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56916592/

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