编译原理语义分析与中间代码生成.ppt_第1页
编译原理语义分析与中间代码生成.ppt_第2页
编译原理语义分析与中间代码生成.ppt_第3页
编译原理语义分析与中间代码生成.ppt_第4页
编译原理语义分析与中间代码生成.ppt_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

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

文档简介

语义分析与中间代码生成,复习:编译程序的逻辑过程 按照编译程序的逻辑工作过程,语法分析后,接下来就要进行语义分析了,语义分析后,再生成中间代码。实际应用中,往往在语法分析的同时,进行语义分析并生成中间代码,这就是语法制导翻译法。 语法制导翻译过程中,需要借助于属性文法进行语义描述和语义处理。 本章内容: 属性文法有关概念; 语法制导翻译基本思想; 中间代码形式; 简单算术表达式、布尔表达式、赋值语句、条件语句、循环语句的翻译。,属性文法,表达式文法 ET+T | T or T Tn | b ET1 + T2 T1.type = int T2.type= T1.type E.type =int E T1 or T2 T1.type = bool T2.type= T1.type E.type =bool T n T.type = int T b T.type = bool,属性文法,对于某个压缩了的文法,当把每个文法符号和一组属性相关联,并把产生式附加以语义规则的时候,就得到属性文法。 语法制导的翻译过程:由于属性文法的规则和产生式是一一对应的关系,所以,由属性文法确定的语义分析可以在语法分析的过程中进行。这个过程称为语法制导的翻译。,属性文法(attribute grammar),A=(G,V,F),其中 G:一个CFG, 属性文法的基础。 V:有穷的属性集 每个属性与一个文法符号相关联 这些属性代表与文法符号相关的语义信息 如类型、地址、值、代码、符号表内容等等 属性与变量一样,可以进行计算和传递 属性加工的过程即是语义处理的过程 属性加工与语法分析同时进行 属性的表示: 标识符(或数),写在相应文法的下边 点记法:E.Val,E.Place,E.Type F:关于属性的属性断言或一组属性的计算规则(称为语义规则) . 断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相关的属性.,语义规则描述的工作,属性计算 静态语义检查 符号表操作 代码生成,继承属性和综合属性,两类属性: 综合属性(Synthesized Attribute):归约型属性 用于“自下而上”传递信息 继承属性(Inherited Attribute):推导型属性 用于“自上而下”传递信息。 属性的计算:AX1 X2 Xn A的综合属性,计算 S(A) =f(A(X1),A(Xn) Xj的继承属性,计算 I(Xj)=f(A(A),. A(Xn) 文法符号属性的说明: 非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性. 终结符只有综合属性. 通常规定:文法符号的综合属性与继承属性无交。,综合属性的例子,非终结符E、T及F都有一个综合属性val,符号digit有一个综合属性,它的值由词法分析器提供。 与产生式LE对应的语义规则仅仅是打印由E产生的算术表达式的值的一个过程,可认为这条规则定义了L的一个虚属性。 某些非终结符加上标是为了区分一个产生式中同一非终结符多次出现,综合属性的自下而上定值,设表达式为35+4,则语义动作打印数值19,继承属性的例子,继承属性L.in,继承属性的自上而下定值,D,L.in= real,L.in= real,L.in= real,T.type=real,real,id2,id1,id3,Real id1,id2,id3,,,,,语法制导翻译的基本思想,为每条产生式配上一个翻译子程序(称为语义动作或语义子程序); 语义动作的工作 指明符号串的意义; 按照这种意义规定了对应的动作: 查添各种表格 改变变量之值 诊察与报告源程序错误 产生中间代码 在语法分析的同时,当一个产生式获得匹配(对于自上而下分析)或用于归约(对于自下而上分析)时,就执行相应产生式的语义子程序。,中间代码,中间代码(Intermediate code ): 源程序的一种内部表示,不依赖目标机的结构,易于机械生成目标代码的中间表示。 几种中间语言 后缀式(逆波兰表示法) 三地址代码 四元式 三元式 间接三元式 树,后缀式,表达式的一种表示形式 运算符直接跟在运算量后面 又称为逆波兰表示法 定义:设E是表达式,那么 如果E是变量或者常量,E的逆波兰表示为E E1 OP E2 = E1 E2 OP,其中E1,E2 为 E1, E2的逆波兰表示。 (E) = E,其中E为E 的逆波兰表示。,后缀式的生成 设置一个操作符栈,当扫描到操作数时,输出该操作数。当遇到操作符时,与栈顶操作符比较优先级,若栈顶操作符优先级高于栈外操作符,则输出该栈顶操作符;反之,则栈外操作符入栈。 后缀表达式的计值 自左向右扫描表达式,每遇到运算量就把它推进栈,每遇到k目算符就把它作用于栈顶的k个项,并把运算结果来代替这k个项,逆波兰表示的例子,A + B * ( C - D ) + E / ( C - D ) N = A B C D - * + E C D N / + a+b*c/(d+e) = abc*de+/+,逆波兰表示方法的扩充,赋值语句:V=e = Ve= 例子:t=(a+b)*c/(d-e) = tab+c*de-/= 转向语句:goto = jump 条件语句: If then else = jumpfjump,三地址代码,一般形式: X=y op z 例子 x+y*z 可表示为 T1=y*z T2=x+T1 T1、T2为编译时产生的临时变量 三地址语句的种类 三地址代码的具体实现 四元式 三元式 间接三元式,四元式,一般形式: 例子: a+b*c * b c t1 + a t1 t2 单目运算的处理:为空。 一般来讲,四元式的运算符都有对应的机器指令,或者对应的子程序,因此从四元式生成指令代码是容易的。 四元式之间的联系是通过临时变量实现的,便于进行代码优化。,四元式表示的例子,A + B * ( C - D ) + E / ( C - D ) N (1)( - C D T1 ) (2)( * B T1 T2) (3)( + A T2 T3) (4)( - C D T4) (5)( T4 N T5) (6)( / E T5 T6) (7)( + T3 T6 T7),三元式,如果我们不明显给出四元式的结果部分,而是用四元式的编号来表示结果,那么我们可以得到三元式。形式如下: 例子:a+b*c=* b c + a 三元式的出现顺序与表达式的计值顺序一致。 和四元式的比较: 无须临时变量; 占用存储空间少; 相互引用太多,使得难以进行代码优化。,三元式表示的例子,A + B * ( C - D ) + E / ( C - D ) N (1) ( - C D ) (2) ( * B (1) ) (3) ( + A (2) ) (4) ( - C D ) (5) ( (4) N ) (6) ( / E (5) ) (7) ( + (3) (6) ),间接三元式,间接三元式: 为了便于代码优化处理,用一张间接码表辅以三元式表的办法来表示中间代码。 间接码表是一张指示器表,它将按运算的先后顺序列出有关三元式在三元式表中的位置。 当在代码优化过程中需要调整运算顺序时,只需重新安排间接码表即可。 例子:X=(A+B)*C Y=D(A+B),间接三元式表示的例子,A + B * ( C - D ) + E / ( C - D ) N (1)( - C D ) (1) (2)( * B (1) ) (2) (3)( + A (2) ) (3) (4) ( (1) N ) (1) (5)( / E (4) ) (4) (6) ( + (3) (5) ) (5) (6),树形表示(抽象语法树AST),采用树形表示作为一种中间代码形式,有助于代码的产生和优化。 树形表示的定义: 简单变量或常数的树就是该变量或常数自身; 如果表示e1和e2的树为T1和T2,那么, e1+e2, e1*e2,-e1的树分别是: 显然,树形表示是三元式表示的翻版。 抽象语法树(Abstract Syntax Tree) 在语法树中去掉那些对翻译不必要的信息,获得更有效的源程序中间表示 AST可以拓广,用来表示数组元素、过程调用、控制结构、说明等。,由语法树到AST,步骤: 去掉单非产生式子树,上提终结符结点; 运算符上提,取代其父结点; 去掉括号,运算符上提。 例子:a*(a+a),简单算术表达式和赋值句的翻译,文法: Ai:=E EE+E|E*E|-E|(E)|i 引入的语义属性:E.place 与非终结符E相联系,表示存放E值的变量名在符号表的入口或整数码(对临时变量) 语义过程: newtemp() :函数过程。每次调用,回送一个代表新临时变量名的整数码作为函数值。 lookup() :函数过程。对i所代表标识符查找符号表以获知它在符号表中位置(入口)。 emit ():语义过程。产生一个三地址代码并填入中间代码表中。,产生式的语义描述,(1)Ai:=E p=lookup(); if (p=NULL) error(); else emit(p = E.place) (2) EE(1)+E(2) E.place=newtemp(); emit(E.place = E(1).place + E(2).place) (3)EE(1)*E(2) E.place=newtemp(); emit(E.place = E(1).place * E(2).place) (4) E-E(1) E.place=newtemp(); emit(E.place =uminus E(1).place) (5)E(E(1) E.place = E(1).place (6)Ei p=lookup(); if (p=NULL) error(); else E.place=p,布尔表达式的翻译,布尔表达式基本作用: 用作计算逻辑值; 用作控制条件。 布尔表达式文法: EEE | EE | E | (E) | id relop id |id 结合性和优先级: relop ; 左结合。,布尔表达式的翻译,计算布尔表达式的值: 逐步计算; 利用布尔表达式的性质采取优化措施: AB if A then true else B AB if A then B else false B if B then false else true,布尔表达式的翻译,逐步计算的例子: ABC=D (=, C, D, T1) (, B, T1, T2) (, A, T2, T3),布尔表达式的翻译,优化计算引入的三地址代码: (if i.place goto l) : 若i为真,转向第l个三地址代码 (if i(1).place relop.op i(2).place goto l): 若i(1) relop.op i(2)为真,转向第l个三地址代码 (goto l): 无条件转向第l个三地址代码,布尔表达式的翻译,逻辑计值 EE(1) or E(2) E.place=newtemp(); emit(E.place = E(1).place or E(2).place) EE(1) and E(2) E.place=newtemp(); emit(E.place = E(1).place and E(2).place) Enot E(1) E.place=newtemp(); emit(E.place = not E(1).place) E(E(1) E.place=E(1).place Ei(1) relop i(2) E.place=newtemp(); emit(if i(1) relop.op i(2) goto nextquad+3); emit(E.place = 0); emit(goto nextquad+2); emit(E.place = 1) Ei E.place=i.place,布尔表达式的翻译,作为控制条件 Ei E.truelist = nextquad; E.falselist = nextquad+1; E.bcode = nextquad; emit(if i.place goto 0); emit(goto 0) Ei(1) relop i(2) E.truelist = nextquad; E.falselist = nextquad+1; E.bcode = nextquad; emit(if i(1).place relop.op i(2).place goto 0); emit(goto 0) E(E(1) E.truelist = E(1).truelist; E.falselist = E(1).falselist; E.bcode = E(1).bcode,布尔表达式的翻译,作为控制条件 Enot E(1) E.truelist = E(1).falselist; E. falselist = E(1).truelist; E.bcode = E(1).bcode EE(1) or E(2) backpatch(E(1).falselist, E(2).bcode); E.truelist = merge(E(1).truelist, E(2).truelist); E.falselist = E(2).falselist; E.bcode = E(1).bcode EE(1) and E(2) backpatch(E(1).truelist, E(2).bcode)

温馨提示

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

评论

0/150

提交评论