标记_123jh
和123jh
导致大多数词法分析器不包含以数字开头的标识符之间的区别是什么?我猜一个原因可能是纯数字标记可能会造成混淆,因此完全消除前导数字比允许类似以下内容更容易:
^(\d+[A-z_][A-z_0-9]*|[_A-z][A-z0-9]*)$
。
或者还有其他原因(也许词法分析器无法保证以这种方式进行单字符前瞻)?
标记_123jh
和123jh
导致大多数词法分析器不包含以数字开头的标识符之间的区别是什么?我猜一个原因可能是纯数字标记可能会造成混淆,因此完全消除前导数字比允许类似以下内容更容易:
^(\d+[A-z_][A-z_0-9]*|[_A-z][A-z0-9]*)$
。
或者还有其他原因(也许词法分析器无法保证以这种方式进行单字符前瞻)?
因为大多数语言都支持数字,特别是指数表示法中的浮点数、复数和十六进制数。如果变量可以以数字开头,为什么它不能全部是数字?如果是这样,你如何将它与实际数字区分开来?更糟糕的是,
9e9
是一个完全合法的数字,甚至不是全部是数字,所以你不能说“它必须至少有一个非数字字符”,因为合法的数字也可以有非数字字符。然后,我们添加允许在数字文字内(但不能在末尾)任意插入下划线的语言以提高可读性(例如,Python 允许
1_000_000
表示相同的东西,1000000
但使三位数字分组更容易),或使用后缀来调整类型(例如C/C++ 中的5U
/ ,Rust 中的/ / 等)最终允许变量名以数字开头意味着您需要对变量名施加各种其他、更任意的限制,以避免与数字文字冲突。123L
7u8
999i16
9e9
基本上,说“它必须以非数字字符开头”要比任意说和0xf
不是合法变量名但9ee9
和是合法的变量名容易得多0xg
。