一种识别常量表达式的属性语法

问题描述

假设我们要识别 将常量值赋给变量的赋值。例如,对于两个作业

x = 1 * 5;

y = x + 2;

我们想认识到 x 和 y 被分配了常数值 5 和 7,并且我们想将 y 识别为常数,只要在分配中使用的 x 值 y 来自对 x 的唯一、常量赋值。

我们如何设计属性语法来识别 CFG 的这一点。整个程序范围内的属性语法能否识别这样的常量赋值。

解决方法

这不是您在解析过程中真正想要做的事情。

您当然可以捕获一些可能的常量表达式,尽管您很难将 4 + x + -4 变成 x(如果这在您的范围内)正在尝试做)。但您面临的真正问题是循环,因为如果在循环内使用了一个变量,您不知道它是否会在下一次迭代之前被修改,直到您解析了整个循环。

如果您的语言没有 goto 或其他基本无法控制的循环结构,则可以想象,一旦到达循环体的末尾,您就可以在整个子树中向下合成属性。但这远非如此简单,因为解析树并没有像控制流图那样真正捕获控制流。因此,等待整个解析树可用然后构建控制流图会更容易,您可以从中跟踪定义-使用链。 (这些都是您应该能够在教科书中或在必要时在互联网上搜索的术语。)