在文法中重新定义 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 => 「 」
根据文档,您可以在语法中 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 => 「 」