第6章 语法制导翻译和语义分析_第1页
第6章 语法制导翻译和语义分析_第2页
第6章 语法制导翻译和语义分析_第3页
第6章 语法制导翻译和语义分析_第4页
第6章 语法制导翻译和语义分析_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

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

文档简介

1、v 定义相关概念:属性、属性文法、定义相关概念:属性、属性文法、S属性文法和属性文法和L属性文法属性文法v 解释基于属性文法的语法制导翻译技术的基本思想解释基于属性文法的语法制导翻译技术的基本思想v 介绍常见的中间代码的描述方法介绍常见的中间代码的描述方法v 介绍不同语法结构的语法制导翻译技术介绍不同语法结构的语法制导翻译技术6.1 6.1 属性文法与语法制导翻译属性文法与语法制导翻译6.2 6.2 语义分析和中间代码的产生语义分析和中间代码的产生6.3 6.3 简单算术表达式及赋值语句的翻译简单算术表达式及赋值语句的翻译6.4 6.4 布尔表达式的翻译布尔表达式的翻译6.5 6.5 控制结构

2、的翻译控制结构的翻译6.6 6.6 说明语句的翻译说明语句的翻译6.7 6.7 数组的翻译数组的翻译6.8 6.8 过程调用语句的翻译过程调用语句的翻译6.9 6.9 本章小结本章小结属性及属性文法属性及属性文法 1综合属性与继承属性综合属性与继承属性 2S属性文法与属性文法与L属性文法属性文法 3基于属性文法的语法制导翻译基于属性文法的语法制导翻译 4(1)文法的属性 是指与文法符号的类型和值等有关的一些信息,在编译中用属性描述处理对象的特征。随着编译的进展,对语法分析产生的语法树进行语义分析,且分析的结果用中间代码描述出来。对于一棵等待翻译的语法树,它的各个结点都是文法中的一个符号X,该X

3、可以是终结符或非终结符。根据语义处理的需要,在用产生式AX进行归约或推导时,应能准确而恰当地表达文法符号X在归约或推导时的不同特征。 例如,判断变量X的类型是否匹配,要用X的数据类型来描述;判断变量X是否存在,要用X的存储位置来描述;而对X的运算,则要用X的值来描述;因此,语义分析阶段引入X的属性,如X.type、X.place、X.val等来分别描述变量X的类型、存储位置以及值等不同的特征。(2)属性文法 属性文法是一种适用于定义语义的特殊文法,即在语言的文法中增加了属性的文法,它将文法符号的语义以“属性”的形式附加到各个文法的符号上(如上述与变量X相关联的属性X.type、X.place和

4、X.val等),再根据产生式所包含的含义,给出每个文法符号属性的求值规则,从而形成一种带有语义属性的上下文无关文法,即。属性文法也是一种翻译文法,属性有助于更详细地指定文法中的代码生成动作。属性文法=上下文无关文法+属性+语义规则(1)属性分类属性文法中的属性可分为与两类。u 继承属性用于“自上而下”地传递信息。u 综合属性 用于“自下而上”地传递信息。(2)语义规则属性与变量一样可以进行计算和传递,属性加工的过程即是语义处理的过程。对于文法的每一个产生式都配备了一组属性的计算规则,称为。(3)语义规则的表示在一个属性文法中,对应于每个产生式A 都有一套与之相关联的语义规则,每条规则形式为其中

5、f是一个函数,而且或者b是A的一个综合属性,并且c1,c2,ck是中文法符号的属性;或者b是中某个文法符号的一个继承属性 并且c1,c2,.,ck是A或中任何文法符号的属性。在上述两种情况下,我们都说。12kb: f(c ,c ,c )(3)语义规则的表示终结符号只有综合属性,由词法分析器提供。非终结符既可有综合属性也可有继承属性,文法开始符号的所有继承属性作为属性计算前的初始值。对出现在产生式右边的继承属性和产生式左边的综合属性都必须提供一个计算规则。属性计算规则中只能使用相应产生式的文法符号的属性,这有利于在产生式范围内“封装”属性的依赖性。然而,出现在产生式左边的继承属性和出现在产生式右

