Compiler construction 识别常量表达式的属性语法

Compiler construction 识别常量表达式的属性语法,compiler-construction,grammar,formal-languages,Compiler Construction,Grammar,Formal Languages,假设我们想要识别 将常量赋值给变量的赋值。例如,对于这两项作业 x=1*5 y=x+2 我们想确认x和y被指定为常量值5和7,我们想确认y是常量,只要x的值在指定中被使用到 y来自于对x的唯一常量赋值 我们如何设计一个属性语法来识别CFG。在整个程序范围内,属性语法可以识别像这样的常量赋值。这不是您在解析过程中真正想要做的事情 您当然可以捕获一些可能的常量表达式,尽管您很难将4+x+-4转换为x(如果这在您尝试执行的范围内)。但您面临的真正问题是循环,因为如果在循环中使用变量,在解析整个循环之前

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

x=1*5

y=x+2

我们想确认x和y被指定为常量值5和7,我们想确认y是常量,只要x的值在指定中被使用到 y来自于对x的唯一常量赋值


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

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

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

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