【问题标题】:Default definition of white space method ws in a grammar语法中空格方法ws的默认定义
【发布时间】:2019-04-01 19:01:18
【问题描述】:

根据the documentation,语法中ws方法的默认定义是匹配零个或多个空白字符,只要该点不在单词内:

regex ws { <!ww> \s* }

这个定义和下面的有什么区别:

regex ws { \s+ }

我想知道为什么使用零宽度断言&lt;!ww&gt; 而不是更简单的\s+?我还注意到默认定义允许匹配零个空格,但是什么时候会真正发生呢?如果使用\s+而不是\s*会不会更清楚?

【问题讨论】:

  • 好的,那么默认的ws 将匹配非单词字符和非空格的连续字符(如表情符号)。例如:perl6 -e 'my $str="\c[carrot]\c[potato]"; say $str.split(/&lt;!ww&gt;\s*/).elems' 给出 4。这是合理的行为吗?
  • Larry 认为这是合理的 默认 行为。这个想法是它适用于大多数典型的语法,如果你想要别的东西,你只需定义你自己的 ws 规则。

标签: grammar raku


【解决方案1】:

ww 断言意味着在当前点的任一侧都有匹配 \w 的字符。 ! 反转它,意思是 &lt;!ww&gt; 匹配:

  • 在字符串的开头
  • 在字符串的末尾
  • 当当前位置前有非\w字符时(如“+”和“a”之间)
  • 当当前位置后有非\w字符时(如“a”和“+”之间)

实际上,这意味着永远不能认为空格出现在两个单词字符之间。但是,在非单词字符之间,或者在单词字符和非单词字符之间,则可以考虑空格。

这符合我们可能希望解析的许多语言的需求。例如,考虑ab+cd。默认的ws 将匹配+ 的任一侧,但不会在标识符内匹配。

对于不适合的语言,只需覆盖默认的 ws 即可满足该语言的需求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2014-10-27
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    相关资源
    最近更新 更多