根据文档,您可以在语法中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
有关答案 0 :(得分:8)
未被捕获的空白与ws
的定义无关,而是与sigspace(“重要空白”)的工作方式有关。
由:s
修饰符启用并且默认情况下位于rule
中的Sigspace根据其规则插入<.ws>
(可以概括为“在原子之后”)。这是对ws
规则的非捕获调用。重新定义ws
对此没有影响,因为它是调用ws
而不是ws
本身的规则的属性。
实际上,如果我们对默认的<ws>
进行显式调用:
say "1 2" ~~ /\d <ws> \d/
它将捕获,上述程序的输出为:
「1 2」
ws => 「 」