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

2024-06-06 16:30:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个LR(1)解析器,我的测试语法以C语言为基础。我看过C和Python的语法:

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

C似乎对整数和浮点常量使用符号常量,而Python使用数字。在

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

既然在lexer解析后我们已经知道它是什么类型的数字,为什么要将它们合并成一个通用的“number”,然后再尝试找出它是哪一个呢?在


Tags: https解析器htmlwww语法符号数字基础
1条回答
网友
1楼 · 发布于 2024-06-06 16:30:31

早期处理一些特殊情况并不能使事情变得简单,因为以后您仍然需要在不同的地方使用相同的代码。例如,考虑代码y + z。Python不知道这是什么,除了在运行时调用y.__add__(z)。生成的代码不会消失。同样的代码可以使用3 + x,并且很容易生成{}。所以在解析过程中区分y + z和{}并没有真正简化任何事情。(如果y是浮点数而不是标识符,则同样的逻辑成立。)

现在考虑一下3.0 + 5。在字节码编译之前,存在单独的代码将其替换为8.0,而不是{},因为1)这很简单,2)明显比在运行时调用函数好。然而,这个仍然不是由解析器完成的。这是由一个优化器来完成的,它在树上运行,寻找NUMBER + NUMBER。一旦找到,优化器就可以确定NUMBER是整型还是浮点型,并生成适当的和以包含在代码中。这比处理解析树INT + FLOATFLOAT + INTFLOAT + FLOAT和{}的4个不同位要简单得多。在

相关问题 更多 >