语法中空格方法ws的默认定义

时间:2019-04-01 19:01:19

标签: grammar perl6

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

regex ws { <!ww> \s* }

此定义与以下内容有何区别:

regex ws { \s+ }

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

1 个答案:

答案 0 :(得分:9)

ww断言意味着在当前点的任一侧都有与\w匹配的字符。 !将其反转,表示<!ww>符合以下条件:

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

那么,有效地,这意味着决不能将空格视为两个单词字符之间的空白。但是,在非单词字符之间,或者在单词字符和非单词字符之间,则可以考虑空白。

这遵循了我们可能希望解析的多种语言。例如,考虑ab+cd。默认的ws将与+的任一侧匹配,但例如在标识符内将不匹配。

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