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)
四. 总结
实现 Dart 支持中文变量名需:
- 修改
scanner
模块的 identifier 判断逻辑 - 避免
KeywordState
对汉字造成崩溃 - 修改
tokenizeIdentifier
循环 - 可选:同步修改 analyzer 实现编辑器支持
虽然不是 Dart 官方支持的特性,但对我实现「全中文编程语言」有重要意义。
👉 如需完整补丁文件,可私信获取。