使用 Pest.rs,如何在关键字后允许出现非重要空格?

Tey*_*dge 4 whitespace rust pest

我有以下 Pest ( https://pest.rs ) 语法

name = {ASCII_ALPHA+}
fragment = { "fragment" ~ name }
Run Code Online (Sandbox Code Playgroud)

当我尝试fragment name使用它进行解析时,我收到此错误:

 --> 1:9
  |
1 | fragment name
  |         ^---
  |
  = expected name
Run Code Online (Sandbox Code Playgroud)

Tey*_*dge 7

这个问题是由 Pest 对空白的处理引起的。首先请注意,如果向关键字添加额外的空格,则上述方法有效fragment

name = {ASCII_ALPHA+}
fragment = { "fragment " ~ name }
Run Code Online (Sandbox Code Playgroud)

然而,这并不是最理想的解决方案,因为它只能处理一个空间。fragment在我的特定用例中,用户可以在关键字和名称之间放置任意数量的空格。事实证明,这个问题已经有解决方案了。

从文档中:

使用特殊规则 WHITESPACE。如果已定义,它将在每个波形号 ~ 以及每次重复之间(例如,* 和 +)隐式运行尽可能多次。

初次阅读时,我错过了这句话的重要部分:“如果定义”。

这是一个可选的东西,必须在语法中启用一次(定义多次,因为所有 Pest 规则都是无效的)。

WHITESPACE = _{ " " }
name = {ASCII_ALPHA+}
fragment = { "fragment " ~ name }
Run Code Online (Sandbox Code Playgroud)

请注意,前导下划线的存在很重要,因为这将其标记为隐式规则,因此当您从 Rust 程序操作它时,_{ " " }它不会显示为 a 。Pair