(解析器) 在使用 Unicode/UTF-8 的语言中,变量名的标记化不正确

作者: EmNudge创建于 2020年10月15日更新于 2026年8月12日
标签languageenhancementhelp welcomeparser

接手这一问题,以跟踪这方面的总体进程。 原件如下。

预设 :

  • #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