编译器 / 解释器无法区分「数字」和「变量名」,语法歧义
举个例子:
// 假设允许数字开头变量
let 123abc = 10;
console.log(123abc);
解析器读到 123abc 时,第一反应:
123 是数字字面量,后面跟 abc,会识别成 123 * abc,直接报语法错误。
再看表达式歧义:
let 5a = 20;
5a + 3
引擎分不清:是变量 5a,还是 5 * a。
词法分析规则(根本逻辑)
编程语言词法扫描分两类 token:
- 数字常量:以
0-9开头,后续只能是数字、小数点、指数符号; - 标识符(变量 / 函数名):必须以字母、下划线
_、美元符$开头,后面才能跟数字。
规则强制分割两类 token,消除歧义,简化语法解析器设计。
额外历史与可读性设计原因
- 数学习惯 数学里数字永远写在变量前面:
3x代表 3 × x,语言遵循人类阅读习惯; - 可读性约束
user99一眼看懂:用户编号 99;99user视觉混乱,不利于代码阅读; - 正则匹配简化 解析器匹配标识符正则:
^[a-zA-Z_$][a-zA-Z0-9_$]*只要首字符限定非数字,正则不用复杂回溯,提升编译速度。




