gpt4 book ai didi

grammar - 重新定义语法中的ws

转载 作者:行者123 更新时间:2023-12-04 13:36:09 26 4
gpt4 key购买 nike

根据文档,您可以在语法中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的另一个 token 将起作用)。那么 ws是否总是被丢弃?

更新这可能与 this Rakudo bug有关

最佳答案

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

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

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

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

它将捕获,上述程序的输出为:
「1 2」
ws => 「 」

关于grammar - 重新定义语法中的ws,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56405254/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com