在语法中重新定义ws

时间:2019-06-01 08:59:30

标签: grammar perl6

根据文档,您可以在语法中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

有关

1 个答案:

答案 0 :(得分:8)

未被捕获的空白与ws的定义无关,而是与sigspace(“重要空白”)的工作方式有关。

:s修饰符启用并且默认情况下位于rule中的Sigspace根据其规则插入<.ws>(可以概括为“在原子之后”)。这是对ws规则的非捕获调用。重新定义ws对此没有影响,因为它是调用ws而不是ws本身的规则的属性。

实际上,如果我们对默认的<ws>进行显式调用:

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

它将捕获,上述程序的输出为:

「1 2」
 ws => 「 」