- 1、本文档共8页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
编译原理第08章 语法制导翻译和中间代码生成
翻译规则(二) V ?i { V .PLACE:=ENTRY(i); V.OFFSE:=null} elist ? elist1,E { T:=NEWTEMP; k:=elist1.DIM+1; dk:=LIMIT(elist1.ARRAY,k); GEN(*,elist1.PLACE, dk,T); GEN(+,E.PLACE,T,T); elist.ARRAY:=elist1.ARRAY; elist.PLACE:=T; elist.DIM:=k} elist ? i[E { elist.PLACE:= E.PLACE; elist.DIM:=1; elist.ARRAY:= ENTRY(i)} 结构(记录)说明和引用的翻译 结构(记录)是由已知类型的数据组合起来的一种数据类型。 结构的基本形式 结构说明的文法 主要语义变量说明: 对于非终结符type、f和n,我们分别用不同的语义变量LEN表示长度,i.NAME表示i当前所代表的名字,f.NAME表示分量名。n.VAL表示整数值。语义过程FILN (NAME,L)和FILO(NAME,L)将分别把分量名表中名为NAME的项的长度LEN和OFFSET填为L。 处理结构类型说明的基本语义动作 结构的基本形式 Struct date{ int day; char month_name[4]; int year; }; 通常,程序设计语言中对结构的引用只限于对其成员(分量)的引用,不提供访问整个结构的手段(不过,PASCAL中可把记录作为一个单位来复制)。 引用有两种方式 一种形式为:结构(记录)名.成员(分量)名 另一种形式是通过指针访问 结构说明的文法 type ? struct {f1}; type ?int type ?char type ?pointer f1 ?f1;f|f f ? type i| type i[n] 处理结构类型说明的基本语义动作 f ? type i {f.NAME:=i.NAME; f.LEN:= type.LEN; FILN(i.NAME, f.LEN)} f ? type i[n] {f.NAME:=i.NAME; f.LEN:= type.LEN*n.VAL; FILN(i.NAME, f.LEN)} f1 ?f {FILO(f.NAME,0); /*第一分量的相对数为0*/ f1.LEN:= f.LEN} f1 ?f1(1);f {FILO(f.NAME,f1 (1).LEN); f1.LEN:= f1(1).LEN, +f1.LEN} type ? struct ‘{’ f1 ‘}’ {type.LEN:=f1.LEN} type ?char {type.LEN:=1} type ?int {type.LEN:=4} type ?pointer {type.LEN:=4} * 0512 * 0522 ab or cd and ef的四元式代码 (1) if ab goto E.ture (2) goto (3) (3) if cd goto (5) (4) goto E.false (5) if ef goto E.ture (6) goto E.false If ab or cd and cf then S1 else S2的四元式代码 (1) if ab goto (7) (2) goto (3) (3) if cd goto (5) (4) goto (p+1) (5) if cf goto (7) (6) goto (p+1) (7) (关于S1的四元式) ┇ (p) goto (q) (p+1) (关于S2的四元式) ┇ (q)??? 整个布尔表达式的真出口 整个布尔表达式的假出口 控制结构的翻译 条件转移语句 开关语句 for循环语句 出口语句 goto语句 过程调用的四元式产生 条件转移语句 条件转移语句的文法 文法的改写及文法的语义动作 条件转移语句的文法 G[S]: (1)S ? if E then S (2) S ? if E then S else S (3) S ? while E do S (4) S ? begin L end (5) S ? A (6) L ? L; S (7) S ? S 其中各非终结符号的意义是: S——语句 L——语句串 A——赋值句 E——布尔表达式 文法的改写与语义动作 G’[S]: (1)S ? C S1 (2) S ? Tp S2 (3) S ? Wd S3 (4) S ? begin L end (5) S ? A (6) L ?
文档评论(0)