6、边的综合属性不由所给的产生式的属性计算规则进行计算,它们由其它产生式的属性规则计算,由属性计算器的参数提供。(1)S属性文法仅仅使用综合属性的属性文法,称为。(2)L属性文法一个属性文法称为,如果对于每个产生式Ax1x2,xn,其每个语义规则中的每个属性或者是综合属性,或者是xj(1jn)的一个继承属性且这个继承属性仅依赖于:产生式中xj的左边符号x1,x2,xj-1的属性;A的继承属性 L属性文法的最大特点是产生式右部符号的继承属性不依赖于该符号右边符号的任何属性。S属性文法一定是L-属性文法S属性文法适合于一遍扫描的自下而上分析L属性文法可用于一遍扫描的自上而下分析(1)语法制导翻译 所谓

7、就是指为文法中每个产生式配上一组语义规则,并且在语法分析的同时执行这些语义规则。 语法制导翻译法的基本思想是对文法中的每个产生式都附加上一个语义动作(或语义子程序),在执行语法分析的过程中,每当使用一条产生式进行推导或归约时,就执行相应产生式对应的语义动作(或语义子程序)。这些语义动作不仅指明了该产生式所产生符号串的意义,而且还根据这种意义规定了对应的加工动作(如查填各类表格、更新变量的值、提示出错信息、生成中间代码等),从而完成预定的翻译工作。(2)举例【例6.1】描述简单算术表达式求值的属性文法。产生式产生式语义规则语义规则(1)LEprint(E.val);(2)EE1 + TE.val

8、 = E1.val+T.val;(3)ETE.val = T.val;(4)TT1*FT.val = T1.val*F.val;(5)TFT.val = F.val;(6)F(E)F.val = E.val;(7)FdigitF.val = digit.lexval;val:综合属性,表:综合属性,表示示E、T、F的值的值lexval:综合属性,由:综合属性,由词法分析器提供词法分析器提供print:打印:打印由由E产生的表产生的表达式值达式值【例6.2】描述说明语句中变量类型信息的属性文法。产生式产生式语义规则语义规则(1)DTLL.in = T.type;(2)TintT.type = i

9、nt;(3)TfloatT.type = float;(4)LL1,idL1.in = L.in;addtype(id.entry,L.in); (5)Lidaddtype(id.entry,L.in);type:综合属性,:综合属性,其值由说明中的关其值由说明中的关键字确定键字确定in:继承属性,:继承属性,addtype:把每个标识的类型信息登记:把每个标识的类型信息登记到符号表中相关项(到符号表中相关项(id.entry)中)中返回语义分析的任务语义分析的任务 1常见的中间代码形式常见的中间代码形式 2语义分析与处理的主要任务:(1)审查每个语法结构的静态语义,即验证语法结构合法的源程序

10、是否真正有意义。有时把这个工作称为或。(2)若静态语义正确,则要执行,即用另一种语言形式(比源语言更接近于目标语言的一种中间代码或直接用目标代码)来描述这种语义。(1)中间代码源程序的一种内部表达,不依赖于目标机的结构,易于机械生成目标代码的中间表示,称为。(2)为什么要此阶段使用中间代码主要有以下几点好处:使逻辑结构清楚有利于不同目标机上实现同一种语言有利于进行与机器无关的优化这些内部形式也能用于解释(3)常见的中间代码形式后缀式(逆波兰表示式)图表示法v抽象语法树抽象语法树vDAG图图三地址代码v四元式四元式v三元式三元式v间接三元式间接三元式(4)后缀式(逆波兰式)定义后缀式表示法(逆波

11、兰表示法),由波兰逻辑学家卢卡西维奇(Lukasiewicz)发明,它把运算量(操作数)写在前面,把运算符写在后面(后缀)的一种表达式表示方法。其归纳定义如下:a) 如果如果E是一个变量或常数,则是一个变量或常数,则E的后缀式是的后缀式是E自身。自身。b) 如果如果E是是E1 op E2 形式的表达式,形式的表达式,op是二元操作符,则是二元操作符,则E的后缀式为的后缀式为E1 E2 op,其中,其中E1,E2分别是分别是E1和和E2的后缀式。的后缀式。c) 若若E是(是(E1)形式的表达式,则)形式的表达式,则E的后缀式就是的后缀式就是E1的后缀式。的后缀式。(4)后缀式(逆波兰式)举例表达

