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

Håk*_*and 6 grammar perl6 raku

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

regex ws { <!ww> \s* }
Run Code Online (Sandbox Code Playgroud)

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

regex ws { \s+ }
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ton 9

ww断言意味着存在\w与当前点任一侧匹配的字符。取!反,意思是<!ww>匹配:

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

因此,实际上,这意味着不能将空格视为两个单词字符之间的空白。但是,在非单词字符之间,或在单词字符和非单词字符之间,则可以考虑空白。

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

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