parsing - 使用 Pest.rs,如果 PUSH 是可选的,如何避免“在空堆栈上调用 peek”?
问题描述
Pest.rs 具有推送和窥视堆栈的能力。当用户给出分隔符时,这很有用,例如在 Perl 和 PostgreSQL 中找到的自定义引用(双美元语法)。如果项目可能不在堆栈上,我该怎么做。例如,Exim 配置文件指出,
也可以使用换行符和其他控制字符(代码值小于 32 的字符,加上 DEL)作为列表中的分隔符。此类分隔符必须在处理列表时按字面意思提供。对于字符串扩展的选项,您可以使用正常的转义序列编写分隔符。这将在字符串被解释为列表之前由扩展器处理。例如,如果通过查找生成以换行符分隔的域列表,则可以通过如下行直接处理它:
domains = <\n ${lookup mysql{.....}}
您可以在此处看到<\n
覆盖默认分隔符的标记:
是可选的。你可以看到这里的语法本质上是,
list_sep = ${ "<" ~ (!WHITE_SPACE ~ ANY) }
list = {
list_type
~ key
~ "="
~ PUSH(list_sep)?
~ !(PEEK ~ ANY)+
~ (PEEK ~ !(PEEK ~ ANY))*
}
但是当我跑步时,我得到了,
peek 在空堆栈上被调用
无论如何,是否可以使用 PEG 提供此操作,以便将列表作为字符串呈现给用户,但作为元素标记的实际列表?
解决方案
我开始做的一种方法是确保PUSH
总是发生。甚至似乎一个可选的PUSH
应该是编译器错误,
而不是
~ PUSH(list_sep)?
做这个,
~ PUSH(list_sep?)
推荐阅读
- java - recyclerview 不显示来自 Json 的多个数据
- unit-testing - 对 Google 的 Go API 客户端进行单元测试
- file-upload - Jmeter内存不足_文件上传测试
- r - 在 R 中的 foreach 循环中打印输出
- php - PHP strtotime() 在有效字符串上返回 false
- c++ - 将向量插入向量的向量中
- c# - 处理您的请求时发生错误。请求 ID:0HLEALBF2I2PS:00000007
- c++ - 如何排序QTableView忽略大小写
- static-libraries - 静态库包含来自其他头文件的未定义引用#define
- c# - 如何在 IIS 中使用个人智能卡(x509 证书)