上下文无关文法区分整数和浮点常量
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 + z
和 3 + z
并没有真正简化任何事情。 (如果 y
是浮点文字而不是标识符,则同样的逻辑成立。)
现在考虑 3.0 + 5
。在字节码编译之前,存在单独的代码来用 8.0
代替 (3.0).__add__(5)
来替换它,因为 1) 它很容易做到,并且 2) 它显然比在 运行 处调用函数要好时间。然而,这个 still 不是由解析器完成的。这是由 运行 在树上查找类似 NUMBER + NUMBER
的优化器完成的。一旦找到,优化器就可以确定 NUMBER
是整数还是浮点数,并生成适当的总和以包含在代码中。这 比必须处理 4 个不同位的解析树 INT + FLOAT
、FLOAT + INT
、FLOAT + FLOAT
和 INT + INT
更简单。
我正在编写 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 + z
和 3 + z
并没有真正简化任何事情。 (如果 y
是浮点文字而不是标识符,则同样的逻辑成立。)
现在考虑 3.0 + 5
。在字节码编译之前,存在单独的代码来用 8.0
代替 (3.0).__add__(5)
来替换它,因为 1) 它很容易做到,并且 2) 它显然比在 运行 处调用函数要好时间。然而,这个 still 不是由解析器完成的。这是由 运行 在树上查找类似 NUMBER + NUMBER
的优化器完成的。一旦找到,优化器就可以确定 NUMBER
是整数还是浮点数,并生成适当的总和以包含在代码中。这 比必须处理 4 个不同位的解析树 INT + FLOAT
、FLOAT + INT
、FLOAT + FLOAT
和 INT + INT
更简单。