Dart自定义 SDK 全记录之1:实现中文变量名支持

0 阅读2分钟

Dart自定义 SDK 全记录之1:实现中文变量名支持

Dart 默认并不允许非 ASCII 字符作为标识符,例如:

var 名字 = "中文变量"; // ❌ 报错:非法字符

本文记录了我在 Dart SDK 中如何通过修改源码,成功让 Dart 支持中文字符组成的变量名,如 搜索引擎用户名称,并解决了 VS Code 报红、Scanner 拆词等技术难点。


一. 修改 Scanner 实现多汉字识别

在 Dart 编译器源码中,标识符的解析核心在于:

  • tokenizeKeywordOrIdentifier
  • tokenizeIdentifier
  • isIdentifierChar / isIdentifierStart

✅ 修改 isIdentifierChar

bool isIdentifierChar(int c, bool allowDollar) {
  return (c >= 0x61 && c <= 0x7A) || // a-z
         (c >= 0x41 && c <= 0x5A) || // A-Z
         (c >= 0x30 && c <= 0x39) || // 0-9
         c == 0x5F ||                // _
         (allowDollar && c == 0x24) || // $
         (c >= 0x4E00 && c <= 0x9FFF); // ✅ 汉字
}

✅ 修改 tokenizeIdentifier

int tokenizeIdentifier(int next, int start, bool allowDollar) {
  while (isIdentifierChar(next, allowDollar)) {
    next = advance();
  }
  appendSubstringToken(TokenType.IDENTIFIER, start, false);
  return next;
}

✅ 避免 KeywordState 报 RangeError

原始代码调用了:

state = state.next(next);

这对非 ASCII(如汉字)会触发 RangeError。

✅ 修改为:

if (next <= 127) {
  state = state.next(next);
} else {
  return tokenizeIdentifier(next, start, allowDollar);
}

二. IDE 中变量名依然报红的原因

虽然修改 SDK 后可以正常编译运行,但 VS Code / Android Studio 依然在汉字变量名下画红线。

❗原因:

  • 编辑器使用的是 analyzer 插件,内部使用独立的 scanner/parser
  • 它并没有使用我们构建的自定义 Dart SDK

✅ 解决方法:

方法 1:继续修改 pkg/analyzer
  • 修改 IdentifierValidator 的相关判断正则
  • 修改 scanner.dart 识别逻辑(同样加入汉字)
  • 重新编译 analyzer 并在 editor 中加载
方法 2:禁用报错提示(临时方案)
analyzer:
  errors:
    invalid_language_version_override: ignore

三. 结果演示

void main() {
  var 人 = "李雷";
  print(人);
}

✅ 控制台输出正常:李雷
❌ VS Code 报红(若未改 analyzer)


截屏vscode.png

截屏AS.png

四. 总结

实现 Dart 支持中文变量名需:

  • 修改 scanner 模块的 identifier 判断逻辑
  • 避免 KeywordState 对汉字造成崩溃
  • 修改 tokenizeIdentifier 循环
  • 可选:同步修改 analyzer 实现编辑器支持

虽然不是 Dart 官方支持的特性,但对我实现「全中文编程语言」有重要意义。

👉 如需完整补丁文件,可私信获取。