12、式表达式后缀式(逆波兰式)后缀式(逆波兰式)a+bab+(a+b)*(c+d)ab+cd+*A+B*(C-D)+E/(C-D)NABCD-*+ECD-N/+a=b*c+b*dabc*bd*+=(4)后缀式(逆波兰式)后缀式的计算机处理后缀式的最大优点是易于计算机处理,其处理过程如下:利用一个栈,从左至右扫描逆波兰式,若当前符号是运算对象则进栈,若当前符号是运算符(假定该运算符号是k元运算符),则将栈顶k个元素依次弹出,同时进行k元运算,并将运算结果进栈,表达式处理完毕时,最后的结果留在栈顶。(5)图表示法抽象语法树在抽象语法树表示中,每一个叶结点都表示诸如常量或变量这样的运算对象,而其它内部结

13、点则表示运算符。抽象语法树不同于前述的语法树,它展示了一个操作过程并同时描述了源程序的层次结构。例如,表达式x=a-b*c的语法树和抽象语法树如下图所示:SV=EVxEE-E|E*E|a|b|c(5)图表示法DAG图(Directed Acyclic Graph,有向无环图)对表达式的每个子表达式,DAG都有一个结点,一个内部结点代表一个操作符,它的孩子代表操作数,在一个DAG中代表公共子表达式的结点具有多个父结点。而在抽象语法树中公共子表达式被表示为重复的子树。例如,表达式a+a*(b-c)+(b-c)*d的DAG图和抽象语法树如下图所示:(6)三地址代码三地址代码可以看成是抽象语法树或的一

14、种线性表示。三地址代码的形式三地址代码语句的一般形式为 x=y op z 其中,x、y和z为名字、常量或编译时产生的临时变量,op为运算符。三地址代码的每条语句通常包含三个地址,两个用来存放运算对象,一个用来存放运算结果。实际中用户定义的名字由指向符号表中该名字项的指针所取代。由于三地址语句只含一个运算符,因此多个运算符组成的表达式需用三地址语句序列来表示。(6)三地址代码例如,表达式x+y*z的三地址代码为: t1=y*z t2= x+t1三地址语句的种类三地址语句类似于汇编代码,它可以有符号标号和各种控制流语句。常用的三地址语句有以下几种:a) x=y op z,其中,其中op为二目算术或

15、逻辑运算符。为二目算术或逻辑运算符。b) x=op y,其中,其中op为一目运算符,如一目减为一目运算符,如一目减uminus、逻辑否定、逻辑否定not、移、移位运算符、将定点数转换成浮点数的类型转换符。位运算符、将定点数转换成浮点数的类型转换符。(6)三地址代码c) 赋值语句:赋值语句:x=yd) 无条件转移语句:无条件转移语句:goto Le) 条件转移语句:条件转移语句:if x relop y goto L ,if a goto L f) 过程调用语句过程调用语句param X和和call P,n及过程返回语句及过程返回语句return yg) 变址赋值语句:变址赋值语句:x=yi,x

