文档详情

编译原理第08章 语法制导翻译和中间代码生成.ppt

发布:2017-10-31约1.48万字共8页下载文档
文本预览下载声明
翻译规则(二) 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 ?
显示全部
相似文档