语义分析和中间代码生成.ppt_第1页
语义分析和中间代码生成.ppt_第2页
语义分析和中间代码生成.ppt_第3页
语义分析和中间代码生成.ppt_第4页
语义分析和中间代码生成.ppt_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章语义分析和中间代码生成 典型的编译程序的逻辑结构 S P O P 词法分析程序 出错处理 信息表管理 语义分析 通常包括 1 类型检查 验证程序中执行的每个操作是否遵守语言的类型系统的过程 编译程序必须报告不符合类型系统的信息 2 控制流检查 控制流语句必须使控制转移到合法的地方 例如 在C语言中break语句使控制跳离包括该语句的最小while for或switch语句 如果不存在包括它的这样的语句 则就报错 3 一致性检查 在很多场合要求对象只能被定义一次 例如Pascal语言规定同一标识符在一个分程序中只能被说明一次 同一case语句的标号不能相同 枚举类型的元素不能重复出现等等 4 相关名字检查 有时 同一名字必须出现两次或多次 例如 Ada语言程序中 循环或程序块可以有一个名字 出现在这些结构的开头和结尾 编译程序必须检查这两个地方用的名字是相同的 5 名字的作用域分析 如何实现语义分析 语法制导翻译中的方法和技术应用于语义分析中 中间代码生成 程序的任务是 把经过语法分析和语义分析而获得的源程序中间表示翻译为中间代码表示 方法 语法制导翻译 采用独立于机器的中间代码的好处 1 便于编译系统的建立和编译系统的移植 2 便于进行独立于机器的代码优化工作 7 1中间语言图表示法后缀式三地址代码表示7 1 1图表示法抽象语法树和DAG图 抽象语法树语法树可以作为一种合适的中间语言形式 在语法树中去掉那些对翻译不必要的信息 从而获得更有效的源程序中间表示 这种经变换后的语法树称之为抽象语法树 AbstractSyntaxTree 在抽象语法树中 操作符和关键字都不作为叶结点出现 而是把它们作为内部结点 即这些叶结点的父结点如产生式S ifBthenS1elseS2抽象语法树表示if then elseBS1S2 a b c a 抽象语法树 c b a b c b c 表达式a a b c b c d的DAG d a c b a b c b dag DirectedAcyclicGraph DAG图 7 1 2三地址代码 一般形式x yopz 7 1 3三地址语句的种类 1 赋值语句x yopz op为二目算术算符或逻辑算符 2 赋值语句x opy op为一目算符 如一目减uminus 逻辑非not 移位算符 3 复制语句x y 4 无条件转移语句gotoL 5 条件转移语句ifxrelopygotoL 关系运算符号relop 等等 接上页 6 过程调用语句paramx和callp n 过程返回语句returny 7 索引赋值x y i 及x i y 8 地址和指针赋值x y x y和 x y 7 1 4三地址代码的表示方法1 四元式op arg1 arg2 result2 三元式op arg1 arg23 间接三元式间接码表 三元式表 对于语句a b c b c的三种表示方法 0 1 2 3 4 5 cbcbt2t5 arg1 t1t3t4 arg2 result t1t2t3t4t5a op 三地址语句的四元式表示 四元式需要利用较多的临时单元 四元式之间的联系通过临时变量实现 0 1 2 3 4 5 cbcb 1 a arg1 0 2 3 4 arg2 op 三地址语句的三元式表示 三元式中使用指向三元式语句的指针 0 1 0 1 2 3 间接代码 三地址语句的间接三元式表示 0 1 2 3 cb 1 a arg1 0 1 2 arg2 op 7 2说明语句 说明语句的翻译 对每个局部名字 在符号表中建立相应的表项 填写有关的信息如类型 嵌套深度 相对地址等 相对地址 相对静态数据区基址或活动记录中局部数据区基址的一个偏移量 7 2 1过程中的说明语句 一个过程中的所有说明语句作为一组来处理 用一个全程变量Offset来记录下一个数据在活动记录中的位置 P D offset 0 D D DD id T enter id name T type offset offset offset T width T integer T type integer T width 4 T real T type real T width 8 T array num ofT1 T type array num val T1 type T width num val T1 width T T1 T type pointer T1 type T width 4 图计算说明语句中名字的类型和相对地址 7 3赋值语句的翻译表达式的类型可以是整型 实型 字符型 数组 7 3 1简单算术表达式及赋值语句 lookup id name id entrynil过程lookup id name 检查是否在符号表中存在相应此名字的表项 返回值为空或标识符在符号表的入口 emit它将生成的三地址代码送到输出文件上 S id E p lookup id name ifp nilthenemit p E place elseerror E E1 E2 E place newtemp emit E place E1 place E2 place E E1 E2 E place newtemp emit E place E1 place E2 place E E1 E place newtemp emit E place E1 place E id p lookup id name ifp nilthenE place pelseerror 图产生赋值语句三地址代码的翻译模式 E place表示存放E值的名字 a b c d如何翻译 T1 dT2 c T1T3 b T2a T3 d T1 c T1 T2 b T2 T3 T3 T4 7 4布尔表达式 布尔表达式 用布尔运算符号 and or not 作用到布尔变量或关系表达式上而组成 布尔表达式的作用 1 用于计算逻辑值2 用于控制流语句如if then if then else和while do等之中的条件表达式 本节考虑由如下文法生成的布尔表达式 E EorE EandE notE E idrelopid true false 7 4 1翻译布尔表达式的方法方法一 用数值表示真和假 从而对布尔表达式的求值可以象对算术表达式的求值那样一步一步地来计算 方法二 用程序中控制转移到达的位置来表示布尔表达式的值 不用求值计算 方法二用于翻译控制流语句中的布尔表达式尤其方便 7 4 2数值表示法用1表示真 0表示假来实现布尔表达式的翻译布尔表达式 aorbandnotc翻译成三地址代码序列 100 t1 notc101 t2 bandt1102 t3 aort2关系表达式 a b等价于ifa bthen1else0翻译成三地址代码序列 100 ifa bgotol03101 t 0102 gotol04103 t 1104 图7 11关于布尔表达式的数值表示法的翻译模式E E1orE2 E place newtemp emit E place E1 place orE2 place E E1andE2 E place newtemp emit E place E1 place andE2 place 接上页 E notE1 E place newtemp emit E place not E1 place E id1relopid2 E place newtemp emit if id1 placerelop opid2 place goto nextstat 3 emit E place 0 emit goto nextstat 2 emit E place 1 E ture E place newtemp emit E place 1 E false E place newtemp emit E place 0 a borc d如何翻译 100 ifa bgoto103101 T1 0102 goto104103 T1 1104 104 ifc dgoto107105 T2 0106 goto108107 T2 1108 108 T3 T1orT2 X a borc d 如何翻译 a bandc d如何翻译 100 ifa bgoto103101 T1 0102 goto104103 T1 1104 104 ifc dgoto107105 T2 0106 goto108107 T2 1108 108 T3 T1andT2 a borc dande f如何翻译 100 ifa bgoto103101 T1 0102 goto104103 T1 1104 104 ifc dgoto107105 T2 0106 goto108107 T2 1 108 ife fgoto111109 T3 0110 goto112111 T3 1112 T4 T2andT3113 T5 T1orT4 a bandtrue如何翻译 7 4 2控制流语句中的布尔表达式的翻译基本思想 假定E形如a b 则将生成如下的E的代码 ifa bgotogoto 假定E形如a bandc d 则将生成如下E的代码 100 ifa bgoto102101 goto102 ifc dgoto103 goto 假定E形如a borc d 则将生成如下E的代码 100 ifa bgoto101 goto102102 ifc dgoto103 goto 假定E形如nota bandc d 则将生成如下E的代码 100 ifa bgoto101 goto102102 ifc dgoto103 goto 真假出口 为实现一遍扫描 采用回填技术先产生暂时没有填写目标标号的转移指令 对于每一条这样的指令作适当的记录 一旦目标标号被确定下来 再将它 回填 到相应的指令中 使用回填翻译布尔表达式布尔表达式文法 1 E E1orME2 2 E1andME2 3 notE1 4 E1 5 id1relopid2 6 true 7 false 8 M 插入非终结符号M是为了引入一个语义动作 以便在适当的时候获得即将产生的下一个四元式的标号 翻译模式用到如下三个函数 1 makelist i 创建一个仅包含i的新表 i是四元式代码序列的一个标号 2 merge p1 p2 连接由指针p1和p2指向的两个表并且返回一个指向连接后的表的指针 3 backpatch p i 把i作为目标标号回填到p所指向的表中的每一个转移指令中去 图使用一遍扫描的布尔表达式的翻译模式 E E1ORME2 backpatch E1 falselist M quad E truelist merge E1 truelist E2 truelist E falselist E2 falselist E E1ANDME2 backpatch E1 truelist M quad E truelist E2 truelist E falselist merge E1 falselist E2 falselist E truelistE的所有真出口的标号组成的链表E falselistE的所有假出口的标号组成的链表 E notE1 E truelist E1 falselist E falselist E1 truelist E E E truelist E1 truelist E falselist E1 falselist E id1relopid2 E truelist makelist nextquad E falselist makelist nextquad 1 emit if id1 placerelop opid2 place goto emit goto E true E truelist makelist nextquad emit goto E false E falselist makelist nextquad emit goto M M quad nextquad 例考虑表达式a borc dande f 一棵作了注释的分析树如下图所示 E t 100 104 E f 103 105 E t 100 E f 101 E t 104 E f 103 105 OR M q 102 a b E t 102 E f 103 E t 104 E f 105 and M q 104 c e d f 依次分析 得到如下四元式 100 ifa bgoto101 goto102 ifc dgoto103 goto104 ife fgoto105 goto 经过回填得到 100 ifa bgoto101 gotol02102 ifc dgotol04103 goto104 ife fgoto105 goto 剩下的转移怎么办 7 4 3控制流语句文法 S ifEthenS1 ifEthenS1elseS2 whileEdoS1 E code S1 code E true E false a if then toE true toE false 代码结构 E code S1 code E true S2 code E false gotoS next S next toE true toE false b if then else 使用回填翻译控制流语句文法 1 S ifEthenS 2 ifEthenSelseS 3 whileEdoS 4 A 5 L L S 6 SS表示语句L表示语句序列A为赋值语句E为一个布尔表达式 控制流语句的翻译模式 1 S ifEthenM1S1NelseM2S2 E code S1 code 100 S2 code 120 gotoS next S next toE true toE false M1 quad回填E truelistM2 quad回填E falselistN出生成 gotoS next S ifEthenM1S1NelseM2S2 backpatch E truelist M1 quad backpatch E falselist M2 quad S nextlist merge S1 nextlist N nextlist S2 nextlist M M quad nextquad N N nextlist makelist nextquad emit goto S nextlist S对应的四元式中转出指令的标号组成的链表 S ifEthenMS1 backpatch E truelist M quad S nextlist merge E falselist S1 nextlist S whileM1EdoM2S1 backpatch S1 nextlist M1 quad backpatch E truelist M2 quad S nextlist E falselist emit goto M1 quad M1处生成标号S begin 反填S1 nextlist M2处反填E truelist S nextlist E falselistS A S nextlist makelist 先记录要回填的转移指令标号 在适当的时候进行回填 以便赋值和布尔表达式的求值得到合适的连接 以完成程序的控制流程 L L1 MS backpatch L1 nextlist M quad L nextlist S nextlist L S L nextlist S nextlist 四元式代码如下 100 ifa bgoto101 goto102 ifc dgoto103 goto104 ife fgoto105 goto 例使用自底向上的分析法生成四元式目标代码 ifa borc dande fthenX Y 102 104 106 106 107 107 107 ifa borc dande fthenX YelseY X 四元式代码如下 100 ifa bgoto101 goto102 ifc dgoto103 goto104 ife fgoto105 goto106 102 104 106 106 109 whilea borc dande fdoa a 1 四元式代码如下 100 ifa bgoto101 goto102 ifc dgoto103 goto104 ife fgoto105 goto106 102 104 106 106 whilea bdoifc dthenx y z 四元式代码如下 100 ifa bgoto101 goto102 ifc dgoto103 goto104 t1 y z105 x t1106 goto100107 104 102 100 107 whilea bdoifc dthenx y zelsey z 翻译为中间代码 7 4 3标号和转移语句 gotoL gotoL gotoL L gotonil L goto goto L 拉链回填 7 5CASE语句switch语句的语法 switchexpressionbegincasevaluE1 statement1casevaluE2 statement2 casevaluen 1 statementn 1defalt statementnend switch语句翻译成的三地址代码控制流程 1 对表达式求值 2 在列出的valuE1 valuE2 valuen 1这些值中寻找与表达式的值相等的值 如果没有这样的值存在 则让 缺席值 与表达式匹配 3 执行在 2 中寻找到的值相联系的语句 某个statement switch语句的目标代码结构 对expression求值并置于t的有关代码gototestL1 有关statement1的代码gotonextL2 有关statement2的代码gotonext Ln 1 有关statementn 1的代码gotonextLn 有关statementn的代码gotonext 接上页 test ift value1gotoL1ift value2gotoL2 ift valuen 1gotoLn 1gotoLnnext expression 选择器 将被计算出一个值 valueE1 valueE2 valuen 1 表达式可能取的值 default 缺席值 用来在expression的值不等于任何valuei时来匹配expression 7 3 2数组元素的引用数组元素的三地址代码是什么 如何生成数组元素的三地址代码 一 数组元素地址的计算公式 数组A的下标为i的元素的开始地址inta 20 求a i 的地址 base i low w 7 4 bace low w i w常量部分 可在编译时计算出来 变量部分其中 base是分配给数组的相对地址 low为数组下标的下界 对于一个二维数组 可以按行或按列存放若按行存放 则可用如下公式计算A i1 i2 的相对地址 base i1 low1 n2 i2 low2 w base low1 n2 low2 w i1 n2 i2 w 7 5 令C low1 n2 low2 w 计算元素A i1 i2 ik 相对地址的推广公式 i1 n2 i2 n3 i3 nk ik w base low1 n2 low2 n3 low3 nk lowk w 7 6 C low1 n2 low2 n3 low3 nk lowk wa i1 i2 in 的地址 base c 变量部分x a i1 i2 三地址代码结构 t1 变量部分t2 base ct3 t2 t1 x t3 数组元素引用的文法L id Elist idElist Elist E E为获得有关数组各维长度nj的信息 改写为 L Elist idElist Elist E id E 有关变量与函数的说明Elist ndim 记录Elist中的下标表达式的个数 即维数 函数limit array j 返回nj 即由array所指示的数组的第j维长度 nj highj lowj 1Elist place 临时变量 用来临时存放由Elist中的下标表达式计算出来的值 变量部分 i1 n2 i2 n3 i3 n4 e1 i1 7 8 em em 1 nm im 7 9 Elist引进综合属性array 指向数组的符号表地址 访问数组元素的翻译模式 给定文法 1 S L E 2 E E E 3 E E 4 E L 5 L Elist 6 L id 7 Elist Elist E 8 Elist id E 相应语义动作若L是一个简单的名字 将生成一般的赋值 若L为数组元素引用 则生成对L所指示地址的索引赋值1 S L E ifL offset nullthenemit L place E place elseemit L place L offset E Place 2 E E1 E2 E place newtemp emit E place E1 place E2 place 接上页 3 E E1 E place E1 place 获得地址L place L offset 的内容 4 E L ifL offset nullthenE place L place Lisasimpleid elsebeginE place newtemp emit E place L place L offset end 接上页 5 L Elist L place newtemp emit L place Elist array c L offset newtemp emit L offset w Elist place 6 L id L place id place L offset null 接上页 应用递归公式扫描下一个下标表达式7 Elist Elist1 E t newtemp m Elist1 ndim 1 emit t Elist1 place limit Elist1 array m emit t t E place Elist array Elist1 array Elist place t Elist ndim m 8 Elist id E Elist place E place Elist ndim 1 Elist array id place 例7 1设A为一个10 20的数组 即n1 10 n2 20 并设w

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论