我正在编写一个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”,然后再尝试找出它是哪一个呢?在
早期处理一些特殊情况并不能使事情变得简单,因为以后您仍然需要在不同的地方使用相同的代码。例如,考虑代码}。所以在解析过程中区分}并没有真正简化任何事情。(如果
y + z
。Python不知道这是什么,除了在运行时调用y.__add__(z)
。生成的代码不会消失。同样的代码可以使用3 + x
,并且很容易生成{y + z
和{y
是浮点数而不是标识符,则同样的逻辑成立。)现在考虑一下},因为1)这很简单,2)明显比在运行时调用函数好。然而,这个仍然不是由解析器完成的。这是由一个优化器来完成的,它在树上运行,寻找}的4个不同位要简单得多。在
3.0 + 5
。在字节码编译之前,存在单独的代码将其替换为8.0
,而不是{NUMBER + NUMBER
。一旦找到,优化器就可以确定NUMBER
是整型还是浮点型,并生成适当的和以包含在代码中。这比处理解析树INT + FLOAT
、FLOAT + INT
、FLOAT + FLOAT
和{相关问题 更多 >
编程相关推荐