1.S-属性文法
含义:只包含综合属性的文法(只计算左部符号的属性)
2.L-属性文法
含义:既可以包含综合属性,也可以包含继承属性,但要求产生式右边某文法符号的继承属性的计算只取决于该符号左边符号的属性
3.基于S-属性文法的语义计算(自底向上)
4.基于L-属性文法的语义计算
采用自顶向下深度优先从左至右遍历分析数的方法,计算出所有的属性值
假设语法树已经建立且树中已带有开始符号的继承属性和终结符的综合属性
算法如下:
while(含有未被计算的属性)
{
VisitNode(S); //S是开始符号
procedure VistiNode( N : node);
begin:
{
if(N为非终结符) //假设N -> X1,X2...Xm*
{
for(i := 1 to m)
{
if(Xi∈Vn) //Xi为非终结符
{
begin:
计算Xi所有能够计算的继承属性
VisitNode(Xi);
end;
}
}
}
else end;
例子:
首先区分继承属性,综合属性以及副作用:
红线标注为继承属性,铅笔标注为副作用,其他未标注的是综合属性
5.基于翻译模式的语义计算
允许由{ }括起来的语义动作出现在产生式右端的任意位置,以此显式的表达属性计算的次序
(1)S-翻译模式:是一种仅涉及综合属性的情形,通常将语义动作放在相应产生式右端的末尾
如图,仅涉及综合属性:
(2)L-翻译模式:既可以包含继承属性,也可以包含综合属性,但是要满足求继承属性的计算放在该符号之前,产生式左部综合属性的计算放在产生式的尾部
6.生成抽象语法树(AST)
对输入串按照翻译模式进行语义计算
(1)若该SDT的基础文法是二义性的,则构造LR分析表,进行自底向上的句型分析
(2)基础文法是无二义性的,可以采用LR分析,也可以采用遍历语法分析树进行计算
抽象语法树中每一个子树的根节点都对应一种动作或者运算,它的所有子节点对应该动作或者运算的参数或者运算数
例题:
构造AST的技巧
7.逆波兰表达式
(1)表达式构造AST,后根遍历
(2)按照相应的翻译模式进行语义计算
(3)将中缀表达式转换为后缀的算法
8.四元式序列
(运算符,运算分量,运算分量,结果)
其中,运算分量和结果可以是变量,常量或临时变量