为什么词法分析器通常将 var 定义为不能以数字开头?

问题描述 投票:0回答:1

令牌

_123jh
123jh
之间有什么区别,使得大多数词法分析器不包含以数字开头的标识符?我想一个原因可能是纯数字标记可能会令人困惑,因此完全消除前导数字比允许类似的内容更容易:

^(\d+[A-z_][A-z_0-9]*|[_A-z][A-z0-9]*)$

或者还有其他原因(也许词法分析器无法保证使用这种方式进行单字符前瞻)?

parsing compiler-construction lexer
1个回答
1
投票

因为大多数语言都支持数字,特别是指数表示法的浮点数。如果变量可以以数字开头,为什么不能是所有数字?如果是这样,你如何区分它和实际数字。更糟糕的是,

9e9
是一个完全合法的数字,甚至不全是数字,所以你不能说“它必须至少有一个非数字字符”,因为合法数字也可以有非数字字符。

然后我们添加允许在数字文字内(但不是末尾)任意插入下划线的语言,以提高可读性(例如,Python 允许

1_000_000
表示与
1000000
相同的事物,但将三位数字分组更容易),并且您最终会陷入这样的境地:允许变量名称以数字开头意味着您需要对变量名称施加各种其他的、更加任意的限制以避免与数字文字冲突。

基本上,说“它必须以非数字字符开头”比武断地说

9e9
不是合法的变量名要容易得多,但
9ee9
是。

© www.soinside.com 2019 - 2024. All rights reserved.