语法和Unicode字符

hyt*_*thm 7 perl6 raku

为什么下面的代码Grammar无法解析unicode字符?

从中删除单词边界后解析很好<sym>

#!/usr/bin/env perl6

grammar G {


  proto rule TOP { * }

  rule TOP:sym<y>  { «<.sym>» }
  rule TOP:sym<?>  { «<.sym>» }

}

say G.parse('y'); # ?y?
say G.parse('?'); # Nil
Run Code Online (Sandbox Code Playgroud)

rai*_*iph 7

«»“左右字边界” DOC

[ «]匹配在左边或字符串的开头有一个非单词字符,在右边有一个单词字符的位置。

?不是文字字符。因此,边界声明一词失败了。

什么是和不是“文字字符”

\w字符类而言,“单词” 在P6中的定义与在P5中的定义相同(当使用P5 \aregex修饰符时),即字母,一些十进制数字或下划线:

  • Unicode通用类别以开头的字符L,代表Letter1个

  • Unicode通用类别为的字符Nd,代表Number,十进制2

  • _下划线。

“ alpha'Nd under”

@ p6steve ++在下面的注释中提供了一个可爱的助记符,该助记符将“ under”添加到通常的“ alphanum”中。

但是“ num”有点错误,因为它不是任何数字,而只是一些小数位,特别是与Unicode General Category Nd(由P6 regex匹配/<:Nd>/)匹配的字符。2

这自然会导致发音为“ alpha'nd under”的alphaNdunder(alpha Nd under)。

脚注

1个字母由P6正则表达式匹配/<:L>/。这包括JJ注意的Ll(字母,小写)(与匹配/<:Ll>/),还包括Lu(字母,大写)和Lo(字母,其他),后者包括?JJ也提到的字符。还有其他字母子类别。

NdP6 regex匹配具有Unicode常规类别的2个十进制数字/<:Nd>/。这涵盖了十进制数字,可以将它们链接在一起以产生任意大的十进制数字,其中每个数字位置加10的幂。它不包括具有“印刷上下文”的十进制数字(我的措辞遵循Wikipedia的示例)。例如,1英语十进制数字表示1;它包括在内。但是¹?排除在外,因为它们具有“印刷上下文”。对于十亿+人本民族语言使用?来表示一个?包含Nd十进制数字的类别。但是,对于另外十亿+人,其母语使用一种语言?,但该语言被排除在类别之外(而在字母类别中)。类似地(Devanagari 6)也包括在类别中,但(Han number 6)被排除在外。NdL?Nd?


jjm*_*elo 4

我总是以“雷夫是对的”开始我的回答。但他是。另外,举一个例子来说明为什么会这样:

\n\n
for <y \xe2\x9c\x93 \xe2\x85\xa2> {\n    say $_.uniprops;\n    say m/<|w>/;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

循环的第二行与单词边界锚进行比较;只有第一个字符(可以是实际单词的一部分)与该锚点匹配。它还在循环的第一行打印 Unicode 属性;在第一种情况下,它是一个字母,( Ll),在其他两种情况下不是。您可以Ll在语法中使用任何字符作为单词的一部分,但只有具有该 Unicode 属性的字符才能真正形成单词。

\n\n
grammar G {\n\n\n  proto rule TOP { * }\n\n  rule TOP:sym<y>  { \xc2\xab<.sym>\xc2\xbb }\n  rule TOP:sym<\xe3\x82\x89>  { \xc2\xab<.sym>\xc2\xbb }\n\n}\n\nsay G.parse(\'y\'); # \xef\xbd\xa2y\xef\xbd\xa3\nsay G.parse(\'\xe3\x82\x89\'); # This is a hiragana letter, so it works.\n
Run Code Online (Sandbox Code Playgroud)\n