white space 方法 ws 语法中的默认定义
Default definition of white space method ws in a grammar
根据 the documentation 语法中 ws
方法的默认定义是匹配零个或多个空白字符,只要该点不在单词内即可:
regex ws { <!ww> \s* }
这个定义和下面的有什么区别:
regex ws { \s+ }
我想知道为什么使用零宽度断言 <!ww>
而不是更简单的 \s+
?我还注意到默认定义允许匹配零个空格,但什么时候会发生呢?用\s+
代替\s*
不是更清楚吗?
ww
断言意味着在当前点的任一侧都有匹配 \w
的字符。 !
反转它,意思是 <!ww>
匹配:
- 在字符串的开头
- 在字符串的末尾
- 当当前位置之前有非
\w
字符时(例如“+”和"a"之间)
- 当当前位置后有非
\w
字符时(例如"a"和“+”之间)
那么,实际上,这意味着永远不能认为空格出现在两个单词字符之间。但是,非单词字符之间,或者单词字符与非单词字符之间,则可以认为是空白。
这符合我们可能希望解析的许多语言所需要的。例如,考虑 ab+cd
。默认 ws
将匹配 +
的任一侧,但不会在标识符内匹配。
对于不适合的语言,只需覆盖默认值 ws
即可满足该语言的需要。
根据 the documentation 语法中 ws
方法的默认定义是匹配零个或多个空白字符,只要该点不在单词内即可:
regex ws { <!ww> \s* }
这个定义和下面的有什么区别:
regex ws { \s+ }
我想知道为什么使用零宽度断言 <!ww>
而不是更简单的 \s+
?我还注意到默认定义允许匹配零个空格,但什么时候会发生呢?用\s+
代替\s*
不是更清楚吗?
ww
断言意味着在当前点的任一侧都有匹配 \w
的字符。 !
反转它,意思是 <!ww>
匹配:
- 在字符串的开头
- 在字符串的末尾
- 当当前位置之前有非
\w
字符时(例如“+”和"a"之间) - 当当前位置后有非
\w
字符时(例如"a"和“+”之间)
那么,实际上,这意味着永远不能认为空格出现在两个单词字符之间。但是,非单词字符之间,或者单词字符与非单词字符之间,则可以认为是空白。
这符合我们可能希望解析的许多语言所需要的。例如,考虑 ab+cd
。默认 ws
将匹配 +
的任一侧,但不会在标识符内匹配。
对于不适合的语言,只需覆盖默认值 ws
即可满足该语言的需要。