16、i=y h) 地址和指针赋值语句:地址和指针赋值语句:x=&y,x=*y,*x=y(6)三地址代码三地址代码的具体实现编译程序中,三地址代码的具体实现通常有三种表示方法:四元式、三元式 和 间接三元式。a) 四元式四元式是具有四个域的记录结构,即 其中,op为运算符,arg1、arg2及result为指针,它们可指向有关名字在符号表中的登记项或临时变量(也可为空)。 (6)三地址代码常用的三地址语句与相应四元式对应如下:常用的三地址语句与相应四元式对应如下: 三地址语句三地址语句四元式四元式x=y op z (op, y, z, x)x= -y(uminus, y, _, x)x=y(=, y

17、, _, x)param x1(param, x1, _, _)call P(call, _, _, P)goto L(j, _, _, L)if x relop y goto L(jrelop, x, y, L)relop为:为:、=、=、!=、=(6)三地址代码例如,赋值语句a=b*(c+d)的四元式代码为: (+,c,d,t1) (*,b,t1,t2) (:=,t2,_,a) 约定:一个运算量的算符使用arg1。此外,若op是一个算术或逻辑运算符,则result为新引进的临时变量,用来存放运算结果。可见,四元式出现的顺序与表达式计值的顺序一致,四元式之间的联系通过临时变量实现。(6)三地

18、址代码b) 三元式三元式是具有三个域的记录结构,即其中,op为运算符,arg1、arg2既可指向有关名字在符号表中的登记项或临时变量,也可指向三元式表中的某个三元式。 例如,表达式a=(b+c)*(b+c)的三元式代码为: (+,b,c) (+,b,c) (*,) (:=,a,) 由上例可知,三元式出现的先后顺序和表达式各部分的计值顺序一致。(6)三地址代码c) 间接三元式在三元式代码表的基础上另设一张表,该表按运算的次序列出相应三元式在三元式表中的位置,这张表称为。三元式表只记录不同的三元式,间接码表表示由这些语句组成的运算次序。 例如,表达式a=(b+c)*(b+c)的三元式表和间接码表为

19、: 三元式表: (+,b,c) (*,) (:=,a,) 间接码表: 返回(1)文法(2)语义赋值语句,简单算术表达式(3)目标结构翻译成四元式(=,E, _,i)AiEEEE | E*E |E |(E)|i A表示赋值语句表示赋值语句E表示表达式表示表达式(4)语义子程序语义子程序涉及的语义变量、语义过程及语义函数如下:语义变量(属性)uE.place:表示存放:表示存放E值的变量名在符号表中的入口地址或临时变量名值的变量名在符号表中的入口地址或临时变量名的整数码。的整数码。:表示存放标识符:表示存放标识符i的变量名的变量名语义过程uemit(op,arg1,arg2,resu

20、lt):功能是产生一个四元式并填入四元式表中。:功能是产生一个四元式并填入四元式表中。语义函数unewtemp( ):返回一个代表新临时变量的整数码,临时变量名按产生:返回一个代表新临时变量的整数码,临时变量名按产生的顺序可设为的顺序可设为T1、T2、。、。ulookup():审查:审查是否出现在符号表中。若是,则返回是否出现在符号表中。若是,则返回在符号表的入口指针,否则返回在符号表的入口指针,否则返回NULL。(4)语义子程序产生式产生式语义子程序语义子程序Ai=Ep=lookup();if(p=NULL) error( );else emi

21、t(=,E.place,_,p); EE1+E2E.place=newtemp( );emit(+,E1.place, E2.place, E.place);EE1*E2E.place=newtemp( );emit(*,E1.place, E2.place, E.place);E E1E.place=newtemp( );emit(uminus, E1.place,_, E.place);E(E1)E.place= E1.place ;Eip=lookup();if(p!=NULL) E.place=p; else error();返回布尔表达式的翻译方法布尔表达式的翻译方法 1

22、控制语句中布尔表达式的翻译控制语句中布尔表达式的翻译 2(1)布尔表达式用布尔运算符号(and, or, not)作用到布尔变量或关系表达式上而组成的。关系表达式形如E1 relop E2, 其中E1,E2是算术表达式 。 relop为, ,=,。布尔运算符的运算顺序从高到低为not、and、or,且or和and服从左结合规则。(2)布尔表达式的作用 用作计算逻辑值。 用作控制流语句(如 ifthen,ifthenelse, whiledo等)之中的条件表达式。(3)布尔表达式的文法描述 E E or E | E and E | not E | (E) | id relop id | true

