根据文档,您可以在语法中重新定义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 => ())?»
Run Code Online (Sandbox Code Playgroud)
重新定义的优点之一ws可能是不会被丢弃。好的,我将购买并使用ws与内部使用的完全相同的定义:
grammar Numbers { rule TOP { \d \d }; regex ws { <!ww> \s* } };
my $result = Numbers.parse("3 \n 3");
say $result<ws> # OUTPUT: «Nil?»
Run Code Online (Sandbox Code Playgroud)
匹配有效,但$ result仍被删除(将其重新定义为不使用默认ws的另一个令牌将起作用)。那么ws总是掉线吗?
更新这可能与Rakudo错误有关
Jon*_*ton 12
未捕获空白与的定义无关ws,而与sigspace(“有效空白”)的工作方式无关。
由:s修饰符启用的Sigspace (默认情况下在a中启用)根据其规则rule插入<.ws>(可以概括为“在原子之后”)。这是对规则的非捕获性调用ws。重新定义ws对此没有影响,因为它是规则调用的属性ws,而不是规则ws本身。
确实,如果我们写一个对default的显式调用<ws>:
say "1 2" ~~ /\d <ws> \d/
Run Code Online (Sandbox Code Playgroud)
它将捕获,上述程序的输出为:
?1 2?
ws => ? ?
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
118 次 |
| 最近记录: |