(解析器) 在使用 Unicode/UTF-8 的语言中,变量名的标记化不正确
接手这一问题,以跟踪这方面的总体进程。 原件如下。
预设 :
- #2759 更新所有规范,使其符合UTF8(10.4)
- 添加`Grammar#unicodeRegex',允许每语言的UTF8 regex(11.x)
- 性能测试 -- -- 在我的初步测试中,`/u ' 似乎慢得多。 (10.4)
单个语言如果不触发性能回归,现在可以添加支持:
[]JavaScript
- [] TypeScript(我猜?
- [ 需要审查所有取决于“ecmascript.js”的语文(即JavaScript型的IDENT RE现在在那里)
- 爪哇
- [C]
- XML #3256
- C++
- [R]
- 鲁比
- [x]Python
- 走
- [ ]RustY*
- [克特林]
- [] C#
- 斯威夫特
也许有一天:
- 将分析器翻转为默认使用`u ' (10.4)[需要解决性能减缓]
- [ ]确保这一变化不会导致全面倒退(10.4) [ ] 考虑 " IDENT-RE " 和 " UNDERSCORE-IDENT-RE " ,尽管我认为它们不应改变。
在此之前,我们需要开始以u ' 模式建造雷克克斯。 在此之后,这应当只是改变有关语言的适当特征。 实际上,第二,虽然我们确实有IDENT RE',但我并不确信它应该改变(因为这是每个语言的选择).也许是一个`IDENT RE UTF8'?
在2或3种语言中应该加入一些加分测试(或者如果我们添加了新模式,也许单位测试),以确保行为如所预期.
-- -- . . .
- 原件
** 说明问题** 大多数现代语言使用Unicode spec来决定什么构成正可变名称. 因此,"绞架填充"字符,即使看起来是"白空",也是有效的可变名称. 变量名`Thisᅠisᅠaᅠaᅠvariableᅠname'是一个有效的变量,尽管hl.js将第一个单词或以其他单词相区分。 在强调意识到这一点的系统时,像克罗姆的dev工具一样,它被正确解析. 第一个片段使用绞架填充器,而第二个片段使用白空(这就是它抛出一个错误的原因): [image] (https://user-images.githubusercontent.com/24513691/963673-a9f47700-0f16-11eb-89bc-f763692fde46.png) (中文(简体) ).
** 哪一种语言似乎有问题? ** 理论上可变名称遵循Unicode spec的每一种语言. 我只测试过标题中提到的那些语言, 但是把每种语言都标注起来也许更有意义, 仿佛它是遵循unicode spec的一种语言, 因为这应该是默认的。
** 你是在使用高光'还是高光Auto'? **
不详
** 复制样本代码** 不详
** 预期行为** hl.js应为使用它的语言使用ID Start和ID Continue,或至少作为默认使用. 与之相匹配的正则Gex相当大,但在支持"u"旗(现代JavaScript)的正则Gex引擎中可以显著缩短. {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? const matchIDStart = char = /\p{ID Start}/u.test(chart) ; (中文(简体) ). 相匹配的ID 继续 = char = QQ . . . . . . .
内容来源: highlightjs/highlight.js