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