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)
这个问题是由 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