我正在编写一个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'然后试着找出它又是哪一个?
答案 0 :(得分:0)
能够更早地处理某些特殊情况并不会简化事情,因为您以后仍需要在不同的地方使用相同的代码。例如,考虑代码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)它明显优于在运行时调用函数时间。但是,此仍然不是由解析器完成的。这是由在树上运行的优化器完成的,可以查找NUMBER + NUMBER
之类的内容。找到后,优化器可以确定NUMBER
是否为整数或浮点数,并生成适当的总和以包含在代码中。这比更简单比必须处理4个不同位的解析树INT + FLOAT
,FLOAT + INT
,FLOAT + FLOAT
和INT + INT
。