上下文无关文法区分整数和浮点常量

Context Free Grammar Differentiate Integer and Floating Point Constants

我正在编写 LR(1) 解析器,并且我的测试语法一直基于 C 语言。我看过 C 和 Python:

的语法

https://www.lysator.liu.se/c/ANSI-C-grammar-y.html https://docs.python.org/3/reference/grammar.html

C 似乎对整数和浮点常量使用符号 CONSTANT,Python 使用 NUMBER。

我想知道的是,为什么不将它们分成单独的符号,例如 INT 和 FLOAT,以便以后可以将它们放入抽象语法树中的单独节点中?

既然我们已经知道词法分析器解析后它是什么类型的数字,为什么将它们合并成一个泛型'NUMBER'然后再尝试找出它是哪一个?

能够更早地处理一些 特殊情况并不能简化事情,因为稍后您仍然需要在不同的地方使用相同的代码。例如,考虑代码 y + z。 Python 不知道那是什么,除了在 运行 时它会调用 y.__add__(z)。生成它的代码不会消失。相同的代码可以采用 3 + x 并同样轻松地生成 (3).__add__(z)。因此,在解析过程中区分 y + z3 + z 并没有真正简化任何事情。 (如果 y 是浮点文字而不是标识符,则同样的逻辑成立。)

现在考虑 3.0 + 5。在字节码编译之前,存在单独的代码来用 8.0 代替 (3.0).__add__(5) 来替换它,因为 1) 它很容易做到,并且 2) 它显然比在 运行 处调用函数要好时间。然而,这个 still 不是由解析器完成的。这是由 运行 在树上查找类似 NUMBER + NUMBER 的优化器完成的。一旦找到,优化器就可以确定 NUMBER 是整数还是浮点数,并生成适当的总和以包含在代码中。这 比必须处理 4 个不同位的解析树 INT + FLOATFLOAT + INTFLOAT + FLOATINT + INT 更简单