[高等教育]第七章语义分析和中间代码生成.pdf
《[高等教育]第七章语义分析和中间代码生成.pdf》由会员分享,可在线阅读,更多相关《[高等教育]第七章语义分析和中间代码生成.pdf(55页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、*第七章第七章语义分析和中间代码生成语义分析和中间代码生成知识结构:知识结构:语义分析语义分析语法分析概述语法分析概述语法制导翻译语法制导翻译逆波兰式表示逆波兰式表示三元式表示三元式表示语义分析和中语义分析和中中间语言中间语言图型表示图型表示间代码生成四元式表示间代码生成四元式表示三地址语句表示三地址语句表示赋值语句的翻译赋值语句的翻译布尔表达式的翻译布尔表达式的翻译中间代码生成中间代码生成控制语句的翻译控制语句的翻译说明语句的翻译说明语句的翻译过程语句的翻译过程语句的翻译第一节第一节语法制导翻译概述语法制导翻译概述一、语义分析的任务一、语义分析的任务在词法分析和语法分析的基础上进一步分析其含
2、义,主要在词法分析和语法分析的基础上进一步分析其含义,主要的工作是进行静态语义检查和翻译。的工作是进行静态语义检查和翻译。二、语义分析的功能语义分析的功能1 1、类型检查、类型检查检查运算的合法性(运算对象的一致性)检查运算的合法性(运算对象的一致性)。/筱*2 2、一致性检查、一致性检查一个对象(标识符等)在一个分程序中只能被定义一次。一个对象(标识符等)在一个分程序中只能被定义一次。3 3、相关名字检查、相关名字检查如果一个名字必须出现多次,如果一个名字必须出现多次,检查使用的名字是否相同的。检查使用的名字是否相同的。4 4、控制流检查、控制流检查控制流语句必须使控制转移到合法的地方。控制
3、流语句必须使控制转移到合法的地方。5 5、确定类型、确定类型确定标识符所关联得数据类型。确定标识符所关联得数据类型。6 6、识别含义、识别含义确认程序中各种成分组合到一起的含义,并作相应的语义确认程序中各种成分组合到一起的含义,并作相应的语义处理,对可执行的语句生成中间语言或目标语言。处理,对可执行的语句生成中间语言或目标语言。三、生成的语言三、生成的语言1 1、直接生成目标语言、直接生成目标语言根据源程序中各语法成分的语义,直接生成机器语言或汇根据源程序中各语法成分的语义,直接生成机器语言或汇编语言。其特点:编语言。其特点:编译时间较短;编译时间较短;存储空间较大;存储空间较大;目标语言的质
4、量较差。目标语言的质量较差。2 2、生成中间语言、生成中间语言介于源程序语言和机器语言之间的机内表示形式。介于源程序语言和机器语言之间的机内表示形式。其特点:其特点:编译程序的逻辑结构简单;编译程序的逻辑结构简单;有利于编译程序的移植;有利于编译程序的移植;/筱*便于目标语言的优化。便于目标语言的优化。四、语义分析方法四、语义分析方法1 1、语法制导翻译方法、语法制导翻译方法在语法分析过程中,使用语法规则进行归约的同时,根据在语法分析过程中,使用语法规则进行归约的同时,根据每个产生式的语义动作进行翻译(在语法规则的制导下,通过每个产生式的语义动作进行翻译(在语法规则的制导下,通过对语义规则的计
5、算,完成对输入字符串的翻译)的方法。对语义规则的计算,完成对输入字符串的翻译)的方法。2 2、属性翻译方法、属性翻译方法指明语义规则的计算次序,陈述一些实现细节,以表达语指明语义规则的计算次序,陈述一些实现细节,以表达语义动作在语法分析过程中的执行时刻。义动作在语法分析过程中的执行时刻。五、语义规则五、语义规则为文法中的每一条产生式配置计算属性的计算规则。为文法中的每一条产生式配置计算属性的计算规则。六、语法制导翻译六、语法制导翻译为文法中每个产生式配备一组语义规则。为文法中每个产生式配备一组语义规则。1 1、语义规则、语义规则语义规则计算包括:产生代码、在符号表中存放信息、在语义规则计算包括
6、:产生代码、在符号表中存放信息、在分析工作栈中填写语义值(属性值)分析工作栈中填写语义值(属性值),并生成相应的中间代码。并生成相应的中间代码。2 2、自上而下分析、自上而下分析用一条产生式与输入符号匹配成功时用一条产生式与输入符号匹配成功时,执行相应语义子程执行相应语义子程序生成中间代码。序生成中间代码。3 3、自下而上分析、自下而上分析用一条产生式进行的归约时用一条产生式进行的归约时,执行相应语义子程序生成中执行相应语义子程序生成中间代码。间代码。/筱*七、翻译简例七、翻译简例表达式文法和相应的翻译模式:表达式文法和相应的翻译模式:(P179P179)S Sid:=Eid:=E p:=Lo
7、okup(id.name);p:=Lookup(id.name);if p if p nil thennil thenemit(pemit(p:=:=E.place)E.place)else errorelse errorE.placeE.place 为属性值为属性值(语义变量语义变量),代表存放,代表存放 E E 值的变量名在值的变量名在符号表的入口地址或指向代表符号表的入口地址或指向代表 E E 值的临时变量的整数值。值的临时变量的整数值。E EE E1 1+E+E2 2 E.place:=newtemp;E.place:=newtemp;emit(E.placeemit(E.place:
8、=:=E E1 1.place.place+E E2 2.place).place)语法分析工作栈进行扩充语法分析工作栈进行扩充,增加相应的语义值,增加相应的语义值,语法分析同语法分析同时时(如归约时如归约时),执行语义规则,执行语义规则(语义子程序语义子程序)。例:例:x:=y+zx:=y+z 的语法制导翻译的语法制导翻译用用 E EE E1 1+E+E2 2归约归约执行语义规则执行语义规则E2 E2.place E.place:=T1;+-归约后归约后 E E.placeemit(T1:=y+z)E1E1.place 符号符号 语义值语义值生成一条中间代码生成一条中间代码符号符号 语义值语
9、义值用用 S Sid:=Eid:=E 归约归约执行语义规则执行语义规则E E.place p:=Lookup(x);:=-归约后归约后 s E.placeemit(x:=T1)id id.place符号符号 语义值语义值生成一条中间代码。生成一条中间代码。/筱*符号符号语义值语义值这样语法分析结束时也就生成了中间代码:这样语法分析结束时也就生成了中间代码:(0 0)T T1 1:=y+z:=y+z(1 1)x:=T x:=T1 1注意:注意:语义工作栈中的值与状态工作栈中的值一一对应,某些符语义工作栈中的值与状态工作栈中的值一一对应,某些符号可能无相应的语义值,如上例“号可能无相应的语义值,如
10、上例“+”,保留语义栈位是用“”,保留语义栈位是用“”表示。表示。归约时符号和语义值同时退出工作栈,归约时符号和语义值同时退出工作栈,同时进入工作栈。同时进入工作栈。例例 A A XYZXYZZ Z.zZ Z.z Y Y.y Y Y.y归约后归约后A A.aA A.aX X.xX X.x 符号符号 语义值语义值符号符号 语义值语义值八、语义值(属性)和语义规则(语义子程序)八、语义值(属性)和语义规则(语义子程序)1 1、语义值、语义值代表文法符号的类型、值、符号表地址等语义子程序需要代表文法符号的类型、值、符号表地址等语义子程序需要的信息。如的信息。如 E.place E.place(符号表
11、指针)(符号表指针)。2 2、语义规则、语义规则对语义值(属性)进行计算,或其它加工处理过程。对语义值(属性)进行计算,或其它加工处理过程。属性文法翻译属性文法翻译使用语义规则进行属性值的计算。使用语义规则进行属性值的计算。语法制导翻译语法制导翻译给出使用语义规则进行计算的顺序(用给出使用语义规则进行计算的顺序(用 括号起来)括号起来)。九、理解语法制导翻译的若干关键问题九、理解语法制导翻译的若干关键问题/筱*1 1、语义值(属性)代表的含义、语义值(属性)代表的含义2 2、语义子程序(语义规则)、语义子程序(语义规则)3 3、语法制导翻译过程、语法制导翻译过程翻译的顺序与语义子程序执行的顺序
12、相关;翻译的顺序与语义子程序执行的顺序相关;子程序执行的顺序与应用产生式进行归约的顺序相关;子程序执行的顺序与应用产生式进行归约的顺序相关;归约的顺序与中间代码的顺序相关;归约的顺序与中间代码的顺序相关;第二节中间语言第二节中间语言一、中间语言的表示形式一、中间语言的表示形式1 1、后缀式(逆波兰表示)、后缀式(逆波兰表示)(P167P167 定义)定义)2 2、图表示法(、图表示法(DAGDAG 无环路有向图,抽象语法树)无环路有向图,抽象语法树)3 3、三地址代码、三地址代码三地址语句三地址语句四元式四元式三元式三元式间接三元式间接三元式二、后缀式(逆波兰表示)二、后缀式(逆波兰表示)1
13、1、表达式表示形式、表达式表示形式中缀形式中缀形式二目运算的运算符总是置于两个运算对象之间。二目运算的运算符总是置于两个运算对象之间。例:例:a*a*(b+cb+c)后缀形式后缀形式把运算符置于运算对象之后,将中缀式中的算符,按优先把运算符置于运算对象之后,将中缀式中的算符,按优先/筱*级或结合律重新排序。级或结合律重新排序。后缀形式表达式后缀形式表达式 E E 的定义的定义如果如果 E E 是一个变量或常量,则是一个变量或常量,则 E E 的后缀形式是的后缀形式是 E E 自身。自身。如果如果 E E 是是 E E1 1OPOP E E2 2形式的表达式,这里的形式的表达式,这里的 OPOP
14、 是任何二元是任何二元操作符,则操作符,则 E E 的后缀形式是的后缀形式是 E E1 1 E E2 2 OP OP,这里,这里 E E1 1 和和 E E2 2 分别为分别为 E E1 1和和 E E2 2的后缀形式。的后缀形式。如果如果 E E 是(是(E E1 1)形式的表达式,则)形式的表达式,则E E1 1 的后缀形式就是的后缀形式就是 E E的后缀形式。的后缀形式。例:中缀形式:例:中缀形式:a*a*(b+cb+c),而后缀形式:,而后缀形式:abc+*abc+*2 2、中缀形式转换后缀形式的算法、中缀形式转换后缀形式的算法建立两个工作栈,存放运算对象和经处理后的运算符(逆建立两个
15、工作栈,存放运算对象和经处理后的运算符(逆波兰区)波兰区);另一个存放运算符,首先将“;另一个存放运算符,首先将“#”压入工作栈顶。”压入工作栈顶。若输入的符号是运算对象,送入波兰区。若输入的符号是运算对象,送入波兰区。若输入的符号是运算符,若输入的符号是运算符,送入运算符工作栈,送入运算符工作栈,操作过程:操作过程:工作栈顶运算符的优先级高于当前输入的运算符,将工工作栈顶运算符的优先级高于当前输入的运算符,将工作栈顶运算符弹出,送入逆波兰区,并把当前输入的运算符压作栈顶运算符弹出,送入逆波兰区,并把当前输入的运算符压入运算符工作栈;入运算符工作栈;工作栈顶运算符的优先级低于当前输入的运算符,
16、将当工作栈顶运算符的优先级低于当前输入的运算符,将当前输入的运算符压入运算符工作栈;前输入的运算符压入运算符工作栈;若当前输入的符号是“若当前输入的符号是“#”,将运算符工作栈的符号依次,将运算符工作栈的符号依次弹出,送入逆波兰区。弹出,送入逆波兰区。3 3、转换的语义规则、转换的语义规则/筱*属性定义(语义变量)属性定义(语义变量)E Ecodecode:表示:表示E E 的后缀式,定义了识别的标识符(指针)的后缀式,定义了识别的标识符(指针)。OPOP 表示任意的二元操作符。表示任意的二元操作符。“”表示后缀形式的连接。“”表示后缀形式的连接。语义规则的描述(语义规则的描述(P167P16
17、7)对同一产生式重复出现的文法符号用角标进行区分。对同一产生式重复出现的文法符号用角标进行区分。例例 a+b*a+b*(c+d*bc+d*b)+d+d 4 3 2 1 5 4 3 2 1 5后缀式:后缀式:abcdb*+*+d+abcdb*+*+d+产生式产生式语义动作语义动作 E Eid E.codeid E.code idid E EE E1 1OP EOP E2 2 E.code E.code E1.codeE1.codeE2.codeE2.codeopop三、图表示法三、图表示法1 1、抽象语法树、抽象语法树语法树可以作为一种合适的中间语言形式。在语法树中去语法树可以作为一种合适的中间
18、语言形式。在语法树中去掉那些对翻译无效的信息,掉那些对翻译无效的信息,从而获得更有效的源程序中间表示。从而获得更有效的源程序中间表示。这种变换后的语法树为抽象语法树。这种变换后的语法树为抽象语法树。抽象语法树的表示形式:抽象语法树的表示形式:操作符和关键字作为内部结点。操作符和关键字作为内部结点。运算对象作为叶子结点。运算对象作为叶子结点。例:例:3 35 54 4 的抽象语法树的抽象语法树/筱*4 4 3 5 3 52 2、DAGDAG 图(无环路有向图)图(无环路有向图)与抽象语法树一样,对表达式的每个子表达式,与抽象语法树一样,对表达式的每个子表达式,DAGDAG 都有都有一个结点。一个
19、结点。DAGDAG 图的结构:图的结构:内部结点为运算符。内部结点为运算符。子结点为操作对象。子结点为操作对象。3 3、DAGDAG 与抽象语法树的区别(与抽象语法树的区别(P168P168)DAGDAG 图的公共子表达式的结点具有多个父结点。图的公共子表达式的结点具有多个父结点。抽象语法树的公共子表达式对应重复子树。抽象语法树的公共子表达式对应重复子树。四、三地址代码四、三地址代码1 1、三地址代码一般形式、三地址代码一般形式X :=Yop ZX :=Yop Z结果结果操作数操作数操作符操作符 操作数操作数例:例:X+Y*ZX+Y*Z中间代码为:中间代码为:T T1 1:=Y*Z:=Y*ZT
20、 T2 2:=X+T:=X+T1 1 T T1 1,T,T2 2为临时变量(由编译生成)为临时变量(由编译生成)2 2、三地址语句的种类、三地址语句的种类(P170)(P170):二目运算的赋值语句二目运算的赋值语句 x:=yopzx:=yopz。单目运算的赋值语句单目运算的赋值语句 x:=opyx:=opy。复制语句复制语句 x:=yx:=y。/筱*无条件转移语句无条件转移语句 goto Lgoto L(中间代码地址)(中间代码地址)。条件转移语句条件转移语句 ifx relopy gotoLifx relopy gotoL 或或 ifa goto Lifa goto L。调用语句调用语句
21、param xparam x 和和 call p,ncall p,n,返回语句,返回语句 return yreturn y。索引赋值索引赋值 x:=yix:=yi和和 xi:=yxi:=y(数组元素)(数组元素)。地址和指针赋值地址和指针赋值 x:=&yx:=&y,x:=*yx:=*y 和和*x:=y*x:=y。3 3、三地址代码的几种表示、三地址代码的几种表示四元式四元式(opop,arg1arg1,arg2arg2,resultresult)例:例:x:=yopzx:=yopz 的四元式的四元式(op(op,y y,z z,x)x)例:例:a:=b*-c+b*-ca:=b*-c+b*-c(
22、,c c,_ _,T T1 1)(*(*,b b,T T1 1,T T2 2)(,c c,_ _,T T3 3)(*(*,b b,T T3 3,T T4 4)(+(+,T T2 2,T T4 4,T T5 5)(:=(:=,T T5 5,_ _,a)a)三元式三元式为了避免把临时变量填入符号表,为了避免把临时变量填入符号表,用中间代码地址用中间代码地址(指针)(指针)代表运算对象。代表运算对象。(opop,arg1arg1,arg2arg2)例:例:a:=b*-c+b*-ca:=b*-c+b*-c(0)(0)(,c c,_)_)(1)(*(1)(*,b b,(0)(0)(2)(2)(,c c,
23、_)_)(3)(*(3)(*,b b,(2)(2)(4)(+(4)(+,(1)(1),(3)(3)/筱*(5)(:=(5)(:=,a a,(4)(4)例:例:xi:=yxi:=y(0)(=(0)(=,x x,i)i)(1)(:=(1)(:=,y,y,(0 0))用两条三元式表示索引赋值。用两条三元式表示索引赋值。例:例:x:=yix:=yi(0)(=(0)(=,y y,i)i)(1)(:=(1)(:=,x x,(0)(0)(3)(3)间接三元式间接三元式(P173)(P173)为了便于代码优化处理,不直接使用三元式的指针,而是为了便于代码优化处理,不直接使用三元式的指针,而是另设一张间接代码表
24、,按先后顺序列出三元式在三元式代码表另设一张间接代码表,按先后顺序列出三元式在三元式代码表中的位置。中的位置。例:例:x:=(A+B)*cx:=(A+B)*cy:=Dy:=D(A+B)(A+B)三元式代码表三元式代码表间接代码表间接代码表OP ARG1 ARG2 (1)OP ARG1 ARG2 (1)(1)+A B (2)(1)+A B (2)(2)*(1)C (3)(2)*(1)C (3)(3)(3)X (2)(1)X (2)(1)(4)(4)D (1)(4)D (1)(4)(5)(5)Y (1)(5)Y (1)(5)比较几种形式的三地址代码比较几种形式的三地址代码a:=b*-c+b*-ca
25、:=b*-c+b*-c三地址码三地址码四元式四元式三元式三元式间接三元式间接三元式/筱*T T1 1:=-c:=-c(,c,-,T,c,-,T1 1)(,c,-)(,c,-)T T2 2:=b*T:=b*T1 1(*,b,T(*,b,T1 1,T,T2 2)(*,b,(0)(*,b,(0)T T3 3:=-c:=-c(,c,-,T,c,-,T3 3)(,c,-)(,c,-)T T4 4:=b*T:=b*T3 3(*,b,T(*,b,T3 3,T,T4 4)(*,b,(*,b,)(+,T(+,T2 2,T,T4 4,T,T5 5)(+,(+,)T T5 5:=T:=T2 2+T+T4 4(0)(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高等教育 第七 语义 分析 中间 代码 生成
限制150内