北京外国语大学《编译原理》课件-第4章 语法制导翻译生成中间代码.pptVIP

  • 0
  • 0
  • 约5.72万字
  • 约 257页
  • 2023-04-26 发布于河北
  • 举报

北京外国语大学《编译原理》课件-第4章 语法制导翻译生成中间代码.ppt

大学,本科,专科,硕士,笔记,课件,期中试卷答案,期末试卷答案,教材答案,知识点,经济法,材料科学基础,材料力学,电路,电子技术基础,高频电子线路,宏观经济学,模拟电路基础,模拟电子技术,数字电路,数字电子技术,数字信号处理,通信原理,信号与系统,化工原理,机械设计基础,机械原理,机械制图,微机原理与接口技术,C++程序设计,JAVA技术与应用,MATLAB基础与应用,计算机网络,计算机组成原理,软件工程数据结构,工程力学,工程热力学,结构力学,力学,流体力学,水力学,工程测量,工程经济学,工程

图4.19 标记真、假值链的注释分析树 4.8 控 制 语 句 在程序设计语言的可执行语句中,除了顺序执行的语句之外,更多的是一大类控制语句。控制语句可以根据程序员的意志,有条件或无条件地改变程序执行的顺序,以反映程序员的意图。控制语句可以大概分为四类:无条件转移、条件转移、循环、分支(分情况)。不同程序设计语言表示这四类语句的语法可能会有不同,但语义基本是一致的。 无条件转移是指将程序控制流无条件地转向某个地方,典型的如goto L,它将程序的控制无条件转向标号L所指的语句。由于goto语言的随意性破坏了程序的结构,大部分结构化的程序设计语言还提供结构化的无条件转移语句,如break、exit等,它们不是转向某个特定语句,而是退出某个局部范围,如某个分支、某层循环或者某个过程等。 条件转移是根据条件执行程序的某个分支或者某个部分,典型的如if-then-else和while-do语句。在if语句中,若条件成立,则转向执行then部分的语句,否则执行else部分的语句。在while语句中,若条件成立,则执行do部分的语句,否则结束。由于while语句是可以循环执行的,所以也被认为是循环语句,此处将它界定为条件转移的根据是:决定while循环中的语句执行还是不执行,执行多少次等,是根据布尔表达式的条件是否成立,而不是根据设定循环的下限、上限和步长来确定。 循环语句是指可以根据设定的下限、上限和步长确定循环执行若干次的语句,如for-loop语句。分支语句是根据表达式的不同取值执行不同的语句序列的语句,如case或switch语句等。循环语句和分支语句与条件语句的区别在于:控制程序流程的条件是算术表达式还是布尔表达式,其他部分的翻译是相通的。本节仅讨论无条件转移和条件转移,它们基于如下的文法: S → id : S (1) | goto id (2) | if E then S (3) | if E then S else S (4) | while E do S (5) | A (6) | begin L end (7) L → L; S (8) | S (9) ?(G4.10) 4.8.1 标号与无条件转移 虽然无条件转移语句的随意性破坏了程序的结构,在程序设计中使用它被认为是有害的,但是它随意转向的灵活性也是其它语句无法替代的。因此,许多程序设计语言均保留这一语句类型。 无条件转移一般有两个要素:标号所标记的位置和goto所转向的标号。起标记位置作用的标号被称为标号的定义出现,如产生式(1)中的id;用于goto转向的标号被称为标号的引用出现,如产生式(2)中的id。 在一定的作用域内,标号仅可以定义一次,而可以引用多次。当标号定义出现时,可以将它的有关信息填写进符号表中;而当标号引用出现时,就可以根据符号表中的信息生成正确转移的三地址码。但是,在有些情况下,标号的引用先于标号的定义。当引用发生时,由于符号表中还没有标号定义的信息,不知道应该转向何处。显然,采用借助符号表的拉链与回填方法可以很好地解决这一问题。 首先,在符号表中为标号设置以下信息域。 .type:记录标识符的类型,如标号或未知; .def: 若是标号,记录是否已定义,如未定义或已定义; .addr:标号定义前作为链头,标号定义后作为此标号对应三地址码的序号。 同时引入一个过程fill(entry(id.name), a, b, c),分别将a、b、c填写到符号表中标识符id的.type、.def、.addr域中。 (5)? EL → EL1 , E { T:=newtemp; k:=EL1.dim+1; dk:=limit(EL1.array, k); emit(T :=EL1.place * dk); emit(T := E.place + T); EL.array:= EL1.ar

文档评论(0)

1亿VIP精品文档

相关文档