PEST 解析器无法识别注释

问题描述

我正在尝试使用 Rust 解析器生成pest 编写解析器。我在使用相当简单的语法时遇到了麻烦。 file 是语法中的顶级规则。它包含 SOIEOI 规则。

// example.pest

WHITESPACE = _ { "\n" | " " }
COMMENT = _{ "(*" ~ ANY* ~ "*)" }

KEYWORD = { ^"keyword" }

file = _{ SOI ~ KEYWORD ~ EOI }

这是我试图解析的文件内容

(*
*)
keyword

生成的解析器无法解析此文件错误如下:

1 | (*␊
  | ^---
  |
  = expected KEYWORD

内置的 COMMENT 规则应该可以处理这种情况。注释中的空格处理方式不同吗?

如何正确编写带有注释的语法?

解决方法

此处给出的语法逻辑实际上存在错误。语法中的这条规则将匹配文件末尾的所有内容。

COMMENT = _{ "(*" ~ ANY* ~ "*)" }

规则应该是

COMMENT = _{ "(*" ~ (!"*)" ~ ANY)* ~ "*)" }

这意味着将匹配任意数量的字符,但不会匹配任何看起来像 *) 的字符。一旦遇到 *),就会到达序列的下一部分,并匹配 *) 并满足整个规则。