第七章语义分析和中间代码生成.ppt
《第七章语义分析和中间代码生成.ppt》由会员分享,可在线阅读,更多相关《第七章语义分析和中间代码生成.ppt(66页珍藏版)》请在三一办公上搜索。
1、第七章 语义分析和中间代码的产生,紧接在词法分析和语法分析之后,编译程序要做的工作是进行静态语义检查和翻译。静态语义检查通常包括:类型检查。操作数和操作符类型一致控制流检查。控制转移到合理的位置一致性检查。变量只能被声明一次,同一case语句的标号不能相同,枚举类型的元素不能相同相关名字检查。同一名字必须出现两次以上,翻译为中间语言的好处,(1)便于进行与机器无关的代码优化;(2)使编译程序改变目标机更容易;易于编译器的移植(3)使编译程序的结构在逻辑上更为简单明确,以中间语言为界面,编译前端和后端的接口更清晰。,主要内容,中间语言的形式后缀式,图表方法,三元式编译过程中不同语言的翻译或处理方
2、法说明语句的翻译赋值语句的翻译布尔表达式的翻译控制语句的翻译,7.1中间语言,中间语言的形式:逆波兰表示:后缀式图表示法:DAG 和AST三地址代码:四元式、三元式、间接三元式,7.1.1 后缀式,后缀式表示法又称逆波兰表示法。这种方法是,把运算量(操作数)写在前面,把算符写在后面(后缀)。一个表达式的后缀式可以如下定义:(1)如果E是一个变量或常量,则E的后缀式是E自身。(2)如果E是E1 op E2形式的表达式,这里op是任何二元操作符,则E的后缀式为 E1 E2op,这里E1 和E2分别为E1和E2的后缀式。(3)如果E是(E1)形式的表达式,则E1的后缀式就是E的后缀式。,后缀式的优点
3、,便于计算机处理,因为在后缀式中,表达式的求值顺序与运算符出现的顺序一致,这样只要用一个栈就可以实现表达式的求值。实现过程:自左向右扫描后缀表达式;遇到运算对象入栈,遇到N元运算符,就从栈顶取出N个运算对象进行计算,再将结果入栈;当全部后缀表达式扫描结束,则栈顶的值即为表达式结果。,后缀式特点:无括号运算对象的顺序与中缀式一致根据操作符(运算符)的优先级和结合性进行相关的处理例:5+4*65 4 6*+,7.1.2 图表示法,图表示法包括DAG与AST(抽象语法树)。有向无环图(Directed Acyclic Graph,简称 DAG).与抽象语法树一样,对于表达式中的每个子表达式,DAG图
4、中都有一个结点。一个内部结点代表一个操作符,它的孩子代表操作数。两者不同的是,在DAG图中代表公共子表达式的结点具有多个父结点,而在一棵抽象语法树中公共子表达式被表示为重复的子树。例:,5+4*6的DAG图,5,+,6,4,*,5+4*6+4*6 的DAG图,5,+,6,4,*,+,5+4*6+4*6 的AST图,后缀式与抽象语法树的关系,后缀式是抽象语法树的线性表示:每个结点都是在它的所有子节点之后立即出现的。通过对抽象语法树的不同形式的遍历可以形成不同形式的缀式表达式前序遍历:前缀式中序遍历:中缀式后序遍历:后缀式,产生赋值语句抽象语法树的属性文法,S.nptr:=mknode(assig
5、n,mkleaf(id,id.place),E.nptr)E.nptr:=mknode(+,E1.nptr,E2.nptr)E.nptr:=mknode(*,E1.nptr,E2.nptr)mkleaf(id,id.place),Sid:=EEE1+E2EE1*E2 E-id,产生式,语义规则,S.nptr:=mknode(assign,mkleaf(id,id.place),E.nptr)E.nptr:=mknode(+,E1.nptr,E2.nptr)E.nptr:=mknode(*,E1.nptr,E2.nptr)E.nptr:=mkleaf(id,id.place)mkleaf(id,
6、id.place),Sid:=EEE1+E2EE1*E2E-id,a:=b+c,a,b,c,+,:=,抽象语法树的存储表示,二叉树的形式:算术运算通常都是二元运算树中每个节点包含三个域:数组的形式表示:每一个数组元素形式如下:,节点类型|操作数1|操作数2,节点类型|操作数1|操作数2,赋值语句:a:=b*-c+b*-c后缀式:a b c uminus*b c uminus*+assign,assign,+,*,uminus,id a,id c,id b,id b,id c,unimus 1,*0 2,id b,id c,unimus 5,*4 6,+3 7,id a,assign 9 8,.
7、,7.1.3 三地址代码,三地址代码是由下面一般形式的语句构成的序列:X:=y op z 其中,x、y、z为名字、常数或编译时产生的临时变量(存放中间结果,对应于语法树的内部节点);op代表运算符号如定点运算符、浮点运算符、逻辑运算符等。每个语句的右边只能有一个运算符。每条语句通常包含三个地址:两个操作数地址,一个操作结果地址,三地址码示例,t1:-c t2:b*t1 t3:-c t4:b*t3 t5:t2+t4 a:t5,a:=b*-c+b*-c,三地址码示例(2),t1:-c t2:b*t1 t5:t2+t2 a:=t5,a:=b*-c+b*-c,三地址代码的具体表示,1四元式:op,ar
8、g1,arg2,result,t1:-c t2:b*t1 t3:-c t4:b*t3 t5:t2+t4 a:t5,a:=b*(-c)+b*(-c),三地址代码的具体表示,2.三元式:op,arg1,arg2,t1:-c t2:b*t1 t3:-c t4:b*t3 t5:t2+t4 a:t5,a:=b*(-c)+b*(-c),三地址代码的具体表示,3.间接三元式:间接码表+三元式表目的:便于优化处理,t1:-ct2:b*t1t3:-c t4:b*t3t5:t2+t4a:t5,a:=b*(-c)+b*(-c),t1:a+bt2:t1*cX:t2t3:a+bt4:dt3Y:t4,X:=(a+b)*c
9、 Y:=d(a+b),语义分析中各种语句的处理,说明语句的翻译赋值语句的翻译布尔表达式的翻译控制语句的翻译,7.2 说明语句的翻译,说明语句的处理方式:不生成可执行代码,只涉及符号表的操作。说明语句的处理:对每个局部名字,在符号表中建立相应的表项,填写有关的信息 如类型、嵌套深度、相对地址等。相对地址:相对静态数据区基址或活动记录中局部数据区基址的一个偏移值。,因为每进入一次过程需分配一次内存,因此在处理过程内的说明语句时,要分配每个标识符的相对地址。设变量offset用来记录相对地址,每次进入一个过程,先将offset置为0。每次遇到一个新名字,则把名字同offset的当前值一起录入符号表,
10、然后offset的值增加,其增加的值由该名字的数据类型所决定,称为数据对象的宽度,用属性width表示。假设integer型对象宽度为4,real型对象宽度为8,则下表为过程中说明语句的翻译方案。,过程中的说明语句的翻译,PD offset:0 DD;D Did:T enter(id.name,T.type,offset);offset:=offsetT.width Tinteger T.type:=integer;T.width:=4 Treal T.type:real;T.width:8 Tarraynumof T1 T.type:array(num.val,T1.type);T.widt
11、h:num.val*T1.width T T1 T.type:pointer(T1type);T.width:=4,7.3 赋值语句的翻译,在本节中赋值语句中的表达式的类型可以是整型、实型、数组和记录。作为翻译赋值语句为三地址代码的一部分,我们将主要讨论:简单赋值语句的翻译,7.3.1 简单算术表达式及赋值语句的翻译,所讨论的简单赋值语句不包含对数组元素、记录元素的引用,仅包含对简单变量的算术表达式的引用。并且假定赋值语句中所有变量均为同一类型,不必考虑类型转换的问题。简单赋值语句的文法Gs如下:Sid:=EE E+T|TT T*F|FF(E)|id分析文法GS,可以看到文法中包含两类不同语义
12、操作的产生式,一类含有运算符操作,一类仅含有传值操作。因此,要使语义分析后能产生三地址语句中间代码,应该对这两类不同的产生式进行不同的处理,含有运算符操作的产生式的语义动作应该产生相应的三地址语句,而仅含有传值操作的产生式则只进行传值的语义处理。根据这种思想,可以构造出各产生式的语义子程序如下表所示。,产生赋值语句三地址代码的翻译模式 Sid:=E p:=lookup(id.name);if pnil then emit(p:=E.place)else error EE1+E2E.place=newtemp;emit(E.place:=E1.place+E2.place)EE1*E2E.pla
13、ce=newtemp;emit(E.place:=E1.place*E2.place)E-E E.place:=newtemp;emit(E.place:=uminusE1.placeE(E1)E.place:=E1.place Eid p:=lookup(id.name);if pnil then E.place:=p else error,有关说明:(1)语义变量Eplace:表示存放E值的变量名在符号表的位置或一整数码(若此变量是一个临时变量);(2)语义变量idname:表示单词id的名字;(3)语义过程newtemp:表示生成一个临时变量,每调用一次,生成一新的临时变量;(4)语义过
14、程lookup:表示检查idname是否出现在符号表中,若在则返回一指向该登记项的指针,否则返回nil:(5)语义过程emit:表示产生三地址语句并输出到文件上。,t1:-c t2:b*t1 t3:-c t4:b*t3 t5:t2+t4 a:t5,a:=b*-c+b*-c,产生赋值语句三地址代码的翻译模式 Sid:=E p:=lookup(id.name);if pnil then emit(p:=E.place)else error EE1+E2 E.place=newtemp;emit(E.place:=E1.place+E2.place)EE1*E2 E.place=newtemp;em
15、it(E.place:=E1.place*E2.place)E-E E.place:=newtemp;emit(E.place:=uminusE1.placeE(E1)E.place:=E1.place Eid p:=lookup(id.name);if pnil then E.place:=p else error,7.4 布尔表达式的翻译,布尔表达式:用布尔运算符号(and,or,not)作用到布尔变量或关系表达式上而组成。布尔表达式的作用:1.用作计算逻辑值2.用作控制流语句如if-then,if-then-else和 while-do等之中的条件表达式,一个布尔表达式的值的计算 方法一
16、:用数值表示真和假,从而对布尔表达式的求值,可以象对算术表达式的求值那样一步一步地来计算 方法二:优化的方法。A or B 解释成 if A then true else BA and B 解释成 if A then B else falsenot A 解释成 if A then false else true,7.4.1 数值表示法的翻译(用作计算逻辑值)用1表示真,0表示假来实现布尔表达式的翻译例如,布尔表达式:a or b and not c 翻译成三地址代码序列:100:t1:=not c 101:t2:=b and t1 102:t3:=a or t1,关系表达式:ab 等价于if
17、ab then 1 else 0 翻译成三地址代码序列:100:if ab goto l03 101:t:=0 102:goto l04 103:t:=1 104:,关于布尔表达式的数值表示法的翻译模式,EE1 or E2 E.place:=newtemp;emit(E.place:=E1.place or E2.place)EE1 and E2E.place:=newtemp;emit(E.place:=E1.placeand E2.place)Enot E1 E.place:=newtemp;emit(E.place:=not E1.place),Eid1 relop id2 注:relo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第七 语义 分析 中间 代码 生成

链接地址:https://www.31ppt.com/p-5935486.html