white space 什么时候在 Perl 6 语法中真的很重要?

When is white space really important in Perl6 grammars?

有人可以澄清白色 space 在 Perl 6 语法规则中何时重要吗?我正在通过反复试验学习一些,但似乎无法在文档中找到实际规则。

示例 1:

rule number {
    <pm> \d '.'? \d*[ <pm> \d* ]?
}

rule pm {
    [ '+' || '-' ]?
}

将匹配数字 2.68156e+154,而不关心 rule number 中出现的 space。但是,如果我在 \d* 之后添加一个 space,它将失败。 (即 <pm> \d '.'? \d* [ <pm> \d* ]? 失败)。

示例 2: 如果我试图在单词中间查找文字,那么它们周围的间距很重要。即,在查找条目 Double_t Delta_phi_R_1_9_pTproj_13_dat_cent_fx3001[52] = {

grammar TOP {
    ^ .*? <word-to-find> .* ?
}
rule word-to-find {
    \w*?fx\w*
}

会找到这个词。但是,如果规则 word-to-find 的定义更改为: fx\w* fx\w*\w*fx \w* 则不会进行匹配。

此外,定义 '[52]' 将匹配,而定义 'fx[52]' 则不会。

感谢您的任何见解。指向文档中正确点的指针将大有帮助! 谢谢,

rule 中,空格变成 <.ws>(即 non-capturing 对 ws 标记的调用)除了:

  • 在规则的开始,在第一个原子之前
  • [(组)或 ((位置捕获)的开始
  • |||&
  • 之后
  • 变量声明后(:my $x = 'foo';)
  • 代码块后
  • % 运算符之后引入分隔符
  • ~goal-matching运算符后
  • 内部修饰符后(例如:i
  • 在像 $<var> = x
  • 这样的结构中

或者,可能更容易记住,它将被插入到任何可以匹配某些字符的构造之后以及任何 zero-width 断言之后。

这些规则中的一个重要设计目标是永远不要在阻碍最长令牌匹配的地方插入 <.ws>。例如,考虑 rule foo:sym<ba> { [ bar | baz ] },它等同于 token foo:sym<ba> { [ bar <.ws> | baz <.ws> ] <.ws> }。默认的 ws 实现是 non-declarative(由于它使用了 <!ww>),这意味着如果在规则的开头插入它,它将打破 protoregex 级别的最长标记匹配,或者在交替级别插入在组的开头或之后 |.

请注意,这些规则仅适用于 rule,不适用于 tokenregex。它们可以在任何时候使用 :s 打开,并在其中任何一个使用 :!s 关闭,但是(rule 实际上只是意味着 "pretend there's a :s at the start")。

最后,ws 规则(默认为 token ws { <!ww> \s* })可以在语法中被覆盖,以定义空格在被解析的语言中的含义。

can someone clarify when white space is significant in rules in Perl 6 grammars?

:sigspace生效时。

我将在下面提供更多详细信息。如果您或阅读本文的任何其他人需要更多详细信息,请通过评论告诉我,我会进一步展开。

首先,让我们消除一个可能的混淆来源,即 Perl 6 上下文中 ruleregex 这两个词的含义,在我提供文档 link.

之前

rule 一词可以用在 a generic sense ("the regular expression, string matching and general-purpose parsing facility of Perl 6") 中或用作关键字 (rule)。类似地,regex 可用于表示与通用 rule 或关键字 (regex) 大致相同的含义。

先把序言放在一边,这里是 link 到 the :sigspace doc section

请注意 rule 关键字 隐式地 插入一个 :sigspace 以便它在声明的规则中的第一个原子之后立即生效,并且效果是词法的。有关这两个重要细节的详细讨论,请参阅 ,尤其是前两个要点。

您可能还会发现 有帮助。

Hth.