对于可能失败的"post-initialization",可能会失败的 EPS 解析器
eps parser that can fail for a "post-initialization" that could fail
我正在阅读 Boost X3 快速入门教程并注意到了这一行
eps
是一个特殊的精神解析器,不消耗任何输入,但总是成功的。我们使用它来初始化规则的合成属性,先初始化为零。[...]以这种方式使用eps
有利于进行初始化前和初始化后。
现在我不禁想知道eps_that_might_fail
是否有助于对解析输入的一部分进行某种语义/后分析,这可能会失败,以便在语法中进行某种检查的位置。
是否有可能失败的eps
,使用此结构进行额外的输入验证是个好主意吗?
我想传达的一个可怕例子:
int_ >> eps_might_fail[is_prime]
如果我没记错的话,这只会解析素数,并允许完整的解析器在它期望素数的地方失败。
语义
操作就是为此而设计的。
灵气
最自然的例子是
qi::int_ [ qi::_pass = is_prime(qi::_1) ]
请务必在存在语义操作的情况下使用%=
规则分配,因为没有它,语义操作将禁用自动属性传播。
显然,你也可以更冗长,然后写
qi::int_ >> qi::eps(is_prime(qi::_val))
如您所见,引用的文档有点不完整:eps
已经可以采用一个参数,在这种情况下是惰性参与者is_prime(qi::_val)
,该参数确定它是否成功或失败。
精神X3
在Spirit X3中,同样的机制适用,只是X3没有与Phoenix集成。这意味着两件事:
- 从好的方面来说,我们可以只使用核心语言功能(lambdas)进行语义操作,使学习曲线不那么陡峭 。
- 不利的一面是,没有 1 参数版本的
x3::eps
需要一个懒惰的演员
下面是一个使用 X3 的演示程序:
住在科里鲁
#include <boost/spirit/home/x3.hpp>
namespace parser {
using namespace boost::spirit::x3;
auto is_ltua = [](auto& ctx) {
_pass(ctx) = 0 == (_attr(ctx) % 42);
};
auto start = int_ [ is_ltua ];
}
#include <iostream>
int main() {
for (std::string const txt : { "43", "42", "84", "85" }) {
int data;
if (parse(txt.begin(), txt.end(), parser::start, data))
std::cout << "Parsed " << data << "n";
else
std::cout << "Parse failed (" << txt << ")n";
}
}
指纹
Parse failed (43)
Parsed 42
Parsed 84
Parse failed (85)
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 生成MRPT库时cmake配置失败
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- 对于可能失败的"post-initialization",可能会失败的 EPS 解析器