白色空间何时在Perl6语法中真的很重要?

dav*_*ave 5 whitespace grammar perl6

当Perl 6语法规则中的空白区域显着时,有人可以澄清吗?我正在通过反复试验来学习一些,但似乎无法在文档中找到实际的规则.

例1:

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

rule pm {
    [ '+' || '-' ]?
}
Run Code Online (Sandbox Code Playgroud)

将匹配一个数字2.68156e+154,而不关心存在的空格rule number.但是,如果我之后添加一个空格\d*,它将失败.(即<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*
}
Run Code Online (Sandbox Code Playgroud)

会找到这个词.然而,如果规则的定义word-to-find更改为: fx\w* fx\w*\w*fx \w*那么就不会进行匹配.

此外,然后定义'[52]'将匹配,而定义'fx[52]'将不匹配.

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

Jon*_*ton 10

在a中rule,空格变为a <.ws>(即对ws令牌的非捕获调用),除了:

  • 在规则的开始,在第一个原子之前
  • [(组)或((位置捕获)开始时
  • 之后||,|&
  • 变量声明后(:my $x = 'foo';)
  • 在代码块之后
  • %操作员之后引入分离器
  • ~目标匹配运算符之后
  • 内部修饰符后(如:i)
  • 在像一个结构的内部 $<var> = x

或者,可能更容易记住,它将插入任何可以匹配某些字符的构造之后以及任何零宽度断言之后.

这些规则中的一个重要设计目标是永远不要插入<.ws>阻碍最长令牌匹配的地方.例如,考虑一下rule foo:sym<ba> { [ bar | baz ] },相当于token foo:sym<ba> { [ bar <.ws> | baz <.ws> ] <.ws> }.默认ws实现是非声明性的(由于它的使用<!ww>),这意味着它会在规则开始时插入的protoregex级别中打破最长的令牌匹配,或者在交换级别插入它在开始时插入小组或之后|.

请注意,这些规则仅适用于rule,而不适用于tokenregex.它们可以在任何一点上打开,然后在任何一个中:s关闭:!s,但是(rule实际上只是意味着"假装:s在开始时有一个").

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

  • 只是为了记录,我认为目前 rakudo 中存在一个错误,它总是将 `&lt;.ws&gt;` 解释为非声明性的,即使您使用纯粹的声明性标记覆盖它也是如此。 (2认同)

rai*_*iph 5

当Perl 6语法规则中的空白区域显着时,有人可以澄清吗?

何时:sigspace生效.

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

首先,在我提供文档链接之前,让我们消除一个可能的混淆源,即Perl 6上下文中的规则正则表达式的含义.

单词规则可以用于一般意义上("正则表达式,字符串匹配和Perl 6的通用解析工具")或作为关键字(rule).类似地,正则表达式可以用来表示与通用规则或关键字(regex)大致相同的东西.

有了这个序言,这里:sigspacedoc部分的链接.

请注意,rule关键字隐式插入一个:sigspace使其在声明的规则中的第一个原子之后立即生效,并且该效果是词法的.请参阅@ smls对另一个SO问题的回答,特别是前两个要点,详细讨论这两个重要细节.

你也可以找到我对另一个涉及空格/标记化的SO问题的答案.

心连心.