使用 Pest.rs,如何指定要锚定的注释和整行?

问题描述

Exim uses a really awkward comment syntax,

文件中的空白行和以# 字符(忽略前导空格)开头的行被视为注释并被忽略。 注意:除行首以外的 # 字符不被特殊对待,也不引入注释。

这意味着,

# This is is a comment
This has no comments # at all

有没有办法用 pest.rs 反映这一点?我试过了,

COMMENT    = { "#" ~ (!NEWLINE ~ ANY)* ~ NEWLINE }
WHITESPACE = _{ " " }
main       = { SOI ~ ASCII_ALPHA* ~ EOI }

但是,这将匹配

MyText # Exim test this is not a comment 

如何将评论锚定在左侧?

解决方法

这对于默认的 object 扩展是不可能的,因为它已扩展为 all instances of rule-concatenation with ~ except for the atomics.。下面两行是一样的,

COMMENT

这实质上意味着如果您要使用 a = { b ~ c } a = { b ~ WHITESPACE* ~ (COMMENT ~ WHITESPACE*)* ~ c } ~,您必须将规则限制为 atomic rules with @ and $

取而代之的是,对于基于行的语法,我最终对其进行了改进,而不是使用 COMMENT 宏。而是定义我自己的宏 COMMENT 以避免正常扩展为非原子标记,

_COMMENT

注意这里的 WHITESPACE = _{ " " } _COMMENT = { "#" ~ (!NEWLINE ~ ANY)* ~ NEWLINE } expr = { ASCII_ALPHA+ } stmt = { expr ~ NEWLINE } conf = { SOI ~ (stmt | _COMMENT | NEWLINE)+ ~ EOI } stmt 都以 _COMMENT 终止,并且 conf 包含其中的 1 个或多个。