代码之家  ›  专栏  ›  技术社区  ›  David542

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

  •  0
  • David542  · 技术社区  · 1 年前

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

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

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

    1 回复  |  直到 1 年前
        1
  •  3
  •   ShadowRanger    1 年前

    因为大多数语言都支持数字,特别是指数表示法中的浮点数、复数和十六进制。如果一个变量可以以数字开头,为什么不能呢 全部的 数字?如果是这样,你如何将其与实际数字区分开来。更糟糕的是, 9e9 是一个完全合法的数字,甚至不是全数字,所以你不能说“它必须至少有一个非数字字符”,因为合法数字也可以有非数字字符。

    然后,我们添加了允许在数字文字内(但不在末尾)任意插入下划线的语言,以帮助提高可读性(例如Python允许 1_000_000 代表与 1000000 但使三位数分组更容易),或者有后缀来调整类型(例如。 5U / 123L 在C/C++中, 7u8 / 999i16 /等等。在Rust中),你最终会处于一个允许变量名以数字开头的位置,这意味着你需要对变量名施加各种其他更任意的限制,以避免与数字文字冲突。

    基本上,说“它必须以非数字字符开头”比随意说要容易得多 9e9 0xf 不是合法的变量名,但是 9ee9 0xg 是。