23、 | false | id relop = | | | | | (4)布尔表达式的计值同算术表达式的计算一步不差地从表达式各部分的值计算出整个表达式的值。例如,用1表示true,用0表示false。 1 or (not 0 and 0) or 0= 1 or (1 and 0) or 0= 1 or 0 or 0= 1 or 0= 1采取某种优化措施用if-then-else来解释or,and,not,即:A or B if A then true else BA and B if A then B else falsenot A if A then false else true(5)数值表

24、示法的翻译方案语义规则按数值方式计算布尔表达式的值。目标结构id1 relop id2 (jrelop, id1.place,id2.place,nextstat+3); (:=, 0, _ , E.place); (j,_,_,nextstat+2) (:=, 1, _ ,E.place) (5)数值表示法的翻译方案运算符not, and, or 翻译为四元式: 一个形如 a relop b的关系表达式可等价的写成: if a relop b then 1 else 0 ,并将它翻译成如下三地址语句及四元式序列:(我们假定语句序号从p开始。) 三地址 四元式(5)数值表示法的翻译方案例如,

25、ab的关系表达式可等价地写成: if ab then 1 else 0 ,并将它翻译成如下三地址语句及四元式序列: (我们假定语句序号从100开始。) (6)语义子程序相关函数和变量说明:uemit函数函数:生成四元式,并将其插入到四元式列表中。unextstat: 给出四元式序列中下一条四元式语句的地址索引,每调用一次emit函数,便把nextstat加1。 语义规则产生式产生式语义子程序语义子程序E E1 or E2E.place:=newtemp; emit(or,E1.place,E2.place, E.place); E E1 and E2E.place:=newtemp; emit

26、(and,E1.place,E2.place, E.place); E not E1E.place:=newtemp; emit(not,E1.place,_,E.place);E (E1)E.place:=E1.place;E id1 relop id2E.place:=newtemp; emit(jrelop,id1.place,id2.place,nextstat+3);emit(:=,0,_,E.place); emit(j,_,_,nextstat+2); emit(:=,1,_,E.place); E idE.place:=id.place ;E trueE.place:=newt

