识别常量表达式的属性文法

An attribute grammar to identify constant expression

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

x = 1 * 5;

y = x + 2;

我们想识别 x 和 y 被分配了常量值 5 和 7,并且我们想识别 y 为常量,只要 x 的值用于赋值给 y 来自对 x 的唯一常量赋值。

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

这不是您真正想要在解析期间执行的操作。

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

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