为什么下面的代码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)
[
«]匹配在左边或字符串的开头有一个非单词字符,在右边有一个单词字符的位置。
?不是文字字符。因此,边界声明一词失败了。
就\w字符类而言,“单词” 在P6中的定义与在P5中的定义相同(当不使用P5 \aregex修饰符时),即字母,一些十进制数字或下划线:
Unicode通用类别以开头的字符L,代表Letter。1个
Unicode通用类别为的字符Nd,代表Number,十进制。2
_下划线。
@ 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?
我总是以“雷夫是对的”开始我的回答。但他是。另外,举一个例子来说明为什么会这样:
\n\nfor <y \xe2\x9c\x93 \xe2\x85\xa2> {\n say $_.uniprops;\n say m/<|w>/;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n循环的第二行与单词边界锚进行比较;只有第一个字符(可以是实际单词的一部分)与该锚点匹配。它还在循环的第一行打印 Unicode 属性;在第一种情况下,它是一个字母,( Ll),在其他两种情况下不是。您可以Ll在语法中使用任何字符作为单词的一部分,但只有具有该 Unicode 属性的字符才能真正形成单词。
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.\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |