语义分析和中间代码生成讲稿.ppt
《语义分析和中间代码生成讲稿.ppt》由会员分享,可在线阅读,更多相关《语义分析和中间代码生成讲稿.ppt(84页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、关于语义分析和中间关于语义分析和中间代码生成代码生成第一页,讲稿共八十四页哦本章在编译程序中的地位本章在编译程序中的地位表格管理词法分析器语法分析器语义分析与中间代码产生优化器目标代码生成器源程序单词符号语法单位中间代码中间代码目标代码出错处理第二页,讲稿共八十四页哦6.1 概述 6.2 属性文法 6.3 几种常见的中间语言(*四元式)6.4 表达式及赋值语句的翻译 6.5 控制语句的翻译 6.6 数组元素的翻译 6.7 过程或函数调用语句的翻译*6.8 说明语句的翻译内容安排内容安排第三页,讲稿共八十四页哦6.1概概述述6.1.1 语义分析的概念 一个源程序经过词法分析、语法分析之后,表明该
2、源程序在书写上是正确的,并且符合程序语言所规定的语法。但是语法分析并未对程序内部的逻辑含义加以分析,因此编译程序接下来的工作是语义分析,即审查每个语法成分的静态语义。如果静态语义正确,则生成与该语言成分等效的中间代码,或者直接生成目标代码。第四页,讲稿共八十四页哦l直接生成目标代码 直接生成机器语言或汇编语言形式的目标代码的优点是编译时间短且无需中间代码到目标代码的翻译。l生成中间代码 生成中间代码的优点是使编译结构在逻辑上更为简单明确,特别是使目标代码的优化比较容易实现。第五页,讲稿共八十四页哦 语义分析时语义检查的分类:u动态语义检查动态语义检查 需要生成相应的目标代码,它是在运行时进行的
3、;需要生成相应的目标代码,它是在运行时进行的;例如:除零溢出错误。u静态语义检查静态语义检查 在编译时完成的,它涉及以下几个方面:在编译时完成的,它涉及以下几个方面:(1)类型检查 (2)控制流检查 (3)一致性检查第六页,讲稿共八十四页哦各种条件表达式的类型不是布尔类型;运算符的分量类型不相容;赋值语句左右类型不相容;形、实参类型不相容;函数说明和函数返回类型不相容;int x;int x;float f();float f();x=f();x=f();符合变量声明的语法、语义符合函数声明的语法、语义符合赋值语句的语法、不符合语义(1)类型检查第七页,讲稿共八十四页哦 (2)控制流检查 用以
4、保证控制语句有合法的转向点。如C语言中不允许goto语句转入case语句流;break语句需寻找包含它的最小switch、while或for语句方可找到转向点,否则出错。(3)一致性检查 如在相同作用域中标识符只能说明一次、case语句的标号不能相同、函数调用参数个数要相同等。第八页,讲稿共八十四页哦常见的语义错误声明和使用相关的语义错误标识符没有声明;重复声明;如何检查?每当遇到新声明的标识符,查符号表如果当前有效的所有标识符中有相同名字的如果当前有效的所有标识符中有相同名字的,则是则是重复声明错误重复声明错误;否则生成它的属性信息否则生成它的属性信息,保存到符号表中保存到符号表中;每当遇到
5、标识符的使用,查符号表如果没有找到如果没有找到,说明该标识符没有声明说明该标识符没有声明;否则否则,得到该标识符的属性得到该标识符的属性,进行进一步分析进行进一步分析;第九页,讲稿共八十四页哦 语义分析阶段只产生中间代码而不生成目标代码的方法使编译程序的开发变得较为容易,但语义分析不像词法分析和语法分析那样可以分别用正规文法和上下文无关文法描述。由于语义是上下文有关的,因此语义的形式化描述是非常困难的,目前较为常见的是用属性文法作为描述程序语言语义的工具,并采用语法制导翻译的方法完成对语法成分的翻译工作。第十页,讲稿共八十四页哦 语法制导翻译的方法就是为每个规则配上一个翻译子程序(称语义动作或
6、语义子程序),并在语法分析的同时执行这些子程序。语义动作是为规则赋予具体意义的手段,它一方面指出了一个规则所产生的符号串的意义,另一方面又按照这种意义规定了生成某种中间代码应做哪些基本动作。在语法分析过程中,当一个规则获得匹配(对于自上而下分析)或用于归约(对于自下而上分析)时,此规则相应的语义子程序就进入工作,完成既定的翻译任务。6.1.2语法制导翻译方法第十一页,讲稿共八十四页哦语法制导翻译分为自下而上语法制导翻译和自上而下语法制导翻译,我们重点介绍自下而上语法制导翻译。假定有一个自下而上的LR分析器,我们可以把这个LR分析器的能力加以扩大,使它能在用某个规则进行归约的同时调用相应的语义子
7、程序进行有关的翻译工作;每个规则的语义子程序执行之后,某些结果(语义信息)必须作为此规则的左部符号的语义值暂时保存下来,以便以后语义子程序引用这些信息。第十二页,讲稿共八十四页哦此外,原LR分析器的分析栈也加以扩充,以便能够存放与文法符号相对应的语义值。这样,分析栈可以存放三类信息:分析状态、文法符号及文法符号对应的语义值。扩充后的分析栈如图61所示。第十三页,讲稿共八十四页哦图图61扩充后的扩充后的LR分析栈分析栈第十四页,讲稿共八十四页哦 作为一个例子,我们考虑下面的文法及语义动作所执行的程序:规则 语义动作 (0)SE print valTOP (1)EE(1)+E(2)valTOP=v
8、alTOP+valTOP+2 (2)EE(1)*E(2)valTOP=valTOP*valTOP+2 (3)E(E(1)valTOP=valTOP+1 (4)Ei valTOP=lexval(注:lexval为i的整型 内 部值)第十五页,讲稿共八十四页哦我们扩充分析栈工作的总控程序功能,使其在完成语法分析的同时也能完成语义分析工作(这时的语法分析栈已成为语义分析栈);即在用某一个规则进行归约之后,调用相应的语义子程序完成与所用规则相应的语义动作,并将每次工作后的语义值保存在扩充后的“语义值”栈中。图62表示算术表达式79*5#的语法树及各结点值,而表6.1则给出了根据分析表用LR语法制导翻译
9、方法得到的该表达式的语义分析和计值过程。第十六页,讲稿共八十四页哦图图62语法制导翻译计算表达式语法制导翻译计算表达式79*5#的语法树的语法树第十七页,讲稿共八十四页哦表表6.1表达式表达式79*5#的语义分析和计值过程的语义分析和计值过程步骤状态栈符号栈语义栈输入串动作10#_79*5#s3203#7_ _9*5#r4301#E_79*5#s44014#E+_7_9*5#s350143#E+9_7_ _*5#r460147#E+E_7_9*5#s5701475#E+E*_7_9_5#s38014753#E+E*5_7_9_ _#r49014758#E+E*E_7_9_5#r2100147#
10、E+E_7_45#r11101#E_52#acc第十八页,讲稿共八十四页哦6.2属属性性文文法法6.2.1 文法的属性 属性是指与文法符号的类型和值等有关的一些信息,在编译中用属性描述处理对象的特征。随着编译的进展,对语法分析产生的语法树进行语义分析,且分析的结果用中间代码描述出来。对于一棵等待翻译的语法树,它的各个结点都是文法中的一个符号X,该X可以是终结符或非终结符。根据语义处理的需要,在用规则AX进行归约或推导时,应能准确而恰当地表达文法符号X在归约或推导时的不同特征。第十九页,讲稿共八十四页哦 例如:判断变量X的类型是否匹配,要用X的数据类型来描述;判断变量X是否存在,要用X的存储位置
11、来描述;而对X的运算,则要用X的值来描述;因此,语义分析阶段引入X的属性,如X.type、X.place、X.val等来分别描述变量X的类型、存储位置以及值等不同的特征。文法符号属性分:n 继承属性n 综合属性第二十页,讲稿共八十四页哦 继承属性 用于“自上而下”传递信息。继承属性由相应语法树中结点的父结点属性计算得到,即沿语法树向下传递,由根结点到分枝(子)结点,它反映了对上下文依赖的特性。继承属性可以很方便地用来表示程序语言上下文的结构关系。综合属性 用于“自下而上”传递信息。综合属性由相应语法分析树中结点的分枝结点(即子结点)属性计算得到,其传递方向与继承属性相反,即沿语法分析树向上传递
12、,从分枝结点到根结点。第二十一页,讲稿共八十四页哦 属性文法 是一种适用于定义语义的特殊文法,即在语言的文法中增加了属性的文法,它将文法符号的语义以“属性”的形式附加到各个文法的符号上(如上述与变量X相关联的属性X.type、X.place和X.val等),再根据规则所包含的含义,给出每个文法符号属性的求值规则,从而形成一种带有语义属性的上下文无关文法,即属性文法。属性文法也是一种翻译文法,属性有助于更详细地指定文法中的代码生成动作。6.2.2 属性文法第二十二页,讲稿共八十四页哦例如,简单算术表达式求值的属性文法如下:规则 语义规则(1)SE print(E.val)(2)EE(1)+T E
13、.val=E(1).val+T.val(3)ET E.val=T.val(4)TT(1)*F T.val=T(1).val*F.val(5)TT(1)T.val=T(1).val(6)F(E)F.val=E.val(7)Fi F.val=i.lexval第二十三页,讲稿共八十四页哦 上面的一组规则中,每一个非终结符都有一个属性val来表示整型值,如E.val表示E的整型值,而i.lexval则表示i的整型内部值。与规则关联的每一个语义规则的左部符号E、T、F等的属性值的计算由其各自相应的右部符号决定,这种属性也称为综合属性。与规则SE关联的语义规则是一个函数print(E.val),其功能是打
14、印E规则的值。S在语义规则中没有出现,可以理解为其属性是一个虚属性。第二十四页,讲稿共八十四页哦简单变量类型说明的文法GD如下:GD:Dint Lfloat L LL,idid其对应的属性文法为:规则 语义规则(1)DTL L.in=T.type(2)Tint T.type=int(3)Tfloat T.type=float(4)LL(1),id L(1).in=L.in;addtype(id.entry,L.in)(5)Lid addtype(id.entry,L.in)注意到与文法GD相应的说明语句形式可为int id1,id2,,idn 或者 float id1,id2,,idn第二十五
15、页,讲稿共八十四页哦非终结符T有一个综合属性type,其值为int或float。语义规则L.in=T.type表示L.in的属性值由相应说明语句指定的类型T.type决定;属性L.in被确定后将随语法树的逐步生成而传递到下边的有关结点使用,这种结点属性称为继承属性。由此可见,标识符的类型可以通过继承属性的复写规则来传递。例如,对输入串int a,b,根据上述的语义规则,可在其生成的语法树中看到用“”表示的属性传递情况,如图63所示。第二十六页,讲稿共八十四页哦图图63属性信息传递情况示意属性信息传递情况示意第二十七页,讲稿共八十四页哦属性翻译文法(属性文法)属性翻译文法(属性文法)第二十八页,
16、讲稿共八十四页哦6.3几种常见的中间语言几种常见的中间语言6.3.1 抽象语法树6.3.2 逆波兰表示法6.3.3 三地址代码第二十九页,讲稿共八十四页哦6.3.1 6.3.1 抽象语法树抽象语法树语法制导翻译既可以基于语法分析树也可以基于抽象语法树语法制导翻译既可以基于语法分析树也可以基于抽象语法树进行,采用的基本方法是一样的。进行,采用的基本方法是一样的。现在对语法树进行改造,去掉那些对翻译不必要的信息,将语现在对语法树进行改造,去掉那些对翻译不必要的信息,将语法树进行抽象法树进行抽象 -抽象语法树。抽象语法树。在表达式的抽象语法树中,运算符、关键字不作叶子结点而作为在表达式的抽象语法树中
17、,运算符、关键字不作叶子结点而作为内部结点,叶子结点只是运算量。内部结点,叶子结点只是运算量。语法制导翻译以语法树作基础语法制导翻译以语法树作基础,实际上实际上,语法树可以作为一种合语法树可以作为一种合适的中间语言形式。适的中间语言形式。抽象语法树也可以属性化,给结点加上属性变成带属性的抽象抽象语法树也可以属性化,给结点加上属性变成带属性的抽象语法树。语法树。第三十页,讲稿共八十四页哦 当把语法规则中本质部分抽象出来而将非本质部分去掉后,便得到抽象语法规则。这种去掉不必要信息的做法可以获得高效的源程序中间表示。如赋值语句x=ab*c的抽象语法树如图64(a)所示,而图64(b)则是该赋值语句的
18、普通语法树。图图64x=ab*c的语法树的语法树第三十一页,讲稿共八十四页哦抽象语法树的一个显著特点是结构紧凑,容易构造且结点数较少。图64(b)所示的普通语法树的结点为14个;而图64(a)所示的抽象语法树的结点仅有7个,且每个内部结点最多只有两个分支,因此可以将每个赋值语句或表达式表示为一棵二叉树。对于含有多元运算的更为复杂的语法成分,相应的抽象语法树则为一棵多叉树,但我们总可以将其转变为一棵二叉树。第三十二页,讲稿共八十四页哦为下面文法的句子为下面文法的句子 a-4+ca-4+c 建立抽象语法树。建立抽象语法树。EE+T|ET|TT(E)Tid|num为每个运算量或运算符号都建立一个结点
19、。为每个运算量或运算符号都建立一个结点。可以可以根据表达式的运算顺序自下而上的构造根据表达式的运算顺序自下而上的构造-手工构造。手工构造。a+c4抽象语法树抽象语法树运算符作内运算符作内部结点部结点id(a)EETE+TTnum(4)id(c)语法树语法树第三十三页,讲稿共八十四页哦抽象语法树的实现抽象语法树的实现抽象语法树中的每一个抽象语法树中的每一个结点可以由包含几个域的记录来实现;有结点可以由包含几个域的记录来实现;有向边用指针实现向边用指针实现。在一个在一个运算量运算量对应的结点对应的结点(叶结叶结)中中,一个域标识运算量,另一个域一个域标识运算量,另一个域是该运算量的属性值是该运算量
20、的属性值(或指针或指针)。在一个在一个运算符运算符对应的结点中对应的结点中,一个域标识运算符,其它域包含指一个域标识运算符,其它域包含指向运算分量的结点的指针。运算符通常叫做这个结点的向运算分量的结点的指针。运算符通常叫做这个结点的标号标号。进行翻译时,抽象语法树中的结点可能会进行翻译时,抽象语法树中的结点可能会用附加域来存放结点的用附加域来存放结点的属性值属性值(或指向属性的指针)。或指向属性的指针)。numvalid.op.Toentryofid右子树根结右子树根结左子树根结左子树根结第三十四页,讲稿共八十四页哦建建立立表表达达式式的的抽抽象象语语法法树树使使用用的的函函数数,这这些些函函
21、数数返返回回新新建建立立结结点点的的指针。指针。1.mknode(op,left,right)建建立立一一个个运运算算符符结结点点,标标号号是是op,两两个个域域left和和right指向左右运算分量结点的指针。指向左右运算分量结点的指针。2.mkleaf(id,entry)建建立立一一个个“标标识识符符”叶叶子子结结点点,由由标标号号id标标识识,一个域一个域entry指向标识符在符号表中相应的项。指向标识符在符号表中相应的项。3.mkleaf(num,val)建建立立一一个个“数数”叶叶子子结结点点,标标号号为为num,域域val用于存放数的值。用于存放数的值。抽象语法树的构造函数抽象语法
22、树的构造函数 第三十五页,讲稿共八十四页哦 调调用用上上述述函函数数建建立立表表达达式式 a-4+ca-4+c 的的抽抽象象语语法法树树。建建立顺序自下而上是立顺序自下而上是:p1,p2,p3,p4,p5p1,p2,p3,p4,p5抽象语法树构造抽象语法树构造idto entry ap1num 4p2 p3 idto entry cp4 +p5第三十六页,讲稿共八十四页哦 规则 语义规则 EE1+T E.nptr:=mknode(+,E1.nptr,T.nptr)E E1-T E.nptr:=mknode(-,E1.nptr,T.nptr)E T E.nptr:=T.nptr T(E)T.np
23、tr:=E.nptr T id T.nptr:=mkleaf(id,id.entry)T num T.nptr:=mkleaf(num,num.val)建立抽象语法树的语义规则建立抽象语法树的语义规则属性文法属性文法,nptr,nptr是综合属性是综合属性第三十七页,讲稿共八十四页哦n手手工工构构造造表表达达式式ab*(c-d)-e/f的的抽抽象象语语法法树树,根根据据表表达达式的运算顺序自下而上的构造。式的运算顺序自下而上的构造。练习练习 +adc*b/fe第三十八页,讲稿共八十四页哦逆波兰表示法是波兰逻辑学家卢卡西维奇(Lukasiewicz)发明的一种表示表达式的方法,这种表示法把运算量
24、(操作数)写在前面,把运算符写在后面,因而又称后缀表示法。例如,把a+b写成ab+,把a*(b+c)写成abc+*。6.3.2逆波兰表示法第三十九页,讲稿共八十四页哦1表达式的逆波兰表示 表达式E的后缀表示的递归定义如下:(1)如果E是变量或常数,则E的后缀表示即E自身。(2)如果E为E1 op E2形式,则它的后缀表示为 E1E2op;其中op是二元运算符,而E1、E2分别又是E1和E2的后缀表示。若op为一元运算符,则视E1和E1为空。(3)如果E为(E1)形式,则E1的后缀表示即为E的后缀表示。第四十页,讲稿共八十四页哦上述递归定义的实质是:后缀表示中,操作数出现的顺序与原来一致,而运算
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语义 分析 中间 代码 生成 讲稿
限制150内