- 1、本文档共82页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[工学]ch8-语法制导翻译和中间代码生成3
控制语句的文法 1、条件语句 if 的翻译 条件语句 if 的文法和语义子程序的设计 C→if E then 的翻译 S→CS(1) 的翻译 Tp→CS(1) else的翻译 S→TPS(2)的翻译 2、循环语句while的文法和语义子程序设计 W→while 的翻译 Wd→W E do 的翻译 S→Wd S(1) 的翻译 【例】 while A∨BD do if (X6) then X = X-1 else Y = X+1 三种基本控制结构的翻译 G[S]中各产生式对应的语义子程序 3、for 循环语句的翻译 改写文法 (1) F1→for i=E(1) 的翻译 (2) F2→F1 step E(2) 的翻译 (3) F3→F2 until E(3) 的翻译 (4) S→F3 do S(1) 的翻译 翻译示例 for i=1 step 10 until N do k=k+1; 4、开关语句 switch常见的一种中间代码形式 5、语句标号和转移语句的翻译 向后引用、向前引用 翻译 goto L 翻译语句 L:S 翻译goto语句时,还有两点必须注意 8.7 简单说明语句的翻译 最简单的说明语句的语法描述 改造文法G[D]为G‘[D]: 文法G‘[D]和相应的语义子程序 ★过程中的说明语句 (单层) 作用域信息(嵌套) 带嵌套的过程说明的说明语句的文法 需要的操作 设计两个栈 tblptr和offset 带嵌套的过程说明语句的翻译 ★ 记录中的域名 8.8含数组元素的赋值语句的翻译 数组的一般定义 赋值语句中数组元素的翻译 改写文法 设置如下的语义变量和函数: 含有数组元素的赋值语句的文法G[A]及相应的语义子程序(省略语义检查): 【例】对于数组 a[2,3] 即 d1=2,d2=3 数组说明的翻译 例如,数组 int A[l1:u1, l2:u2,…,ln:un]相应的内情向量见表为 8.8 递归下降语法制导的翻译 制导翻译程序 为简单起见,假定数组 a 中每个元素的存储长度 w 为1,base 是数组 a 的首地址,假定按行存放,则数组元素 a[i1,i2,…,in] 的地址 D 的计算公式如下: D = b+(i1?l1)d2d3…dn+(i2?l2)d3d4…dn+ … + (in-1?ln?1)dn+(in?ln) 其中,di=ui?li+1 (i=1,2,…,n?1) 整理后得到 D = bap + Vap 其中,Vap = (…((i1d2+i2)d3+i3)d4+…+in?1dn)+in bap = b - C C = (…((l1d2+l2)d3+l3)d4+…+ ln-1)dn+lnbap 中的各项(如li、di(i=1,2,…,n))在处理说明语句时就可以得到,因此 bap 的值可在编译时计算出来后保存在数组 a 的相关符号表项里。此后,在计算数组 a 的元素地址时仅需计算 Vap 的值而直接引用 bap 值。 实现数组元素的地址计算时,将产生两组四元式序列: 对数组元素的引用和赋值就有如下两种不同的四元式: 变址存数:若有 T1[T]=X,则可以用四元式([]=,X,_,T1[T])表示。 变址取数:若有 X=T1[T],则可用四元式(=[],T1[T],_,X)表示。 一组计算 bap,其值存放在临时变量 T 中; 一组计算 Vap,其值存放在临时变量 T1 中,即用 T1[T]表示数组元素的地址。 定义一个含有数组元素的赋值语句文法G[A]如下: (1) A→V=E (2) V→i[elist]∣i (3) elist→elist,E∣E (4) E→E+E∣(E)∣V 其中:A 代表赋值语句;V 代表变量名;E 代表算术表达式;elist 代表由逗号分隔的表达式,它表示数组的一维下标;i 代表简单变量名或数组名。 G’[A]: (1) A→V=E (2) V→elist]∣i (3) elist→elist,E∣i[E (4) E→E+E∣(E)∣V 为了能够及时计算数组元素的 Vap, 把数组名 i 和最左的下标式写在一起的目的是在整个下标串 elist 的翻译过程中随时都能知道数组名 i 的符号表入口,从而随时能够了解登记在符号表中有关数组 i 的全部信息。 elist.ARRAY:表示数组名在符号表的入口。 elist.DIM:计数器,用来计算数组的维数。 elist.place:登录已生成 Vap 中间结果的单元名字在符号表中的存放位置,或是一个临时变量的整数码。 limit(ARRAY,k):参数 ARRAY 表示数组名在符号表的入口,k 表示数组当前计算的维数;函数 limit()计算数组 ARR
文档评论(0)