词法分析器中的二进制和一元减号运算符



因此,我正在使用flex对TOY编程语言进行词法分析。我目前卡在以下点。

负号:正如我们所知,减号可以有两种含义,通过将它们定义为二进制或一元运算符(我也知道你可以放弃两种含义,只说-2和0-2是一样的)。首先,到目前为止,我只学习过词法分析器,对解析器一无所知。那么,我需要注意区分这两个减号吗,变成有时分析器会打印-2作为一个数字文字有时作为一个运算符,而2作为一个数字文字?或者在解析过程中可以对两个字面量进行这种俱乐部化吗?如果是,那么我应该只定义正数和-作为一元操作符吗?

如果您尝试将带符号整数作为单个令牌分析,事情会变得非常复杂。例如,您必须避免将x-1分析为{x,-1},因为-是一个运算符。

如果你分析有符号整数作为两个令牌——一个符号和一个整数——那么你将得到一个合理的解析。只有两个问题:

  1. 你真的不想在运行时计算-1。它是一个常量,应该在编译时对其求值。但这和其他常数表达式没什么不同。理想情况下,(1+1)应该在编译时折叠为2。常数折叠是一个相对容易实现的优化,尽管你应该先让事情正常工作。

  2. 在二进制补码中,如果整数部分与符号分开,最小的负整数(如果使用带符号的32位整数,则为-2147483648)是整数溢出。2147483648。有许多方法可以处理这个问题,其中大多数都会导致某种解析问题。例如,针对32位int的C编译器会将比int更宽的类型分配给2147483648,这意味着-2147483647和-2147483648是出乎意料的不同类型。(这就是为什么INT_MIN通常是#define(-2147483647 - 1)。)另一方面,如果您只是假设编译器运行在一个2补数的环境中,并且周围环绕整数,那么您将得到-2147483648的正确值。但是对于2147483648,您将得到相同的值,它应该被标记为诊断。对于一个使用玩具语言的学生项目,这些怪癖可能是无害的,但您应该尝试将它们记录下来。

相关内容

  • 没有找到相关文章

最新更新