27、emp; emit(:=,1,_,E.place)E falseE.place:=newtemp; emit(:=,0,_,E.place)(7)举例: 将布尔表达式 ab or cd and ef 翻译为四元式序列。100:(j,a,b,103)101:(:=,0,_,T1)102:(j,_,_,104)103:(:=,1,_,T1)104:(j,c,d,107)105:(:=,0,_,T2)106:(j,_,_,108)107:(:=,1,_,T2)108:(jc or bc goto L2 goto L1L1: if bd goto L2 goto L3L2: 关于关于S1 的三地址代码

28、序列的三地址代码序列 goto LnextL3: 关于关于S2的三地址代码序列的三地址代码序列Lnext:n 布尔量的目标结构应由两条四元式组成: : 真出口,当A为真时跳转到四元式P ,if A goto P: 假出口,无条件跳转到四元式q goto qn 关系表达式的目标结构可以写成两条四元式:: 真出口,当x rop y为真时转四元式P if x rop y goto P : 假出口,无条件跳转到四元式q goto q(5)如何确定一个表达式的真假出口呢? 考虑表达式E(1) or E(2)。若E(1)为真,则E为真,因此,E(1)的真出口就是E的真出口;若E(1)为假,则E(2)必须被

29、计值,此时E(2)的第一个四元式就是E(1)的假出口,同时,E(2)的真假出口就是E的真假出口。 考虑E(1) and E(2),与上类似。 对not E(1), 只需调换E(1)的真假出口为E的假真出口。 E(1) or E(2)和E(1) and E(2)的翻译如下图:(5)如何确定一个表达式的真假出口呢? (5)如何确定一个表达式的真假出口呢? 在自下而上分析过程中,一个布尔式的真假出口往往不能在一个布尔式的真假出口往往不能在产生四元式时填上产生四元式时填上,故把未完成四元式的地址(编号)作为E的语义值暂存,等到整个表达式的四元式产生完毕后,再填写这个未填入的转移目标。 对于每个非终结符

30、E,需为它赋两个语义值E.truelist和和E.falselist,分别用以记录E所对应的四元式需要回填“真”、“假”出口的四元式地址所构成的链。这是因为在翻译过程中常会出现若干四元式转向同一目标但目标位置又未确定的情况,此时将这些四元式链接起来,待获得目标四元式地址时再返填返填。(5)如何确定一个表达式的真假出口呢? 例如,假定E的四元式需要回填“真”出口的有p、q、r这三个四元式,则它们可链接成如下图所示的一条真值链(记作truelist)。(6)举例 对输入串 ab or cf 翻译成四元式, 100:(:(j , a , b , ) 101: (j, _ , _ , 102) 102

31、:(:(j , e, f, 106) 105: (j, _ , _ , ) 106:(:= , 1 , _ , T ) 107:(j, _ , _ , 109 ) 108:(:= , 0 , _ , T ) 109:后续四元式:后续四元式返回if语句的翻译语句的翻译 1while语句的翻译语句的翻译 2for语句的翻译语句的翻译 3(1)文法 Sif E then S1 if E then S1 else S2(2)语义 条件分支转移语句。条件成立执行S1,不成立不执行任何操作或执行S2, 然后继续执行if语句后面的语句。(3)目标结构TE 的代码S1 的代码S2 的代码F(4)举例将if a

32、b or cf then x=y+z else x=y-z 翻译成四元式。 100:(j,a,b, ) 101:(j, _,_,102) 102:(j,e,f,106) 105:(j, _,_, ) 106:(+,y,z,x) 107:(j, _,_,109) 108: (-,y,z,x) 109:(后续四元式序列后续四元式序列) (1)文法 Swhile E do S1(2)语义当E为真 ,反复执行S1 ; 否则执行while语句后面的语句。(3)目标结构TE 的代码S(1) 的代码F(4)举例将 while (AB) do if (C ,A ,B , 102 )101: ( j, _ ,

33、_ , )102: ( j ,I , N , ) 104 (+ , M ,I ,T ) 105 (:= ,T , _ , M) 106 (j ,_ ,_ ,102) 107 或返回简单说明语句的翻译简单说明语句的翻译 1过程中的说明过程中的说明 2(1)文法简单说明语句的文法GD为: D int namelist | float namelist namelist namelist, i | i(2)语义说明源程序中的简单变量的名字及其性质。(3)翻译方法我们可以把文法GD改为GD: GD: DD, i int i float i 这样,就能把所说明的性质及时地告诉每个名字i;或者说,每当读进

34、一个标识符时就可以把它的性质登记到符号表中,而无须到最后再集中登记了。语义变量和语义过程u语义变量:用于传递名字的性质u过程:把名字id和性质A登记在符号表中翻译方案产生式产生式语义子程序语义子程序DD1 ,ientry(id,D1.att);D.att= D1.att; Dint ientry(id,int);D.att= int;Dfloat ientry(id,float);D.att= float;当考察一个过程或分程序的一系列说明语句时,便可为局部于该过程的名字分配存储空间。对每个局部名字,我们将在符号表中建立相应的表项,并填入相应的信息如类型、在存储器中的相对地址等。(1)相关术语

35、:为了管理过程在一次执行中所需要的信息,使用一个连续的存储块,这个连续的存储块称为活动记录。:指对静态数据区基址或活动记录中局部数据区基址的一个偏移量。(2)过程中的说明语句翻译在C、Pascal及FORTRAN等语言的语法中,允许在一个过程中的所有说明语句作为一个组来处理,把它们安排在一所数据区中。从而我们需要一个全程变量如offset来跟踪下一个可用的相对地址的位置。语义变量和语义过程:把名字name填入到符号表中,并给出此名字的类型type及在过程数据区中的相对地址offset。: 综合属性,名字的类型: 综合属性,名字的域宽翻译方案产生式产生式语义子程序语义子程序P Doffset:=

36、0; D D;D D id:Tenter(,T.type,offset); offset:=offset+T.width;T integerT.type:=integer;T.width:=4 ;T realT.type:=real;T.width:=8;T arraynum of T1T.type:=array(num.val,T1.type); T.width:=num.val*T1.width; T T1T.type:=pointer(T1.type); T.width:=4 ;返回数组元素的地址计算数组元素的地址计算 1赋值语句中数组元素的翻译赋值语句中数组元素的翻译 2

37、(1)数组的存储方式 在表达式或赋值语句中若出现数组元素,则翻译时将牵涉到数组元素的地址计算。数组在存储器中的存放方式决定了数组元素的地址计算方法,从而决定了该产生什么样的中间代码。数组在存储器中的存放通常有和两种方式。下面讨论以行为主序存放方式的数组元素地址计算法。(2)数组元素的地址计算一维数组考虑一维数组Alow1.high1,假定数组元素的存储长度为w,base是数组A的首地址,则数组元素Ai1的起始地址为:base+(i1-low1)*w 即 i1*w + (base-low1*w) Ai1basei1low1high1w 二维数组 同理,二维数组元素Ai1,i2的起始地址为base

38、+(i1-low1)*d2+ i2-low2*w 即(i1*d2+ i2 )*w+base-(low1*d2+ low2)*w Ai1,i2basei1low1high1low2high2i2d2d1 一般数组 数组的一般定义为: 其中,A是数组名,lk是数组A第k维的下界,uk是第k维的上界。为简单起见,假定数组A中每个元素的存储长度为1,a是数组A的首地址,则数组元素Ai1, i2, in的地址D的计算公式如下:其中,di=ui-li+1(i=1,2,n)。将上述公式整理后得到: 1123n2234nn 1n 1nnnDa(il )d dd(il )d dd(il)d(il )123n23

39、4nn 1nn123n234nn 1nnDa(l d ddl d ddldl )(i d ddi d ddidi )DCONSTPARTVARPART与ik(1kn)无关的不变量与ik(1kn)有关的可 变量(1)翻译方法CONSTPART中的各项(如li、di(i=1,2,n)在处理说明语句时就可以得到,因此CONSTPART值可在编译时计算出来后保存在数组A的相关符号表项里。此后,在计算数组A的元素地址时仅需计算VARPART值而直接引用CONSTPART值。实现数组元素的地址计算时,将产生两组四元式序列:一组计算CONSTPART,其值存放在临时变量T中;另一组计算VARPART,其值存

40、放在临时变量T1中,即用T1T表示数组元素的地址。这样,对数组元素的引用和赋值就有如下两种不同的四元式:若有,则可以用四元式表示。:若有,则可用四元式表示。(2)举例已知A是一个1020的数组(每维下界均为1)且按行存放,求: (1) 赋值语句X=AI,J的四元式序列; (2) 赋值语句AI+2,J+1=M+N的四元式序列。解:由于A是1020的数组,故d1=10,d2=20,C=d2+1=21。X=AI,J的四元式序列为:(2)举例已知A是一个1020的数组(每维下界均为1)且按行存放,求: (1) 赋值语句X=AI,J的四元式序列; (2) 赋值语句AI+2,J+1=M+N的四元式序列。解:由于A是1020的数组,故d1=10,d2=20,C=d2+1=21。X=AI,J的四元式序列为:返回参数传递的方式参数传递的方式 1过程调用的处理过程调用的处理 2(1)参数u形式参数(形参,哑元)形式参数(形参,哑元)u实在参数(实参)实在参数(实参)(2)参数传递的途径u传地址传地址u传值传值u传名传名u得结果得结果传地址把实参地址传给相应形参,在过程段中每个形参都有一个相应单元,称为形式单元,用来存放实参地址,过程体对形参的任何引用或赋值都被处理成对形式单元的间接访问。得结果每个形参对应有两个单元,第一个单元存放实参地址,第二

温馨提示

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

评论

0/150

提交评论