在文法中重新定义 ws

Redefining ws in a grammar

根据文档,您可以在语法中 redefine the ws 标记,在某些情况下会自动调用此标记,例如:

grammar Numbers { rule TOP { \d \d } }; 
my $result = Numbers.parse("3 \n 3");
say $result.perl
# OUTPUT: «Match.new(pos => 5, made => Any, from => 0, hash => Map.new(()), orig => "3 \n 3", list => ())␤»  

重新定义ws的好处之一可能是它不会被丢弃。好的,我会购买并使用与内部使用完全相同的定义 ws

grammar Numbers { rule TOP { \d \d }; regex ws { <!ww> \s* } };
my $result = Numbers.parse("3 \n 3");
say $result<ws> # OUTPUT: «Nil␤» 

匹配有效,但 $result 仍然被删除(将其重新定义为另一个不使用默认 ws 的标记将有效)。那么 ws 总是掉线吗?

更新 这大概和this Rakudo bug

有关

空白未被捕获与 ws 的定义无关,而是与 sigspace ("significant whitespace") 的工作方式有关。

Sigspace,由:s修饰符启用,默认情况下在rule中打开,根据其规则插入<.ws>(可以概括为"after an atom") .这是对 ws 规则的 non-capturing 调用。重新定义 ws 对此没有影响,因为它是调用 ws 的规则的 属性,而不是 ws 本身。

确实,如果我们显式调用默认值 <ws>:

say "1 2" ~~ /\d <ws> \d/

它将捕获,上面程序的输出是:

「1 2」
 ws => 「 」