T E E+ E+4 E+F E+T E En L
15 15 1515-4 15-4 15-4 19 19 19
T→ T*F E→ T
F → digit T→ F E→ E+T
L→ En
32
总结: 总结 采用自底向上分析,例如LR分析,首先给出 S-属性定义,然后,把S-属性定义变成可执行 的代码段,这就构成了翻译程序.象一座建筑, 语法分析是构架,归约处有一个"挂钩",语 义分析和翻译的代码段(语义子程序)就挂在 这个钩子上.这样,随着语法分析的进行,归 约前调用相应的语义子程序,完成相应的翻译任 务.
state
val ... A .a
top
... A
定义式 A .a:=f(X.x, Y.y, Z.z)(抽象)变成 val[ntop]:=f(val[top-2],val[top-1],val[top]) (具体可执行代码). 在执行代码段之前执行: ntop:=top-r+1 执行代码段后执行: top:=ntop; r是句柄的长度.
25
例5.9
表达式 a+a*(b-c)+(b-c)*d 的dag
+ + * a b – c
26
* d
5.3 S-属性定义及其自底向上的计算 在分析栈中使用一个附加的域来存放综 合属 性值. 下图为一个带有综合属性值域的分析栈:
top
state ... X Y Z ...
val ... X.x Y.y Z.z ...
3
要求:随着语法分析,分析树逐步被构造出 来,每构造一个子树,和这棵子树结点相联系 的文法符号的属性值都可以根据已有结点属性 值的计算出来的.一个重要的属性定义类称作 "L—属性"定义,满足上述要求.