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

时间:2018-02-20 18:52:42

标签: whitespace grammar perl6

有人可以澄清Perl 6语法规则中空格是否重要的​​时候?我正在通过反复试验来学习,但似乎无法在文档中找到实际的规则。

示例1:

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

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

将匹配数字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*
}

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

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

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

2 个答案:

答案 0 :(得分:10)

data-中,空格变为data-(即对rule令牌的非捕获调用),除了:

  • 在规则开始时,在第一个原子之前
  • <.ws>(组)或ws(位置捕获)开始时
  • [(||
  • 之后
  • 变量声明(|
  • 之后
  • 代码块后
  • 用于引入分隔符的&运算符
  • 之后
  • :my $x = 'foo';目标匹配运算符
  • 之后
  • 内部修饰符(例如%
  • 之后
  • ~
  • 这样的构造内部

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

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

请注意,这些规则仅适用于<!ww>,而不适用于|rule。可以使用token在任何时候打开它们,然后使用regex关闭它们,但是(:s实际上只是意味着&#34;假装在那里&#39; sa {{ 1}}在开始时#34;)。

最后,可以在语法中覆盖:!s规则(默认为rule),以定义空格在被解析语言中的含义。

答案 1 :(得分:5)

  

有人可以澄清Perl 6语法规则中空格是否重要的​​时候?

:sigspace生效时。

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

首先,在我提供之前,让我们消除一个可能的混淆来源,即在Perl 6的上下文中单词 rule regex 的含义文档链接。

单词 rule 可用于a generic sense(&#34;正则表达式,字符串匹配和Perl 6&#34的通用解析工具;)或作为关键字(rule)。同样, regex 可用于表示与通用规则或关键字(regex)大致相同的事物。

有了这个序言,这里有the :sigspace doc section的链接。

请注意,rule关键字隐式会插入:sigspace,使其在声明的规则中的第一个原子后立即生效,并且效果是词法。有关这两个重要细节的详细讨论,请参阅@smls's answer to another SO question,尤其是前两个要点。

您可能还会发现my answer to another SO question dealing with whitespace/tokenization有帮助。

H个。