- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* * * * 例子 表达式:c+a[i][j] 类型检查和转换 类型系统: 给每一个组成部分赋予一个类型表达式 通过一组逻辑规则来表示这些类型表达式必须满足的条件 可发现错误、提高代码效率、确定临时变量的大小、… 类型系统的分类 类型综合 根据子表达式的类型构造出表达式的类型 if f 的类型为s?t且x的类型为s then f(x)的类型为t 类型推导 根据语言结构的使用方式来确定该结构的类型: if f(x)是一个表达式 then 对于某些类型α,β;f的类型为α?β且x的类型为α 类型转换 假设在表达式x*i中,x为浮点数、i为整数,则结果应该是浮点数 x和i使用不同的二进制表示方式 浮点*和整数*使用不同的指令 t1 = (float) i t2 = x fmul t1 类型转换比较简单时的SDD: E?E1 + E2 { if(E1.type = integer and E2.type = integer) E.type = integer; else if (E1.type = float and E2.type= integer) E.type = float;} } 这个规则没有考虑生成类型转换代码 类型的widening和narrowing Java的类型转换规则 编译器自动完成的转换为隐式转换,程序员用代码指定的转换为显式转换。 处理类型转换的SDT 函数Max求的是两个参数在拓宽层次结构中的最小公共祖先 Widen函数已经生成了必要的类型转换代码 函数/运算符的重载 通过查看参数来解决函数重载问题 E?f(E1) { if f.typeset = {si?ti|1= i= k} and E1.type=sk then E.type = tk } 控制流的翻译 布尔表达式可以用于改变控制流/计算逻辑值。 文法 B ? B‖B | B B | !B | (B) | E rel E | true | false 语义 B1‖B2中B1为真时,不计算B2,整个表达式为真。因此,当B1为真时应该跳过B2的代码。 B1B2中B1为假时,不计算B2,整个表达式为假 短路代码 通过跳转指令实现控制流的处理 逻辑运算符本身不在代码中出现; 短路代码的例子 语句: if (x100 || x200 x!= y) x = 0; 代码 if x 100 goto L2 ifFalse x 200 goto L1 ifFalse x != y goto L1 L2: x=0 L1: 接下来的代码 注: 当x100为真时,直接执行x=0; 所以执行x200时,x100必然为假 同理:计算x!=y时,x100为假,而x200为真 控制流语句的翻译 文法:B表示布尔表达式,S代表语句 S? if (B) S1 S? if (B) S1 else S2 S?while (B) S1 代码的布局见右图 继承属性 B.true:B为真的跳转目标 B.false:B为假的跳转目标 S.next:S执行完毕时的跳转目标 语法制导的定义(1) 语法制导的定义(2) 增量式生成代码: S? while ( {begin = newlabel(); B.true = newlabel; B.false = S.next; gen(begin ‘:’)} B ) {gen(B.true ‘:’);S1.next=begin;}S1{gen(‘goto’ begin);} 布尔表达式的控制流翻译 生成的代码执行时跳转到两个标号之一。 表达式的值为真时,跳转到B.true 表达式的值为假时,跳转到B.false B.true和B.false是两个继承属性,根据B所在的上下文指向不同的位置 如果B是if语句的条件表达式,分别指向then分支和else分支;如果没有else分支,则指向if语句的下一条指令 如果B是while语句的条件表达式,分别指向循环体的开头和循环出口处; 布尔表达式的代码的SDD(1) 布尔表达式的代码的SDD(2) 布尔表达式代码的例子 if (x100 || x 200 x!= y ) x = 0; 的代码 布尔值和跳转代码 程序中出现布尔表达式的目的可能就是求出它的值。比如x=ab; 处理方法: 首先建立表达式的语法树,然后根据表达式的不同角色来处理。 文法: S ? id = E; | if (E) S | while (E) S | S S E? E‖E | E E | E rel E | … 根据E的语法树结点所在的位置: S?while ( E ) S1中的E,生成跳转代码 对于S?id =
文档评论(0)