问题描述
我正在尝试使用 Rust 解析器生成器 pest 编写解析器。我在使用相当简单的语法时遇到了麻烦。 file
是语法中的顶级规则。它包含 SOI
和 EOI
规则。
// example.pest
WHITESPACE = _ { "\n" | " " }
COMMENT = _{ "(*" ~ ANY* ~ "*)" }
KEYWORD = { ^"keyword" }
file = _{ SOI ~ KEYWORD ~ EOI }
(*
*)
keyword
1 | (*␊
| ^---
|
= expected KEYWORD
内置的 COMMENT
规则应该可以处理这种情况。注释中的空格处理方式不同吗?
如何正确编写带有注释的语法?
解决方法
此处给出的语法逻辑实际上存在错误。语法中的这条规则将匹配文件末尾的所有内容。
COMMENT = _{ "(*" ~ ANY* ~ "*)" }
规则应该是
COMMENT = _{ "(*" ~ (!"*)" ~ ANY)* ~ "*)" }
这意味着将匹配任意数量的字符,但不会匹配任何看起来像 *)
的字符。一旦遇到 *)
,就会到达序列的下一部分,并匹配 *)
并满足整个规则。