令牌
_123jh
和 123jh
之间有什么区别,使得大多数词法分析器不包含以数字开头的标识符?我想一个原因可能是纯数字标记可能会令人困惑,因此完全消除前导数字比允许类似的内容更容易:
^(\d+[A-z_][A-z_0-9]*|[_A-z][A-z0-9]*)$
。
或者还有其他原因(也许词法分析器无法保证使用这种方式进行单字符前瞻)?
因为大多数语言都支持数字,特别是指数表示法的浮点数。如果变量可以以数字开头,为什么不能是所有数字?如果是这样,你如何区分它和实际数字。更糟糕的是,
9e9
是一个完全合法的数字,甚至不全是数字,所以你不能说“它必须至少有一个非数字字符”,因为合法数字也可以有非数字字符。
然后我们添加允许在数字文字内(但不是末尾)任意插入下划线的语言,以提高可读性(例如,Python 允许
1_000_000
表示与 1000000
相同的事物,但将三位数字分组更容易),并且您最终会陷入这样的境地:允许变量名称以数字开头意味着您需要对变量名称施加各种其他的、更加任意的限制以避免与数字文字冲突。
基本上,说“它必须以非数字字符开头”比武断地说
9e9
不是合法的变量名要容易得多,但 9ee9
是。