首页 > 解决方案 > 语法中空格方法ws的默认定义

问题描述

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

regex ws { <!ww> \s* }

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

regex ws { \s+ }

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

标签: grammarraku

解决方案


ww断言意味着有字符匹配当前点的\w任一侧。!反转它,意思匹配<!ww>

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

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

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

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


推荐阅读