繁体   English   中英

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

[英]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)显然比在运行时调用函数好。 但是,解析器仍然无法做到这一点。 这是由运行在树上的优化器完成的,以查找NUMBER + NUMBER类的东西。 找到后,优化器可以确定NUMBER是int还是float,并产生适当的总和以包含在代码中。 这比必须处理解析树INT + FLOATFLOAT + INTFLOAT + FLOATINT + INT 4个不同位要简单

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM