Microsoft PowerPoint - 7-Semantic_IR12.ppt [兼容模式]

Size: px
Start display at page:

Download "Microsoft PowerPoint - 7-Semantic_IR12.ppt [兼容模式]"

Transcription

1 中间代码生成 第七章 : 语义分析和中间代码生成 赵银亮 词法分析 语法分析 中间代码生成 中间代码的表示形式有多种 : 逆波兰表示三地址码 ( 三元式 四元式 ) 抽象语法树 P- 代码 属性文法是实现中间代码生成的常用手段 2012 本章内容 : 几种中间表示说明语句的翻译简单算术表达式和赋值句到四元式的翻译布尔表达式到四元式的翻译控制语句的翻译数组元素的引用过程调用 7.1 中间表示的概念 抽象语法树 vs 类目标代码 是否涉及目标机及运行时环境的信息 : 数据类型的尺寸 ; 寄存器前端 IR 后端变量的存储位置 是否使用符号表中的全部信息 : 作用域 嵌套层次变量的偏移量 其它用途 : 用于代码分析以产生高效目标代码用于多目标编译 1

2 7.1.1 后缀式 - 逆波兰表示 一个表达式 E 的后缀形式可以如下定义 : 如果 E 是一个变量或常量, 则 E 的后缀式是 E 自身 ; 如果 E 是 E 1 op E 2 形式的表达式, 其中 op 是任何二元操作符, 则 E 的后缀式为 E 1 E 2 op, 其中 E 1 和 E 2 分别为 E 1 和 E 2 的后缀式 ; 如果 E 是 (E 1 ) 形式的表达式, 则 E 1 的后缀式就是 E 的后缀式 运算对象出现的顺序相同 运算符按实际计算次序从左到右排列 对后缀式求值 后缀式的特点 : 逆波兰表示法不用括号 只要知道每个算符的目数, 对于后缀式, 不论从哪一端进行扫描, 都能对它进行唯一分解 适合于采用栈来求值 : 从左到右依次扫描后缀式中的各个符号, 每遇到运算对象, 就进栈 ; 每碰到 k 目运算符, 就弹出栈顶 k 个运算对象进行运算, 并将结果进栈 结束时, 栈顶为整个表达式的值 x/y^z-d*e A+B AB+ A+B*C ABC*+ x/y^z-d*e xyz^/de*- (a=0 b>3) (e x y) a0=b3> exy xyz^/de*- 把表达式翻译成后缀式的语义规则描述 补充 : 属性文法 产生式 E E (1) op E (2) E (E (1) ) E id 语义动作 E.code:= E (1).code E (2).code op E.code:= E (1).code E.code:=id 语义分析涉及到计算额外信息 ( 语法分析之外的信息 ); 这些信息与程序的语义有关 ; 编译阶段进行的语义分析叫静态语义分析 ; 构造符号表 ; 类型检查 ; 类型推理 ; E.code 表示 E 后缀形式 op 表示任意二元操作符 表示后缀形式的连接 2

3 进行语义分析的手段 语义表示上的困难性缺乏标准的方法描述语言的语义 ; 语义分析中的量和种类在不同语言间变化很大 ; 属性文法标识语言实体的属性 ; 写出属性方程 ( 或语义规则 ) 表达属性计算与语法规则之间的关系 ; 属性与属性方程的集合叫属性文法 ; 适用于语法制导的语言 ( 语义密切关联于语法 ) 属性 + 属性方程 = 属性文法 标识语言实体 (language entity) 的属性 An entity is something that has a distinct, separate existence, though it need not be a material existence. 写出属性方程 ( 语义规则 ): 表明如何把这些属性的计算跟文法规则相关联 ; 属性文法如何使用? 计算属性值运用属性文法进行语义分析 属性文法, 另一种定义 An attribute grammar is a context-free grammar that has been extended to provide context-sensitive information by appending attributes to some of its nonterminals. Each distinct symbol in the grammar has associated with it a finite, possibly empty, set of attributes. Each attribute has a domain of possible values. An attribute may be assigned values from its domain during parsing. Attributes can be evaluated in assignments or conditions. 属性 属性 : 是任意一个跟语言构造相关的特性 A language construct is a syntactically allowable part of a program that may be formed from one or more lexical tokens in accordance with the rules of a programming language. 属性举例 : 变量的类型 ; 表达式的值 ; 变量在存储器中的位置 ; 过程 (procedure) 的目标代码 ; 数中有效位数 3

4 属性的特点 属性所包含的信息 复杂程度 能够确定其值的时间区间等都有较大的范围 编译之前确定 数中有效位数 ; 编译过程中确定 执行之前确定 为语言构造指定属性 给定上下文无关文法, 为它的每个文法符号关联相关的 值 ( 称为属性 ), 以表示与这些文法符号相关的信息 使用的场合语法词法代码优化与生成 表达式的值 ; 动态分配的数据结构的地址 ; 属性的 binding 计算属性的值及将其跟语言构造建立联系的过程, 属性绑定发生的时刻称为绑定时间静态 : 在编译过程中 ( 执行之前 ) 动态 : 在执行时 变量的类型 ;(C/Pascal/Lisp Type Checker) 表达式的值 ;(Code/Constant Folding) 变量在存储器中的位置 ;(Static/ynamic Allocation) 过程 (procedure) 的目标代码 ;(Static) 数中有意义数字的个数 (Runtime Env.) 属性方程的表示 将属性值 a 与文法符号 X 联系起来, 记为 X.a 对于产生式规则 X 0 X 1 X 2 X n, 有 X i.a j = f ij (X 0.a 1,,X 0.a k,x 1.a 1,,X 1.a k,,x n.a 1,,X n.a k ) 其中,f ij 为数学函数, 则称为属性方程或语义规则一般采用表格方式表示 4

5 属性文法的表示形式 补充完 文法规则 语义规则 产生式规则 1 关联的属性方程 ( 多个 ) 产生式规则 n 关联的属性方程 ( 多个 ) 产生式 E E (1) op E (2) E (E (1) ) E id 语义动作 {E.code:= E (1).code E (2).code op} {E.code:= E (1).code} {E.code:=id} E E (1) op E (2) E (E (1) ) E id E.code:= E (1).code E (2).code op E.code:= E (1).code E.code:=id 数组 POST 存放后缀式 :k 为下标, 初值为 1 上述语义动作另一种形式 : 产生式 语义动作 E E (1) op E (2) {POST[k]:=op; k:=k+1} E (E (1) ) {} E i {POST[k]:=i; k:=k+1} 例 : 输入串 a+b+c 的分析和翻译 POST: a b + c + 后缀式的一般情况 op 为 k 目运算符, 则 op 作用于 e 1 e 2 e k 的结果用 e 1 e 2 e k op 来表示 例 : if a then if c-d then a+c else a*c else a+b a?c-d?a+c:a*c:a+b a cd- ac+ ac*? ab+? 5

6 后缀式表示中注意的问题 exy? 的语义期望 : e 不等于 0, 返回 x 值, 否则返回 y 值. 实际 : x 和 y 都要计算, 但只返回其中一个的值 问题 语义差异 : 运算对象无定义或者有副作用, 则后缀表示法不仅无效, 而且可能是错误的 ; 代码效率 后缀式表示实现 将后缀式表示存放在一维向量 POST[1..n] 中 引入转移操作 : p BR 无条件转至 POST[p] e p BZ 当 e 值为 0 转 POST[p], 其中 e 是某表达式 e 的后缀式表示 e1 e2 p BL 当 e1 <e2 时转向 POST[p] 类似地还可以定义 BN( 非 0 转 ) BP( 正号转 ) BM( 负号转 ) 后缀式表示实现 ( 例 ) IF e THEN s1 e p2 BZ s1 p2 BR e p2 BZ s1 p2: IF e THEN s1 ELSE s2 e p1 BZ s1 p2 BR p1:s2 p2 BR e p1 BZ s1 p2 BR p1:s2 p2: POST e p 1 BZ s 1 p 2 BR s 2 p 1 p 2 其中 e, s1, s2 是 e, s1, s2 的后缀式表示, p1 表示 s2 在 POST 中的开始位置,p2 表示该 IF 语句的后继 6

7 利用属性文法产生后缀式表示 属性 addr: 纪录运算对象的起始位置向量 POST 和指针 p E1 E2+T {E1.addr=E2.addr; POST[p]= + ; p++;} E T {E.addr=T.addr} T1 T2*F {T1.addr=T2.addr; POST[p]= * ; p++;} T F {T.addr=F.addr;} F (E) {F.addr=E.addr;} F id {F.addr=p; POST[p]=lookup(id); p++;} 步骤 符号栈 R 输入串 动作 后缀表示 0 # a +b*c# shift 1 #a + b*c# 归约 F->id;Sub6 a 2 #F + b*c# 归约 T->F;Sub4 a 3 #T + b*c# 归约 E->T;Sub2 a 4 #E + b*c# shift a 5 #E+ b *c# shift a 6 #E+b * c# 归约 F->id;Sub6 ab 7 #E+F * c# 归约 T->F;Sub4 ab 8 # E+T * c# shift ab 9 # E+T* c # shift ab 10 # E+T*c # 归约 F->id;Sub6 abc 11 # E+T*F # 归约 T->T*F;Sub3 abc* 12 #E+T # 归约 E->E+T;Sub1 abc*+ 13 #E # abc* 图表示法 a:=b*(-c)+b*(-c) 的图表示法 图表示法 AG 抽象语法树 assign assign 无循环有向图 (irected Acyclic Graph, 简称 AG) 对表达式中的每个子表达式,AG 中都有一个结点一个内部结点代表一个操作符, 它的孩子代表操作数在一个 AG 中代表公共子表达式的结点具有多个父结点 a + * b uminus b c 抽象语法树 * uminus c a + * b AG uminus c 7

8 抽象语法树与中间代码对应示例 对应的代码 : assign a + T 1 :=-c T 2 :=b*t 1 * * T 3 :=-c b uminus b c uminus c T 4 :=b*t 3 T 5 :=T 2 +T 4 a:=t 5 抽象语法树 例 :AG 与中间代码 assign a + * b uminus c AG 抽象语法树对应的代码 : T 1 :=-c T 2 :=b*t 1 T 3 :=-c T 4 :=b*t 3 T 5 :=T 2 +T 4 a:=t 5 AG 对应的代码 : T 1 :=-c T 2 :=b*t 1 T 5 :=T 2 +T 2 a:=t 5 产生赋值语句抽象语法树的属性文法 三地址代码 文法规则 S id:=e E E 1 +E 2 E E 1 *E 2 E -E 1 E (E 1 ) E id 语义规则 S.tree=mkNode(:=, mkleaf( id, id.place), E.tree) E.tree=mkNode(+, E 2.tree, E 2.tree) E.tree=mkNode(*, E 1.tree, E 2.tree) E.tree=mkNode(uminus, E 1.tree, nil) E.tree=E 1.tree F.tree=mkLeaf(id, id.place) 三地址代码 x:=y op z 三地址代码可以看成是抽象语法树或 AG 的一种线性表示 8

9 三地址语句示例 x:=y op z x:=op y x:=y goto L if x relop y goto L 或 if a goto L par x 和 call p,n, 以及返回语句 return y x:=y[i] 及 x[i]:=y 的索引赋值 x:=&y, x:=*y 和 *x:=y 的地址和指针赋值 例 : 2*a+(b-3) + * - 2 a b 3 t1 = 2 * a t2 = b 3 t3 = t1 + t2 t2 = b 3 t1 = 2 * a t3 = t2 + t1 产生临时变量 ; 临时变量跟抽象语法树的内结点对应 ; 语句的次序 ; 操作符扩充 ; 一个程序段的三地址代码表示 : read x; if 0 < x then fact := 1; repeat fact := fact * x; x := x 1 until x = 0; write fact end read x; t1 = x > 0 if_false t1 goto L1 fact = 1 label L2 t2 = fact * x fact = t2 t3 = x 1 x = t3 t4 = x == 0 if_false t4 goto L2 write fact label L1 halt 三地址码的实现 : 四元组 四元组 (op, arg1, arg2, result) op 是一个二元 ( 也可一元或零元 ) 运算符 arg1, arg2 分别为两个运算对象, 可以是变量 常数 临时变量等等 ( 可以缺省 ) 运算结果在 result 中跟符号表有关系 2*a+(b-3) (*, 2, a, T1) (, b, 3, T2) t1 = 2 * a t2 = b 3 (+, T1, T2, T3) t3 = t1 + t2 9

10 四元组举例 : read x; t1 = x > 0 if_false t1 goto L1 fact = 1 label L2 t2 = fact * x fact = t2 t3 = x 1 x = t3 t4 = x == 0 if_false t4 goto L2 write fact label L1 halt (rd,x,_,_) (gt,x,0,t1) (if_f,t1,l1,_) (asn,1,fact,_) (lab,l2,_,_) (mul,fact,x,t2) (asn,t2,fact,_) (sub,x,1,t3) (asn,t3,x,_) (eq,x,0,t4) (if_f,t4,l2,_) (wri,fact,_,_) (lab,l1,_,_) (halt,_,_,_) 三地址码的实现 : 三元组 (op, arg1, arg2) op 是一个二元 ( 也可一元或零元 ) 运算符 ; arg1, arg2 分别为两个运算对象 : 可以是变量 常数 临时变量等等 ( 可以缺省 ) ; 也可以是某个三元式的序号 ; 跟符号表有关系 2*a+(b-3) t1 = 2 * a t2 = b 3 t3 = t1 + t2 (1) (*, 2, a) (2) (, b, 3) (3) (+, (1), (2)) 三元组举例 : (0) (rd,x,_) (1) (gt,x,0) (2) (if_f,(1),11) (3) (asn,1,fact) (4) (mul,fact,x) (5) (asn,(4),fact) (6) (sub,x,1) (7) (asn,(6),x) (8) (eq,x,0) (9) (if_f,(8),(4)) (10) (wri,fact,_) (11) (halt,_,_) (rd,x,_,_) (gt,x,0,t1) (if_f,t1,l1,_) (asn,1,fact,_) (lab,l2,_,_) (mul,fact,x,t2) (asn,t2,fact,_) (sub,x,1,t3) (asn,t3,x,_) (eq,x,0,t4) (if_f,t4,l2,_) (wri,fact,_,_) (lab,l1,_,_) (halt,_,_,_) 产生三地址码的属性文法 例 : E id=e A A A+F F F (E) num id 属性 name: 记录临时变量名 属性 code: 记录已生成的代码 10

11 方法 1: 用符号串表示代码 方法 2: 用符号串表示代码 E 1 id=e 2 E A A 1 A 2 +F A F F (E) F num F id E 1.name=id.strval E 1.code=E 2.code++id.strval = E 2.name E.name=A.name; E.code=A.code A 1.name=newtemp() A 1.code=A 2.code++F.code++ A 1.name = A 2.name + F.name A.name=F.name; A.code=F.code F.name=E.name; F.code=E.code F.name=num.strval; F.code= F.name=id.strval; F.code= 语法规则 S id:=e E -E 1 E E 1 +E 2 E (E 1 ) E id 语义规则 S.code=E.code gen(id.place := E.place) E.place=newtemp() E.code=E 1.code gen(e.place := minus E 1.place) E.place=newtemp() E.code=E 1.code E 2.code gen(e.place := E 1.place + E 2.place) E.place=E 1.place ; E.code=E 1.code E.place=id.place; E.code= ++ 串连接, 包括 1 个换行 ; 串连接, 包括 1 个空格 ++ 串连接, 包括 1 个换行 ; 串连接, 包括 1 个空格 7.2 说明语句的翻译 例 6.3 变量声明 TL T int float L id, L id 文法规则 TL T int T float L 1 id, L 2 L id 语义规则 L.dtype=T.dtype T.dtype=integer T.dtype=real id.dtype=l 1.dtype L 2.dtype=L 1.dtype id.dtype=l.dtype 题目 : 求一个 3*3 矩阵对角线元素之和 main() { int i,j; float a[3,3],sum; sum=0; printf("please input rectangle elements:\n"); for(i=0;i<3;i++) for(j=0;j<3;j++) scanf("%f",&a[i,j]); for(i=0;i<3;i++) sum=sum+a[i,i]; printf( Sum of the diagonal elements is %6.2f\n",sum); } 过程中的说明语句 P ; TL T int float L id, L id 文法规则语义规则 P offset=0 1 2 ; 3 TL T int T float L 1 id, L 2 L id L.type=T.type; L.width=T.width T.type=integer;T.width=4 T.type=real;T.width=8 题目 : 求一个 3*3 矩阵对角线元素之和 main() { int i,j; float a[3,3],sum; sum=0; printf("please input rectangle elements:\n"); for(i=0;i<3;i++) for(j=0;j<3;j++) scanf("%f",&a[i,j]); for(i=0;i<3;i++) sum=sum+a[i,i]; printf( Sum of the diagonal elements is %6.2f\n",sum); } lookup(id.name, L 1.type, offset); L 2.type=L 1.type; L 2.width=L 1.width; offset=offset+l 1.width lookup(id.name, L.type, offset); offset=offset+l.width 11

12 补充 : 综合属性与继承属性 一个属性是综合属性是指在语法树中, 该属性的值由其孩子结点的属性值计算而得 a 是综合属性, 若给定 A X 1 X 2 X n, 唯一与其关联的属性方程中 a 在等号左边 A.a = f(x 1.a 1,,X 1.a k,,x n.a 1,,X n.a k ) 继承属性 不是综合属性的属性是继承属性 语法树中, 一个结点的继承属性由此结点的父结点和或兄弟结点的某些属性确定 a A A S- 属性文法所有属性都是综合属性的属性文法 a B a (a) Inheritance from parent to siblings C a B a (b) Inheritance from sibling to sibling C 补充 : 依赖图 TL dtype L L.dtype T int float L id, L id T dtype dtype L dtype id, dtype L id.dtype L.dtype 文法规则 语义规则 TL L.dtype=T.dtype T int T.dtype=integer T float T.dtype=real L 1 id, L 2 id.dtype=l 1.dtyp e L 2.dtype=L 1.dtyp e L id id.dtype=l.dtype T.dtype L.dtype id.dtype L.dtype L.dtype L.dtype id.dtype T dtype dtype float dtype id, float x,y L dtype dtype L id 12

13 作用域 P ; TL proc id;;s func id;;s T int float L id, L id program sort(input,output) var a: array[0..10] of int; x:int; proc readarray; var i:int; begin a.end; proc exchange(i,j:int); begin x:=a[i];a[i]:=a[j];a[j]=x end; proc quicksort(m,n:int); var k,v:int; func partition (y,z:int):int; var i,j:int; begin a v exchange(i,j); end; begin end; begin end. header nil header Sort a x readarray exchange quicksort header i j i header header k v partition program sort(input,output) var a: array[0..10] of int; x:int; proc readarray; var i:int; begin a.end; proc exchange(i,j:int); begin x:=a[i];a[i]:=a[j];a[j]=x end; proc quicksort(m,n:int); var k,v:int; func partition (y,z:int):int; var i,j:int; begin a v exchange(i,j); begin end; begin end. 属性及过程的定义 mktable(tab) 创建一个符号表, 父表指针为 tab; Enter(tab,name,type,offset) 在 tab 所指符号表中为名字 name 建立一个登记项, 类型 type 和相对地址 offset 填入该项中 ; addwidth(tab,width) 在 tab 所指符号表表头中记录下该表中所有名字占用的总宽度 ; enterproc(tab, name, newtab) 在 tab 所指符号表中为名字 name 的过程建立一个登记项, 参数 newtab 指向 name 的符号表 处理嵌套过程中的说明语句 ( 方法 1) P M M ε addwidth(pop(s_tab), pop(s_offset)) t:=mktab(nil); push(t, s_tab); push(0,s_offset) ; t:= pop(s_tab); addwidth(t,pop(s_offset)) proc enterproc(top(s_tab), id.name, t) id;n 1 ;S id:t Enter(top(s_tab), id.name, T.type, top(s_offset)) push(pop(s_offset)+t.width, s_offset) N ε t:=mktab(top(s_tab)) pop(s_) 弹出 s_ 栈顶元素 ;top(s_) 返回 s_ 栈顶元素 ;push(e,s_) 压入 e 到栈 s_. push(t, s tab); push(0,s offset) 13

14 ( 方法 1) P M M ε ; proc id;n 1 ; S id:t N ε P M addwidth(pop(s_tab), pop(s_offset)) t:=mktab(nil); push(t, s_tab); push(0,s_offset) t:= pop(s_tab); addwidth(t,pop(s_offset)) enterproc(top(s_tab), id.name, t) enter(top(s_tab), id.name, T.type, top(s_offset)) push(pop(s_offset)+t.width, s_offset) t:=mktab(top(s_tab)); push(t, s_tab); push(0,s_offset) program sort(input, var a: array[0..10] x:int; proc readarray; N var i:int; begin a.end; proc exchange(i,j begin x:=a[i];a[i]:=a end; N proc quicksort(m, var k,v:int; func partition N var i,j:int; begin a v e begin end; begin end. P L id:t ( 方法 2) L L 1 L 2 ; proc id;l;s P L L L L.intab=mktab(nil); L.ioffs=0 P.symtab=L.outtab.outtab=.intab L Enter(.outtab, id.name, T.type,.ioffs).ooffs=.ioffs+T.width addwidth(.outtab,.ooffs)).intab=l.intab; L.outtab=.outtab.ioffs=L.ioffs;L.ooffs=.ooffs L 2.intab=L 1.intab;.intab=L 2.outtab L 1.outtab=.outtab; L 2.ioffs=L 1.ioffs L.ioffs=L 2.ooffs; L 1.ooffs=.ooffs L.intab=mktab(.intab); L.ioffs=0 addwidth(l.intab,l.ooffs)).outtab=.intab;.ooffs=.ioffs enterproc(.intab,id.name,.outtab) L L program sort(input, var a: array[0..10] x:int; proc readarray; var i:int; begin a.end; proc exchange(i,j begin x:=a[i];a[i]:=a end; proc quicksort(m, var k,v:int; func partition var i,j:int; L L begin a v e begin end; begin end. P L id:t ( 方法 2) L L 1 L 2 ; proc id;l;s L.it=mktab(nil); L.io=0 P.st=L.ot.ot=.it Enter(.ot, id.name, T.type,.io).oo=.io+T.width addwidth(.ot,.oo)).it=l.it; L.ot=.ot.io=L.io;L.oo=.oo ot outtab io ioffs nil 4 it inttab oo ooffs 说明语句的翻译的小结 P st L 2.it=L 1.it;.it=L 2.ot L 1.ot=.ot; L 2.io=L 1.io.io=L 2.oo; L 1.oo=.oo L.it=mktab(.it); L.io=0.ot=.it;.oo=.io addwidth(.ot,.oo)) enterproc(.ot,id.name,l.ot) it io x it ot L io oo it ot io=0l oo ot oo it ot io oo x int 0 f it ot proc f ; L ; S io=0 oo : int 简单变量的类型偏移量 ( 以过程为单位 ) 创建符号表符号表中添加登记项 结构型变量 ( 在后面介绍 ) 数组结构指针等 14

15 7.3 赋值语句的翻译 翻译赋值语句和算术表达式的属性文法类型转换数组处理 前面介绍过的一个例子 语法规则语义规则 S id:=e S.code=E.code gen(id.place := E.place) E -E 1 E.place=newtemp() E.code=E 1.code gen(e.place := minus E 1.place) E E 1 +E 2 E.place=newtemp() E.code=E 1.code E 2.code gen(e.place := E 1.place + E 2.place) E (E 1 ) E.place=E 1.place ; E.code=E 1.code E id E.place=id.place; E.code= ++ 串连接, 包括 1 个换行 ; 串连接, 包括 1 个空格 属性及过程定义 ( 产生四元组 ) 例 : 翻译简单赋值语句为四元组的属性文法 NewTemp() 函数过程, 返回一个新临时变量名 ( 一般用整数表示 ); Lookup(name) 以 name 为名字查符号表 : 查到返回入口, 否则加入该名字到符号表中并返回入口 ; E.place 表示存放 E 值的变量名在符号表的入口或者整数 ( 临时变量 ); Gen(op, arg1, arg2, result) 语义过程, 建立四元式 (op, arg1, arg2, result) 并填入四元式表中 A V:=E {if E.place=err or V.place=err then A.place=err else {A.place =ok; Gen(:=,E.place,nil,V.place)}} E E 1 +E 2 {if E 1.place=err or E 2.place=err then E.place=err else {E.place=NewTemp(); Gen(+,E 1.place,E 2.place,E.place)}} E E 1 *E 2 {if E 1.place=err or E 2.place=err then E.place=err else {E.place=NewTemp(); Gen(*,E 1.place,E 2.place,E.place)}} E (E 1 ) {E.place=E 1.place} E V {E.place=V.place} E num {E.place=lexval(num)} V id {V.place=(p:=Lookup(id.name))? p : err} 15

16 去掉错误处理部分 A V:=E E E 1 +E 2 {Gen(:=,E.place,nil,V.place)} {E.place=NewTemp(); Gen(+,E 1.place,E 2.place,E.place)} E E 1 *E 2 {E.place=NewTemp(); Gen(*,E 1.place,E 2.place,E.place)} E (E 1 ) E V E num V id {E.place=E 1.place} {E.place=V.place} {E.place=lexval(num)} {V.place=Lookup(id.name)} 类型转换 A V:=E {Gen(:=,E.place,nil,V.place);} E E 1 +E 2 {E.place=NewTemp(); Addr 为实数加 if E 1.type=int then if E 2.type=int then Gen(addi,E 1.place,E 2.place,E.place) else {tmp=newtemp(); Gen(itor, E 1.place, nil, tmp);gen(addr,tmp,e 2.place,E.place);} else if E 2.type=int then {tmp=newtemp(); Gen(itor, E 2.place, nil, tmp); Gen(addr,E 1.place,tmp,E.place);} else Gen(addr, E 1.place,E 2.place,E.place); E.type= } E E 1 *E 2 { 跟上面相似, 将 addi 和 addr 分别换成 muli 和 mulr} E (E 1 ) {E.place=E1.place; E.type= } E V {E.place=V.place; E.type= } E intnum realnum {E.place=lexval(num); E.type= } V id {V.place=lookup(id.name; V.type= } 数组元素引用 数组说明与下标变量的语义 数组说明与下标变量的语义地址计算公式四元式中数组元素表达形式赋值语句中数组元素的翻译 数组说明 float a[size] ; int i,j; 数组元素引用 a[i+1]=a[j*2]+3; 数组说明 var a: array[0..10] of int; 数组元素引用 a[i]:=a[j]+1; i,j:int; 数组说明 real x(-13,13) integer i,j 数组元素引用 x[i]=x[j]+1 数组元素的存放区域如何安排? 如何确定数组元素的偏移量? 16

17 数组说明与下标变量的语义 a[i+1] a + (i+1) * sizeof(int) a[t] base_address(a) + (t-lower_bound(a))*element_size(a) (1) 地址计算公式 对于一维数组 A[i]: 下标的变化范围 : l i u 连续存储区的首址 :base, 每个数组元素占用 w 个单元则 A[i] 地址为 :base+(i-l)*w A[i] 地址 : base+(i-l)*w=(base-l*w)+i*w 固定部分 :base-l*w ( 在数组说明时即可确定 ) 变化部分 :i*w ( 在数组引用时确定, 即动态确定 ) (2) 数组说明 A[l:u] 的表示 符号表项 名字类型地址 A 数组 内情向量表 1 base Type/w C l u d 元素存储区域 A[1] A[2] 对于一维数组元素引用形式 A[i], 该元素的存储位置为 : base+(i-l)* w= base - C + i*w 地址计算公式 ( 续 ) 对于二维数组 A[i,j]: 下标的变化范围 : l 1 i u 1 ; l 2 j u 2 连续存储区的首址 :base, 每个数组元素占用 w 个单元则 A[i,j] 地址为 :base+[(i-l 1 )*(u 2 -l 2 )+j-l 2 ]*w base+[(i-l 1 )*(u 2 -l 2 )+j-l 2 ]*w =[base+(-l 1 *(u 2 -l 2 )-l 2 )*w] + [(i*(u 2 -l 2 )+j)*w] 固定部分 : base;(-l 1 *(u 2 -l 2 )-l 2 )*w 变化部分 : (i*(u 2 -l 2 )+j)*w 用维长表示 :(i*d 2 +j)*w 17

18 对于多维数组 A[i 1,i 2,,i n ]: 下标的变化范围 : l 1 i 1 u 1 ; ; l n i n u n 连续存储区的首址 :base, 每个数组元素占用单元 w 个 则 A[i 1,i 2,,i n ] 地址为 : base+(( ((i 1 -l 1 )*d 2 +(i 2 -l 2 ))*d 3 +(i 3 -l 3 ) ) )d n +(i n -l n ))*w =base-(( ((l 1 *d 2 +l 2 )*d 3 +l 3 ) )d n +l n )*w+ 注意 : CONSTPART 与数组各维的维长 d i 和数组的首址 base 相关 ( 在数组说明时可确定 ); VARPART 部分与下标变量的每个下标相关 ( 在运行时才能确定 ) 计算数组元素的地址时分别计算出 CONSTPART 和 VARPART, 对前者静态算出具体值, 而对后者则产生计算代码 i 1 *d 2 * *d n +i 2 *d 3 * *d n + +i n = base- ConstPart+ ( ((i 1 )*d 2 +i 2 )*d 3 +i 3 )*d 4 +i 4 ) )*d n +i n 静态数组 A[l 1 :u 1,, l n :u n ] 表示形式 计算可变部分 对于不变部分 Constpart, 产生代码 { T1 := base-c }; 符号表项名字类型地址 A 数组 内情向量表 n base Type/w C l 1 u 1 d 1 l n u n d n 数组元素存储区域 A[1,1,,1] A[1,1,,2] 可变部分 Varpart, 产生代码形如 {T:=Varpart}; 所以数组引用 A[i 1, i k ] 的地址为 T + T1, 使用变址指令 : 形式为 T1[T] (T1 为基址,T 为偏移量 ) 如此, 四元式的形式如下 : 变址取值 X:= T1[T] ( =[], T1[T], _, X) 变址存储 T1[T] := X ( []=, X, _, T1[T]) 18

19 (3) 赋值语句中的数组元素翻译 A V:= E V i[l] i L L,E E E E+E (E) V B A 数组 数组 1 base T B C l u d 2 base 2 T A C 2 l 1 u 1 d 1 l 2 u 2 d 2 文法允许数组元素嵌套定义,B[i]:=A[v,B[j]+w] 可变部分的计算 V i[l] i L L,E E e 1 =t 1 e m =e m-1 *d m +t m VARPART=( ((i 1 )*d 2 +i 2 )*d 3 +i 3 )*d 4 +i 4 ) )*d n +i n L.place V L] i L L,E i[e limit(i,k),k=3 对下标变量的处理 V L] i L L,E i[e e 1 =t 1 e m =e m-1 *d m +t m e2 L e3 L e4 L base-c w*e4v e1 L t1 t2 a [ E, E, E t3, E t4 ] 属性定义 L.arr 该数组名在符号表中的入口位置 L.dim 数组维数计数器, 随着归约新的下标而增加 L.place 存放已形成的 VARPART 部分, 可能是变量或临时变量 Limit(A,k) 函数过程, 数组 A 的第 k 维长度为 d k V.place 对于简单变量记录该变量名在符号表中的位置对于下标变量记录保存 CONSTPART 的那个临时变量 V.offset 简单变量 NULL( 用于区分简单变量和下标变量 ) 下标变量保存 VARPART 的临时变量 19

20 L.arr (3) 赋值语句中的数组元素翻译 A V:= E V L] i L L,E i[e E E+E (E) V A 数组 L.dim n T base C V.place A V:=E {if V.offset=NULL then Gen(:=,E.place,_,V.place) else Gen([]=,E.place,_,V.place[V.offset])} E E 1 +E 2 { t:=newtemp(); Gen(+,E 1.place,E 2.place,t); E.place := t } E (E 1 ) { E.place := E 1.place } L.place V.offset l 1 u 1 d 1 l n u n d n Limit(A,1) Limit(A,n) E V { if (V.offset=NULL) then E.place := V.place; else { t:=newtemp(); Gen (=[],V.place[V.offset],_,t); E.place:=t; } } V L] { t:=newtemp(); Gen(-,acc_base(L.arr),acc_C(L.arr),t); V.place:=t; t:=newtemp(); Gen(*, acc_w(l.arr), L.place, t); V.offset :=t } 例 : a 是一个 10*20 的数组,a[i+2,j+1]:= m+n 的翻译 A V := E V i { V.place:= Entry(i); V.offset:= NULL; } L ] m+n L L 1,E { t1:=newtemp(); k:= L 1.dim + 1; d k :=Limit(L 1.arr,k); Gen(*,L 1.place,d k,t1); t2:= NewTemp(); Gen(+,E.place,t1,t2); L.arr := L 1.arr; L.place := t2; L.dim := k; } L i[e { L.place := E.place; L.dim := 1; L.arr := Entry(i) } a L, [ E i+2 A V:= E V L] i L L,E i[e E E+E (E) V E j+1 (+, i, 2, T1) (+, j, 1, T2) (*, T1, 20, T3) (+, T2, T3, T4) (-, a, 21, T5) (*, 4, T4, T6) (+, m, n, T7) ([]=, T7, _,T5[T6]) 20

21 7.4 布尔表达式的翻译 布尔表达式的语义布尔表达式的求值布尔表达式作为条件的处理 布尔表达式的语义 文法 :E E E E E E (E) i i rop i C 语言 : &&! < == > <= >=!= if(1 < i && i < 10)... Pascal: AN OR NOT < = > <= >= if (x = 0) AN (a = 2) then... Fortran 逻辑表达式 :.AN..OR..NOT..LT..EQ..GT..LE..GE..NE. b = a.an. 3.LT. 5/2 布尔表达式的语义 ( 续 ) 布尔算符的优先级 : 顺序 :,, ; 其中 和 服从左结合 另外所有关系符的优先级相同, 高于任何布尔算符, 低于任何算术算符 由于大部分体系结构没有内置的布尔类型, 所以用 0 和 1( 或非 0) 分别表示 False 和 True 布尔表达式在语言中的作用 求值 logical a, b a =.TRUE. b = a.an. 3.LT. 5/2 作为控制语句中的条件 if(1 < i && i < 10)... 21

22 7.4.2 布尔表达式的求值 基本求值算法的实现 基本算法 : 如同算术表达式求值一样, 一步步地计算各部分的值, 进而计算出整个表达式的值 E E 1 E 2 E E 1 E 2 {E.place=newtemp(); gen(, E 1.place, E 2.place, E.place} {E.place=newtemp(); gen(, E 1.place, E 2.place, E.place} 例 A B C= (=, C,, T1) (, B, T1, T2) (, A, T2, T3) E E E (E 1 ) E i {E.place=newtemp(); gen(, E.place, NIL, E.place} {E.place=E 1.place} {E.place=i.name} E i 1 rop i 2 {E.place=newtemp(); gen(rop, i 1.place, i 2.place, E.place)} 布尔表达式的求值 ( 续 ) 短路算法 : A B if A then true else B A B if A then B else false A if A then false else true if((p!=null)&&(p->val==0)) 与基本算法的差别 : 运算量减少适用范围广 短路算法的实现问题 求值 : 转换成条件语句求值 A B if A then true else B A B if A then B else false A if A then false else true 作为条件 : 等价地转换成嵌套 if 语句 if E 1 E 2 then S1 else S2 if E 1 then if E 2 then S1 else S2 else S2 if E 1 E 2 then S1 else S2 if E 1 then S1 else if E 2 then S1 else S2 if E then S1 else S2 if E then S2 else S1 22

23 7.4.3 布尔表达式作为条件的处理 例 if A B< then S1 else S2 真出口, 假出口 if E 1 then if E 2 then S1 else S2 else S2 if E 1 then if E 2 then goto L-true else goto L-false else goto L-false; L-true: S1; goto L-next; L-false: S2; L-next: if E 1 then S1 else if E 2 then S1 else S2 if E 1 then goto L-true else if E 2 then goto L-true else goto L-false; L-true: S1; goto L-next; L-false: S2; L-next: if E then S1 else S2 if E then goto L-false else goto L-true; L-true: S1; goto L-next; L-false: S2; L-next: {E} 转向 E 为假时的目标 转向 E 为真时的目标 (1) (jnz,a,_,5) (2) (j,_,_,3) (3) (j<,b,,5) (4) (j,_,_,p+1) (5) {S1} (p) (j,_,_,q) (p+1) {S2} (q) { 下一语句 } 文法修剪 回填真假链的方法 E E 队列法 设 p q r 三条四元式均要转向 t 四元式 E G1: E-> E E E E E (E) i i rop i E G2: E -> E^ E E E E (E) i i rop i 填 E 真链 E^ -> E E 填 E 假链 -> E p( ). q( ). r( ). t( ) p q r Q.rear Q.front 23

24 回填真假链的方法 - 拉链返填 拉链返填法 ( 续 ) p(_,_,_,0). q(_,_,_,_) q(_,_,_,p) pq r p(_,_,_,0) p(_,_,_,t). q(_,_,_,p) q(_,_,_,t) rqp.ṙ(_,_,_,_).ṙ(_,_,_,q).ṫ(_,_,_,_).ṙ(_,_,_,q).ṙ(_,_,_,t).ṫ(_,_,_,_) qp 例 a x+y<0? G2: E E^E E E E (E) i i rop i E^ E E E b c z==8?? (jnz,a,-,3) (j,-,-,?) (jnz,a,-,?) (j,-,-,?) (+,x,y,t1) (jlz,t1,-,4) (j,-,-,?) (jnz,c,-,?) (j,-,-,6) (==,z,8,t2) (jnz,t2,-,?) (j,-,-,?)?? (jnz,a,-,3) (j,-,-,0) (jnz,a,-,0) (j,-,-,2) (+,x,y,t1) (jlz,t1,-,4) (j,-,-,0) (jnz,c,-,0) (j,-,-,6) (==,z,8,t2) (jnz,t2,-,4) (j,-,-,3) 属性及过程定义 nxq 下一个四元组的编号 merg(p, q) 把 p 链链接到 q 链尾, 返回 q bp(p, t) 把 p 链上所有四元组的第 4 区均回填为 t E.tc E 的代码中需回填真出口的那些四元组构成的链表 E.fc E 的代码中需回填假出口的那些四元组构成的链表 24

25 nxq 下一个四元组的编号 bp 回填 tc 或 fc merg 合并两个 tc 或 fc E i {E.tc=nxq; Gen(jnz,i,_,0); E.fc=nxq; Gen(j,-,-,0);} E^ E 1 {bp (E 1.tc, nxq); E^.fc=E 1.fc;} E E 1 {bp (E 1.fc, nxq); E.tc=E 1.tc;} E E^ E 1 {E.tc=E 1.tc; E.fc=merg (E^.fc,E 1.fc); } E E E 1 {E.fc=E 1.fc; E.tc=merg (E.tc,E 1.tc); } E i 1 rop i 2 {E.tc=nxq; Gen(jrop,i 1,i 2,0); E.fc=nxq; Gen(j,-,-,0);} E (E 1 ) {E.fc=E 1.fc; E.tc=E 1.tc;} E E 1 {E.tc=E 1.fc; E.fc=E 1.tc;} E 例 :(x a<b c=d ) e>f E E^E E E E (E) i i rop i E^ E E E E 5 6 x E^ 1 2? 2 E 3 4 ( E 5 6 ) E a 3? E < 3 4 b E^?6 c E E 7 8 = 5 6 E 7 8 e d > E->i {E.tc=nxq; Gen(jnz,i,_,0); E.fc=nxq; Gen(j,-,-,0);} E^->E 1 {bp (E 1.tc, nxq); E^.fc=E 1.fc;} E ->E 1 {bp (E 1.fc, nxq); E.tc=E 1.tc;} E-> E^ E 1 {E.tc=E 1.tc; E.fc=merg (E^.fc,E 1.fc); } E-> E E 1 {E.fc=E 1.fc; E.tc=merg (E.tc,E 1.tc); } f (jnz, x, -, 0) (j,-,-,0) (j<, a, b, 0) (j,-,-,0) (j=, c, d, 0) (j,-,-,0) (j>, e, f, 0) (j,-,-,0) (3) (2) (6) (5) (7) (5) (3) (7) 7.5 控制语句 标号和转移语句 分支与循环语句 标号和转移语句 标号的两种使用方法 L: S Goto L 语言中允许标号先定义后使用, 也允许先使用后定义 25

26 1 标号先定义后引用 L1 : S1 Goto L1 遇到 L1 : S1 符号表 名字 类型 定义否 地址 L1 标号 定义 P 1 P 1 : (,,,) 遇到 Goto L1 (j, _, _, P 1 ) 设标号对应的四元组从编号 P 1 开始 2 标号先引用后定义 q1 q2 q3 goto L2 goto L2 L2 : S2 名字类型 定义地址 q1 (j, _, _, 0 ) q3 q2 (j, _, _, q1 ) q3 L2 标号 未 q1 q2 q3 1 遇到 goto L2, 填符号表, 未定义, 把 NXQ 填入 L2 的地址部分, 作为链头 产生 ( j, _, _, 0) 2 遇到 goto L2, 查到未定义, 取符号表中 L2 的地址 q1 填入四元式 q2:(j, _, _,q1), 将 q2 填入符号表 3 遇到 L2:S2, 就可以回填 一般而言, 带标号语句产生式 S Label S Label i: Label i: 的语义动作 : 1. 若 i 所指的标识符 ( 假定为 L) 不在符号表中, 则把它填入, 置类型为 标号, 定义否 为 已, 地址为 NXQ 2. 若 L 已在符号表中, 但 类型 不为 标号 或者 定义否 为 已, 则报告出错 3. 若 L 已在符号表中, 则把标志 未 改为 已, 然后, 把地址栏中的链头 ( 记为 q) 取出, 同时把 NXQ 填在其中, 最后, 执行 bp(q,nxq) 分支与循环语句 if E then S1 else S2 if E then goto L-true else goto L-false; L-true: S1; goto L-next; L-false: S2; L-next: E S1 S2 S3 E.tc, E.fc; 回填 E.tc S1.next; 回填 E.fc S2.next; E,S1 和 S2 代码是相邻的, 共同构成 S 代码 S.next 26

27 E S1 S2 S3 F2 V1 V2 V3 if E then S1 else S2; S3; if E then begin if F1 then U1 else U2; U3 end else S2; F1 S3; U1 U2 U3 if E then begin if F1 then U1 else U2; U3 end else begin if F2 then V1 else V2; V3 end S3; E S1 S2 S3 F1 U1 U2 U3 规则 S if E then S1 else S2 E.true:=newlabel(); E.false:=newlabel(); S1.next:=S.next; S2.next:=S.next; S.code:=E.code gen(e.true : ) S1.code gen( goto S.next) gen(e.false : ) S2.code if E then begin if F1 then U1 else U2; U3 end else S2;S3; E E F1 规则 S if E then S1 else S2 F1 规则 S if E then S1 S1 S2 S3 U1 U2 E.true:=newlabel(); E.false:=newlabel(); S1.next:=S.next; S2.next:=S.next; S.code:=E.code gen(e.true : ) S1.code gen( goto S.next) gen(e.false : ) S2.code S1 S2 S3 U1 E.true:=newlabel(); E.false:= S.next; S1.next:=S.next; S.code:=E.code gen(e.true : ) S1.code if E then begin if F1 then U1 else U2 end else S2;S3; if E then begin if F1 then U1 end else S2;S3; 27

28 产生三地址码的属性文法 E S1 S2 规则 S while E do S1 S.begin:=newlabel(); E.true:=newlabel(); E.false:=S.next; S1.next:=S.begin; S.code:=gen(S.begin : ) E.code gen(e.true : ) S1.code gen( goto S.begin) S if E then S1 S if E then S1 else S2 S while E do S1 E.true:=newlabel(); E.false:=S.next; S1.next:=S.next; S.code:=E.code gen(e.true : ) S1.code E.true:=newlabel(); E.false:=newlabel(); S1.next:=S.next; S2.next:=S.next; S.code:=E.code gen(e.true : ) S1.code gen( goto S.next) gen(e.false : ) S2.code S.begin:=newlabel();E.true:=newlabel( ); E.false:=S.next;S1.next:=S.begin; S.code:=gen(S.begin : ) E.code gen(e.true : ) S1.code gen( goto S.begin) while E do S1;S2; 采用四元组实现时需要对其中的 goto 语句进行处理 嵌套条件语句的拉链返填处理 在四元组表示中 newlabel() 是目标位置的首地址 : if E then S1 else S2 语句中 E 的真假出口的目标位置分别是 S1 和 S2 if E then S1 语句中 E 的真假出口的目标位置分别是 S1 和下一条语句 if E then S1 [else S2] 语句中 S1 和 S2 的后续目标位置是该 if 语句下一条语句嵌套时下一条语句指外层该语法单位的后续目标位置 while E do S1 语句中 E 的真假出口的目标位置分别是 S1 和下一条语句 后续目标的地址只有到那个目标被归约时才知道 文法修剪 S if E then S if E then S else S while E do S begin L end A L L; S S 属性 : tc, fc ( 真假出口 ) chain ( 后续目标 )next quad (While 条件 ) S C S T p S W d S begin L end C 和 S 后续目标相同 T p 和 S 后续目标相同 S C A if E then S C if E then T p CS else W d W E do E 真出口已知 C 后续目标已知 S W while L L s S S T p C if E th S el S L s L; 28

29 C 和 S 后续目标相同 S C S T p S T p 和 S 后续目标相同 W d S begin L end A E 真出口已知 C if E then T p CS else C 后续目标已知 W d W E do W while L L s S S L s L; {S.chain := merg( C.chain, S (1). chain)} {S.chain := merg(t p.chain, S (1). chain)} {bp (E.tc, nxq); C.chain := E.fc} if 语句 {q:=nxq; Gen(j, _, _, 0); bp(c.chain,nxq); T p.chain:=merge(s.chain,q)} 示例 C if E then { bp (E.tc, nxq); C.chain := E.fc; } T p C S (1) else { q := nxq; Gen(j, _, _, 0); bp(c.chain,nxq); T p.chain := merge(s (1).chain,q);} S T p S (1) { S.chain := merge(t p. chain, S (1). chain;} IF E THEN S (1) ELSE S (2) C T P S E 的代码 S (1) 的代码 q: ( j, _, _, 0) S (2) 的代码 while 语句 S C S T p S W d S S begin L end W d A W C if E then T p CS else while E do S W d W E do W 条件已知 W while { W.quad := nxq } L L s S S L s L; S 后续目标已确定 { bp(s (1).chain,W d.quad); Gen(j, _, _, W d.quad); S.chain := W d.chain} W 循环体已知 {bp (E.tc,nxq); W d.chain := E.fc; W d.quad := W.quad} 复合语句 S C S T p S begin W d S S begin L end A L C if E then L s T p CS else L S ; S W d W E do end W while L L s S S L s L; L 后续就是 S 后续 A 后续为空 S 后续就是 L 后续 S 后续就是 L 后续 L 的后续已知 29

30 C if E then { bp (E.tc, nxq); C.chain := E.fc; } S C S (1) { S.chain := merg(c.chain, S (1). chain);} T p C S (1) else { q := nxq; Gen(j, _, _, 0); bp(c.chain,nxq); T p.chain := merge(s (1).chain,q);} S T p S (1) { S.chain := merge(t p. chain, S (1). chain;} W while { W.quad := nxq; } W d W E do { bp (E.tc,nxq); W d.chain := E.fc; W d.quad := W.quad ;} S W d S (1) { bp(s (1).chain,W d.quad); Gen(j, _, _, W d.quad); S.chain := W d.chain;} L S { L.chain := S.chain;} L s L; { bp(l.chain,nxq); } L L s S (1) { L.chain := S (1).chain;} S begin L end { S.chain := L.chain;} S A { S.chain := 0;} 空链 if E then while E (1) do S (1) else S (2) C W T P p C if E then { bp (E.tc, nxq); C.chain S := E.fc; } T p C S (1) else { q := nxq; Gen(j, _, _, 0); bp(c.chain,nxq); T p.chain := merge(s (1).chain,q);} S T p S (1) { S.chain := merge(t p. chain, S (1). chain;} W while { W.quad := nxq; } W d W E do { bp (E.tc,nxq); W d.chain := E.fc; q W d.quad := W.quad ;} W d S W d S (1) {bp(s (1).chain,W d.quad); Gen(j, _, _, W d.quad); S.chain := W d.chain;} S1 E 的代码 E (1) 的代码 S (1) 的代码 (j, _, _, p) (j, _, _, 0) p S (2) 的代码 while A<B do if C< then X:= Y+Z W E (1) W d E (2) C S 105 (:=,T,_, X) C if E then { bp (E.tc, nxq); C.chain := E.fc; } 106 (j,_,_,100) T p C S (1) else { q := nxq; Gen(j, _, _, 0); bp(c.chain,nxq); T p.chain := merge(s (1).chain,q);} S T p S (1) { S.chain := merge(t p. chain, S (1). chain;} W d W E do { bp (E.tc,nxq); W d.chain := E.fc; W d.quad := W.quad ;} W while { W.quad := nxq; } S W d S (1) {bp(s (1).chain,W d.quad); Gen(j, _, _, W d.quad); S.chain := W d.chain;} S C S (1) { S.chain := merg(c.chain, S (1). chain;} S (2) S (1) 100 (j<,a,b, 0) (j,_,_, 0 ) 102 (j<,c,, 0) (j,_,_, 0) (+,Y, Z, T) 7.6 过程调用 过程的定义代码首址记录到符号表中 ; 形参记录到符号表中 ; 调用者与被调用者转移目标返回地址参数传递 procedure S(var a, b:integer); 30

31 关于参数传递 - 传地址 约定 : 把实参地址逐一放在转子指令前 如 CALL S(A+B,Z) 翻成 k-4: T := A+B k-3: Par T k-2: Par Z k-1: Call S k: 进入子程序 S 之后,S 就可根据返回地址 k 寻找到存放实参地址的单元 分析 文法 G: (1) S CALL i(arglist) (2) Arglist Arglist, E (3) Arglist E 困难 : 如何在处理实参表的过程中记住每个实参的地址, 以便最后将它们排列在转子指令的前面 解决 : 遇到第一个实参建立一个队列, 后面的依次记录, 要记住队列头 属性文法 例 CALL S (A+B,Z) S CALL i(arglist) {for (Arglist.queue 中每个元素 arg) gen(par,_,_,arg); gen(call,_,_,entry(i))} Arglist Arglist (1), E {E.place 进队列 Arglist (1).queue; Arglist.queue:=Arglist (1).queue} Arglist E { 建立一个 Arglist.queue, 它只包含一项 E.place} S CALL i(arglist) {for (arglist.queue 中每个元素 arg) gen(par,_,_,arg); gen(call,_,_,entry(i))} arglist arglist (1), E {E.place 进队列 arglist (1).queue; arglist.queue:=arglist (1).queue} arglist E { 建立一个 arglist.queue, 它只包含一项 E.place} E E Ar Ar S k-4: T := A+B k-3: Par T k-2: Par Z k-1: Call S k: 31

32 7.7 类型检查类型表达式 P list;slist list list; id:t T int bool array [num] of L Slist Slist;S S S if E then S id:=e 基本类型是类型表达式 类型名是类型表达式 用于类型表达式得到类型表达式 基本类型 boolean, char, integer, real type-error void 类型构造符数组 array(i, T) 笛卡尔积 T 1 T 2 指针 pointer(t) 函数 R 确定标识符的类型 类型系统 A language s type system specifies which operations are valid for which types 类型检查 : 动态 ; 静态 The goal of type checking is to ensure that operations are used with the correct types 良类型系统 P ;E ; id:t {addtype(id.entry, T.type} T char {T.type=char} T integer {T.type=integer} T T 1 {T.type=pointer(T 1.type)} T array[num]of T {T.type=array(num.val, T 1.type)} 32

33 类型检查 E E 1 mod E 2 {if E 1.type=integer and E 2.type=integer then E.type=integer else E.type=type_error} E E 1 [E 2 ]{if E 2.type=integer and E 1.type=array(s,t) then E.type=t else E.type=type_error} E E 1 {if E 1.type=pointer(t) then E.type=t else E.type=type_error} E E 1 (E 2 ){if E 2.type=s and E 1.type=s t then E.type=t else E.type=type_error} 类型检查补充 ->id:t {insert(id.name, T.type)} T->int {E.type=integer} T->array [num] of T (1) {T.type=mkTypeNode(array,num.size,T (1).type )} S->if E then S {if not typeequal(e.type,boolean) then type-error(s)} S->id:=E {if not typeequal(lookup(id.name),e.type)then typeerror(s)} E->E (1) +E (2) {if not (typeequal(e (1).type,integer) and typeequal(e (2).type,integer))then type-error(e);e.type=integer} E->E (1) ore (2) {if not (typeequal(e (1).type,boolean) and typeequal(e (2).type,boolean))then type-error(e);e.type=boolean} E->num {E.type=integer} E->true {E.type=boolean} E->id {E.type=lookup(id.name)} 参考书 Kenneth C.L. 编译原理与实践 ( 英文版 ), 机械工业 2002 蒋立源 康慕宁, 编译原理 ( 第二版 ), 西北工业大学出版社 2004 本章习题 p :

Microsoft PowerPoint - 7-Semantic&IR.ppt

Microsoft PowerPoint - 7-Semantic&IR.ppt 7.1 中间表示的概念 第七章 : 语义分析和中间代码生成 2008 年秋 抽象语法树 vs 类似目标代码 是否使用目标机和运行时环境的详细信 息 数据类型的尺寸 ; 寄存器 变量的存储位置 前端 IR 后端 是否使用符号表中的全部信息 作用域 嵌套层次 变量的偏移量 其它用处 : 用于代码分析以产生高效目标代码 用于多目标编译 (retargetable) 中间代码生成 中间代码生成位于词法分析和语法分析之后,

More information

Microsoft PowerPoint - 7-Semantic_IR09.ppt

Microsoft PowerPoint - 7-Semantic_IR09.ppt 中间代码生成 第七章 : 语义分析和中间代码生成 中间代码生成位于词法分析和语法分析之后, 是代码生成中的一个阶段 ; 中间代码的形式很多, 如逆波兰记号 抽象语法树 三地址码 ( 三元式 四元式 ) P- 代码, 等等 属性文法是用于中间代码生成的常用的方法 赵银亮 本章内容 : 1. 中间表示形式 2. 说明语句的翻译 3. 简单算术表达式和赋值句到四元式的翻译 4. 布尔表达式到四元式的翻译

More information

编译原理与技术

编译原理与技术 编译原理与技术 中间代码生成 2015/11/7 编译原理与技术 讲义 1 中间代码生成 - 布尔表达式翻译 - 控制流语句翻译 2015/11/7 编译原理与技术 讲义 2 布尔表达式的翻译 布尔表达式文法 G 4 E E 1 or E 2 E 1 and E 2 not E 1 ( E 1 ) id 1 relop id 2 true false id 3 布尔运算符 or and 和 not(

More information

大侠素材铺

大侠素材铺 编译原理与技术 中间代码生成 Ⅰ 计算机科学与技术学院 李诚 12/11/2018 关于课程实验 目标 : 为 PL0 语言实现一个简单的编译器 Project 1: 词法分析 Project 2: 语法分析 Project 3: 语法错误处理 + 对前两个 project 的扩展, 11.15 release,11.30 提交 Project 4: 代码生成,12.1 release,12.15

More information

Microsoft PowerPoint - ch7.ppt [兼容模式]

Microsoft PowerPoint - ch7.ppt [兼容模式] 第七章 中间代码生成 静态中间代码记号分析检查代码中间生成流器器生成代码器器本章内容 介绍几种常用的中间表示 (intermediate representation): 后缀表示 图形表示和三地址代码 用语法制导定义和翻译方案来说明源语言的各种 用语法制导定义和翻译方案来说明源语言的各种构造怎样被翻译成中间形式 7.1.1 后缀表示 7.1 中间语言 E E ope uope (E) id num

More information

Microsoft PowerPoint - ch7 [Compatibility Mode]

Microsoft PowerPoint - ch7 [Compatibility Mode] 记号流 第七章 分析器 静态检查器 中间代码生成 中间代码生成器 中间代码 代码生成器 本章内容 介绍几种常用的中间表示 (intermediate representation): 后缀表示 图形表示和三地址代码 用语法制导定义和翻译方案来说明源语言的各种构造怎样被翻译成中间形式 7.1.1 后缀表示 E E ope uope (E) id num 表达式 E 的后缀表示可以如下归纳定义 : 表达式

More information

Microsoft PowerPoint - ch6 [Compatibility Mode]

Microsoft PowerPoint - ch6 [Compatibility Mode] 第 6 章 中间代码生成 记号流 分析器 本章内容 静态检查器 中间代码生成器 中间代码 代码生成器 介绍几种常用的中间表示 : 后缀表示 图形表示和三地址代码 用语法制导定义和翻译方案来说明源语言的各种构造怎样被翻译成中间形式 6.1.1 后缀表示表达式 E 的后缀表示可以如下归纳定义 如果 E 是变量或常数, 那么 E 的后缀表示就是 E 本身 如果 E 是形式为 E 1 ope 2 的表达式,

More information

第5章修改稿

第5章修改稿 (Programming Language), ok,, if then else,(), ()() 5.0 5.0.0, (Variable Declaration) var x : T x, T, x,,,, var x : T P = x, x' : T P P, () var x:t P,,, yz, var x : int x:=2. y := x+z = x, x' : int x' =2

More information

没有幻灯片标题

没有幻灯片标题 指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,

More information

ebook14-4

ebook14-4 4 TINY LL(1) First F o l l o w t o p - d o w n 3 3. 3 backtracking parser predictive parser recursive-descent parsing L L ( 1 ) LL(1) parsing L L ( 1 ) L L ( 1 ) 1 L 2 L 1 L L ( k ) k L L ( 1 ) F i r s

More information

Microsoft PowerPoint - ir

Microsoft PowerPoint - ir 中间语言与中间代码生成 张昱 编译原理和技术 0551-63603804,yuzhang@ustc.edu.cn 中国科学技术大学计算机科学与技术学院 记号流 本章内容 分析器 语法树 静态检查器 语法树 中间中间代码代码生成器 代码生成器 符号表本章内容 中间语言 : 常用的中间表示 (Intermediate Representation) 后缀表示 图表示 三地址代码 LLVM IR 基本块和控制流图

More information

大侠素材铺

大侠素材铺 编译原理与技术 语法制导翻译 Ⅱ 计算机科学与技术学院 李诚 22/10/2018 Announcement Tutorial on Thursday (25/10/2018) 3B201, Class time Assignment review Q & A Cheng @ Compiler Fall 2018, USTC 2 主要内容 源程序 词法分析器 token 语法分析器 分析树 语义分析

More information

PowerPoint Presentation

PowerPoint Presentation 第六章中间代码生成 许畅 南京大学计算机系 2018 年春季 本章内容 中间代码表示 表达式的有向无环图 DAG 三地址代码 :x = y op z 类型检查 类型 类型检查 表达式的翻译 中间代码生成 控制流 回填 2 编译器前端的逻辑结构 前端是对源语言进行分析并产生中间表示 处理与源语言相关的细节, 与目标机器无关 前端后端分开的好处 : 不同的源语言 不同的机器可以得到不同的编译器组合 3

More information

Microsoft PowerPoint - 6 Intermediate-Code Generation.pptx

Microsoft PowerPoint - 6 Intermediate-Code Generation.pptx 第六章中间代码生成 陈林 本章内容 中间代码表示 抽象语法树 三地址代码 中间代码生成 表达式 类型检查 控制流 编译器前端的逻辑结构 静态类型检查和中间代码生成的过程都可以用语法制导的翻译来描述和实现 对于抽象语法树这种中间表示的生成, 第五章已经介绍过 表达式的有向无环图 语法树中, 公共子表达式每出现一次, 就有一个对应的子树 表达式的有向无环图 (Directed Acyclic Graph,DAG)

More information

编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2018

编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2018 编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2018 什么叫语法制导的翻译 求表达式的值 id 1 + id 2 *id 3 4 + 3 * 5 文法 :E E + E E * E id E 5 E 1 + E 4 id 1 E 2 * E 3 id 2 id 3 四者的语义相同 对于计算机执行的指令流 : E 1 = id 1

More information

大侠素材铺

大侠素材铺 编译原理与技术 词法分析 Ⅱ 计算机科学与技术学院李诚 13/09/2018 主要内容 记号 (token) 源程序 词法分析器 getnexttoken 语法分析器 符号表 词法分析器的自动生成 正则表达式 NFA DFA 化简的 DFA 词法分析器的生成器 Lex: flex jflex Fst lexicl nlyzer genertor 2/51 Regulr Expr to NFA 正则表达式

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information

再版前言

再版前言 第七章中间代码生成 在第一章已经介绍, 编译器的前端把源程序翻译成中间表示, 后端从中间代码产生目标代码, 与目标语言有关的细节尽可能限制在后端 使用独立于机器的中间形式的好处是 : 1. 再目标 (retargeting) 比较容易 把针对新机器的后端加到现成的前端上, 可以得到另一种机器的编译器 2. 独立于机器的代码优化器可用于这种中间表示 第九章将介绍这种代码优化 因此, 虽然可以把源程序直接翻译并生成目标代码,

More information

词 法 分 析

词 法 分 析 中间语言与中间代码生成 编译原理和技术 张昱 0551-63603804,yuzhang@ustc.edu.cn 中国科学技术大学计算机科学与技术学院 本章内容 记号流 分析器 语法树 静态检查器 语法树 中间代码生成器 中间代码 代码生成器 本章内容 中间语言 : 常用的中间表示 (Intermediate Representation) 后缀表示 图表示 三地址代码 LLVM IR 基本块和控制流图

More information

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1

, 7, Windows,,,, : ,,,, ;,, ( CIP) /,,. : ;, ( 21 ) ISBN : -. TP CIP ( 2005) 1 21 , 7, Windows,,,, : 010-62782989 13501256678 13801310933,,,, ;,, ( CIP) /,,. : ;, 2005. 11 ( 21 ) ISBN 7-81082 - 634-4... - : -. TP316-44 CIP ( 2005) 123583 : : : : 100084 : 010-62776969 : 100044 : 010-51686414

More information

FY.DOC

FY.DOC 高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主

More information

chap07.key

chap07.key #include void two(); void three(); int main() printf("i'm in main.\n"); two(); return 0; void two() printf("i'm in two.\n"); three(); void three() printf("i'm in three.\n"); void, int 标识符逗号分隔,

More information

Chapter12 Derived Classes

Chapter12   Derived Classes 继 承 -- 派 生 类 复 习 1. 有 下 面 类 的 说 明, 有 错 误 的 语 句 是 : class X { A) const int a; B) X(); C) X(int val) {a=2 D) ~X(); 答 案 :C 不 正 确, 应 改 成 X(int val) : a(2) { 2. 下 列 静 态 数 据 成 员 的 特 性 中, 错 误 的 是 A) 说 明 静 态 数

More information

C C

C C C C 2017 3 8 1. 2. 3. 4. char 5. 2/101 C 1. 3/101 C C = 5 (F 32). 9 F C 4/101 C 1 // fal2cel.c: Convert Fah temperature to Cel temperature 2 #include 3 int main(void) 4 { 5 float fah, cel; 6 printf("please

More information

元 [ 所 17-1-2-3] IA27 ( D ) 下 列 何 項 情 況, 其 夫 妻 所 得 可 免 合 併 申 報? (A) 當 年 度 結 婚 (B) 當 年 度 離 婚 (C) 妻 58 歲, 夫 62 歲 無 所 得 受 其 子 扶 養 (D) 以 上 皆 是 [ 所 17-1-1]

元 [ 所 17-1-2-3] IA27 ( D ) 下 列 何 項 情 況, 其 夫 妻 所 得 可 免 合 併 申 報? (A) 當 年 度 結 婚 (B) 當 年 度 離 婚 (C) 妻 58 歲, 夫 62 歲 無 所 得 受 其 子 扶 養 (D) 以 上 皆 是 [ 所 17-1-1] 綜 合 所 得 稅 選 擇 題 題 庫 IA01 ( A ) 非 中 華 民 國 境 內 居 住 之 個 人, 取 有 中 華 民 國 境 內 銀 行 給 付 之 活 期 儲 蓄 存 款 利 息 所 得, 依 據 所 得 稅 法 規 定, 應 否 課 徵 綜 合 所 得 稅? (A) 應 就 源 扣 繳 (B) 全 年 在 27 萬 元 以 下 免 納 所 得 稅 (C) 應 該 辦 理 結 算 申

More information

CC213

CC213 : (Ken-Yi Lee), E-mail: feis.tw@gmail.com 49 [P.51] C/C++ [P.52] [P.53] [P.55] (int) [P.57] (float/double) [P.58] printf scanf [P.59] [P.61] ( / ) [P.62] (char) [P.65] : +-*/% [P.67] : = [P.68] : ,

More information

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

e bug 0 x=0 y=5/x 0 Return 4 2

e bug 0 x=0 y=5/x 0 Return 4 2 e 1 4 1 4 4.1 4.2 4.3 4.4 4.5 e 2 4.1 bug 0 x=0 y=5/x 0 Return 4 2 e 3 4 3 e 4 (true) (false) 4 4 e 5 4 5 4.2 1 G= V E V={n1,n2,,n m } E={e1,e2,,e p } e k ={n i,n j }, n i,n j V e 6 4.2 4 6 1 e 3 n 1 e

More information

C/C++语言 - C/C++数据

C/C++语言 - C/C++数据 C/C++ C/C++ Table of contents 1. 2. 3. 4. char 5. 1 C = 5 (F 32). 9 F C 2 1 // fal2cel. c: Convert Fah temperature to Cel temperature 2 # include < stdio.h> 3 int main ( void ) 4 { 5 float fah, cel ;

More information

内容提要 1 语法制导翻译语法制导定义 S 属性定义的自下而上计算 L 属性定义的自上而下计算 L 属性定义的自下而上计算 2 中间代码生成中间语言声明语句赋值语句布尔表达式和控制流语句

内容提要 1 语法制导翻译语法制导定义 S 属性定义的自下而上计算 L 属性定义的自上而下计算 L 属性定义的自下而上计算 2 中间代码生成中间语言声明语句赋值语句布尔表达式和控制流语句 编译原理 第七章语法制导翻译及中间代码生成 方徽星 扬州大学信息工程学院 (505) fnghuixing@yzueducn 2018 年 6 月 内容提要 1 语法制导翻译语法制导定义 S 属性定义的自下而上计算 L 属性定义的自上而下计算 L 属性定义的自下而上计算 2 中间代码生成中间语言声明语句赋值语句布尔表达式和控制流语句 11 语法制导定义 (Syntx-Directed Definition)

More information

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B 25 9 2008 9 M ICROEL ECTRON ICS & COMPU TER Vol. 25 No. 9 September 2008 J ava 1,2, 1,2, 1,2 (1, 330022 ; 2, 330022) :,. Apla - Java,,.. : PAR ;Apla - Java ; ;CMP ; : TP311 : A : 1000-7180 (2008) 09-0018

More information

E170C2.PDF

E170C2.PDF IQ E170C2 2002.3. Rotork Rotork * ( ) * * RotorkIQ - IQ * * PC IQ Insight / Rotork * - Rotork IQ www.rotork.com 5 10 5.1 11 1 2 5.2 11 2 3 5.3 11 3 IQ 3 5.4 11 3.1 3 5.5 IQM12 3.2 3 5.6 IQML12 3.3 4 5.7

More information

a( a 0) a a( a 0) a = a ( a) = a a( a 0 ) a = a( a ) 0 a = a 4 f x 1 = x a ai a R sinx + a b ab sin x sinx = sinx sin x = 4 y = sinx + sinx - ysinx 4 = 0 sinx sinx x - 3 3= x x- 3 - x- 3 = 0

More information

C/C++ - 字符输入输出和字符确认

C/C++ - 字符输入输出和字符确认 C/C++ Table of contents 1. 2. getchar() putchar() 3. (Buffer) 4. 5. 6. 7. 8. 1 2 3 1 // pseudo code 2 read a character 3 while there is more input 4 increment character count 5 if a line has been read,

More information

Microsoft PowerPoint - L12-v3.pptx

Microsoft PowerPoint - L12-v3.pptx Lecture 12: 中间代码生成 -II Xiaoyuan Xie 谢晓园 xxie@whu.edu.cn 计算机学院 E301 控制流翻译 控制流语句的翻译 文法 B表示布尔表达式 S代表语句 S if (B) S1 S if (B) S1 else S2 S while (B) S1 代码的布局见右图 继承属性 B.true B为真的跳转目标 B.false B为假的跳转目标 S.next

More information

Microsoft PowerPoint - 5 Syntax-Directed Translation.pptx

Microsoft PowerPoint - 5 Syntax-Directed Translation.pptx 第五章语法制导的翻译 陈林 引言 使用上下文无关文法引导语言的翻译 CFG 的非终结符号代表了语言的某个构造 程序设计语言的构造由更小的构造组合而成 一个构造的语义可以由小构造的含义综合而来 比如 : 表达式 x+y 的类型由 x y 的类型和运算符 + 决定 也可以从附近的构造继承而来 比如 : 声明 int x; 中 x 的类型由它左边的类型表达式决定 语法制导定义和语法制导翻译 语法制导定义

More information

Microsoft PowerPoint - ch4.ppt [兼容模式]

Microsoft PowerPoint - ch4.ppt [兼容模式] 第四章 语法制导的翻译 本章内容 1 介绍语义描述的一种形式方法: 语法制导的翻译 (syntax-directed translation), 它包括两种具体形式 语法制导的定义 (syntax-directed definition) E E 1 + T E.code = E 1.code T.code + 可读性好, 更适于描述规范 翻译方案 (translation scheme) E E

More information

Microsoft PowerPoint - SyntaxDirectedTranslation [Compatibility Mode]

Microsoft PowerPoint - SyntaxDirectedTranslation [Compatibility Mode] Outline rror Handling Syntax-Directed Translation xtensions of CFG for parsing Precedence declarations rror handling Semantic actions Constructing a parse tree Originated from Prof. Aiken CS 14 Modified

More information

<4D6963726F736F667420576F7264202D20C1E3B5E3CFC2D4D8C4A3B0E52E646F63>

<4D6963726F736F667420576F7264202D20C1E3B5E3CFC2D4D8C4A3B0E52E646F63> 历 年 MBA MPAcc 联 考 数 学 真 题 及 答 案 详 解 (009-0) 009 年 月 MBA 联 考 数 学 真 题 及 答 案 详 解 一 问 题 求 解 ( 本 大 题 共 小 题, 每 小 题 分, 共 分 下 列 每 题 给 出 的 五 个 选 项 中, 只 有 一 项 是 符 合 试 题 要 求 的 请 在 答 题 卡... 上 将 所 有 选 项 的 字 母 涂 黑 ).

More information

1 2 / 3 1 A (2-1) (2-2) A4 6 A4 7 A4 8 A4 9 A ( () 4 A4, A4 7 ) 1 (2-1) (2-2) ()

1 2 / 3 1 A (2-1) (2-2) A4 6 A4 7 A4 8 A4 9 A ( () 4 A4, A4 7 ) 1 (2-1) (2-2) () (39mm E-Mail ( )( ), : : 1 1 ( ) 2 2 ( ) 29mm) WSK ( 1 2 / 3 1 A4 2 1 3 (2-1) 2-1 4 (2-2) 2-2 5 A4 6 A4 7 A4 8 A4 9 A4 10 11 ( () 4 A4, 5 6 7 8 A4 7 ) 1 (2-1) (2-2) () 1 2 (2-1) 3 (2-2) 4 5 6 7 (8 ) 9

More information

Microsoft PowerPoint - L9-v3.pptx

Microsoft PowerPoint - L9-v3.pptx Lecture 9: 语法制导的翻译 -I Xiaoyuan Xie 谢晓园 xxie@whu.edu.cn 计算机学院 E301 Introduction 9.1 概述 语义分析在编译程序中的作用 词法分析 目标代码生成 语法分析 中间代码优化 语义分析 分析 中间代码生成 合成 语法和语义的区别 语法 是描述一个合法定义的程序结构的规则 例如 id( ) 语义 说明一个合法定义的程序的含义

More information

4 / ( / / 5 / / ( / 6 ( / / 7 1 2 / 3 ( 4 ( 2003 8 ( 2

4 / ( / / 5 / / ( / 6 ( / / 7 1 2 / 3 ( 4 ( 2003 8 ( 2 : / ( 6 (2003 8 : ( 1 ( ( / / (,, ( ( - ( - (39mm 29mm 2 ( 1 2 3-6 3 6-24 6-48 12-24 8-12 WSK / WSK WSK 1 4 / ( / / 5 / / ( / 6 ( / / 7 1 2 / 3 ( 4 ( 2003 8 ( 2 9 5 ( 10 3 11 / (600 4 5 AA 710 AB 720 730

More information

2-1 2004 4.0 1.8 2.2 2001 2.83 0.86 1.97 % 41.3 109.3 11.7 2-2 2004 220 194 26 2001 81.3 70 11.3 % 170.6 177.1 130.0 2-3 2004 142 90 41 11 2001 104.5 70.9 26.1 7.5 % 35.9 26.9 57.5 45.3 2-5

More information

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料

OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢   学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 14 日晚 9 点 另一名助教 : 王桢 Email: 51141201063@ecnu.cn 学习使用文本编辑器 学习使用 cmd: Power shell 阅读参考资料 OOP with Java Java 类型 引用 不可变类型 对象存储位置 作用域 OOP

More information

pdf

pdf SMART INVERTER, SMART CHOICE www.siemens.com.cn/v20 0.12 kw ~ 15 kw USS MODBUS RTU 7.5 kw ~ 15 kw PCB V/fV 2 /f 0.12 kw ~ 15 kw 1AC 200 V... 240 V ( -10 % / +10 % ) 3AC 380 V... 480 V ( -15 % / +10 % )

More information

C/C++ - 函数

C/C++ - 函数 C/C++ Table of contents 1. 2. 3. & 4. 5. 1 2 3 # include # define SIZE 50 int main ( void ) { float list [ SIZE ]; readlist (list, SIZE ); sort (list, SIZE ); average (list, SIZE ); bargragh

More information

4.进度控制(网络计划)0.ppt

4.进度控制(网络计划)0.ppt 全 国 建 筑 类 执 业 资 格 考 试 共 性 案 例 进 度 控 制 网 络 计 划 1 网 络 计 划 常 用 的 工 程 网 络 计 划 类 型 双 代 号 网 络 计 划 双 代 号 时 标 网 络 计 划 单 代 号 网 络 计 划 A 4 B 单 代 号 搭 接 网 络 计 划 1 D 2 4 C 2 E 5 双 代 号 5 F 2 G 4 2 6 1 工 作 A 4 D 2 4 B

More information

C 1

C 1 C homepage: xpzhangme 2018 5 30 C 1 C min(x, y) double C // min c # include # include double min ( double x, double y); int main ( int argc, char * argv []) { double x, y; if( argc!=

More information

C/C++ - 文件IO

C/C++ - 文件IO C/C++ IO Table of contents 1. 2. 3. 4. 1 C ASCII ASCII ASCII 2 10000 00100111 00010000 31H, 30H, 30H, 30H, 30H 1, 0, 0, 0, 0 ASCII 3 4 5 UNIX ANSI C 5 FILE FILE 6 stdio.h typedef struct { int level ;

More information

97 04 25 0970002232 97 12 31 1-7 1 2 1 0 1 0 1 0 1 0 1 0 1 0 1 2 24 A1. 0 1 ( 6 ) 2 ( 6 ) 3 4 A1a.? 5 6 0 1 A1b.? 0 1 2 A2. 0 1 A2b. A2c. A2a. A2d. 1 A3. 1 A4 2 0 A4 A3a.?? 0 A4 1 A3b. 0 A4 1 A3c.?? 1

More information

第三节 软件测试的过程与策略

第三节 软件测试的过程与策略 ...1...4...9...17...25...29...34...40...46...55...65...73 1 2 3 4 5 6 7 8 9 10 11 1 12 13 1 ABCD 2 A B C D 3 ABCD 4 A1/2 B1/3 C1/4 D2/3 5 % A20 B30 C40 D50 6 A B C D 7 A B C D / 8 A B C D 9 A B C D 10

More information

數學導論 學數學 前言 學 學 數學 學 數學. 學數學 論. 學,. (Logic), (Set) 數 (Function)., 學 論. 論 學 數學.,,.,.,., 論,.,. v Chapter 1 Basic Logic 學 數學 學 言., logic. 學 學,, 學., 學 數學. 數學 論 statement. 2 > 0 statement, 3 < 2 statement

More information

科学计算的语言-FORTRAN95

科学计算的语言-FORTRAN95 科 学 计 算 的 语 言 -FORTRAN95 目 录 第 一 篇 闲 话 第 1 章 目 的 是 计 算 第 2 章 FORTRAN95 如 何 描 述 计 算 第 3 章 FORTRAN 的 编 译 系 统 第 二 篇 计 算 的 叙 述 第 4 章 FORTRAN95 语 言 的 形 貌 第 5 章 准 备 数 据 第 6 章 构 造 数 据 第 7 章 声 明 数 据 第 8 章 构 造

More information

!##$!% "&! %( $#!##)!& $!##*!##*! "

!##$!% &! %( $#!##)!& $!##*!##*! "!! " " " " " " " " " " " " " " " " "!!!!!!!!!!!!!!!!!!!!!!!!!!!! " #!$% & &&% (!) &*% ( &++(!( &++* * ( )!+ #* #$ & # *, )!!!* &- &) #-! *, #,! " !##$!% "&! %( $#!##)!& $!##*!##*! " " 92 %, #$ %&#! 8$*2$*112

More information

WWW PHP

WWW PHP WWW PHP 2003 1 2 function function_name (parameter 1, parameter 2, parameter n ) statement list function_name sin, Sin, SIN parameter 1, parameter 2, parameter n 0 1 1 PHP HTML 3 function strcat ($left,

More information

C/C++ 语言 - 循环

C/C++ 语言 - 循环 C/C++ Table of contents 7. 1. 2. while 3. 4. 5. for 6. 8. (do while) 9. 10. (nested loop) 11. 12. 13. 1 // summing.c: # include int main ( void ) { long num ; long sum = 0L; int status ; printf

More information

!!!!"#$ " " %& ( " # " " " " " "$%%& " $%% " "!!

!!!!#$   %& (  #      $%%&  $%%  !! ! "##$ % % % % % % % % &#!" % % #$%& (%&!! !!!!"#$ " " %& ( " # " " " " " "$%%& " $%% " "!! ! "#!"#$ $ $ $ $ %# %& $ &# ()*$ " & %!! ! " "!! !!!!" "! #$%& "# $()*$(+, $%& ())* $% (+,-.. /-.. 0&* 0%* "!!

More information

3.1 num = 3 ch = 'C' 2

3.1 num = 3 ch = 'C' 2 Java 1 3.1 num = 3 ch = 'C' 2 final 3.1 final : final final double PI=3.1415926; 3 3.2 4 int 3.2 (long int) (int) (short int) (byte) short sum; // sum 5 3.2 Java int long num=32967359818l; C:\java\app3_2.java:6:

More information

编译原理原理与技术

编译原理原理与技术 编译原理与技术 语法制导翻译 2015/10/12 编译原理与技术 讲义 1 属性文法 语法制导翻译 S- 属性定义 L- 属性定义 语法制导定义与翻译方案 自底向上翻译 S- 属性定义自底向上计算 自底向上计算继承属性 自顶向下翻译 2015/10/12 编译原理与技术 讲义 2 属性文法 属性文法 (Attributed Grammar) 上下文无关文法 + 属性 + 属性计算规则 属性 - 用来描述文法符号的语义特征,

More information

VF---10

VF---10 VF---10 1 2 3 MCCB MC 1K2W 0~10V 0~5V 4~20mA R S T FWD REV X1 X2 X3 X4 X5 X6 COM 10V VS1 VS2 IS AGND U V W E COM PG A+ PG A- PG B+ 24V PG B- A B C Y1 Y2 Y3 COM M 485+ 485- A01 A02 AGND AM FM 6 MCCB

More information

) +!"!"#$ %& ()*! # # +,-./, 0 /, 1&22& 34! 56! " " $ %!! 56 $! % &!! &! &! (!6+!6+. 7) 3 89 :&) ( 9)#; +,- % )*% % + 7<; 3 ). 0 (*!

) +!!#$ %& ()*! # # +,-./, 0 /, 1&22& 34! 56!   $ %!! 56 $! % &!! &! &! (!6+!6+. 7) 3 89 :&) ( 9)#; +,- % )*% % + 7<; 3 ). 0 (*! !""# #!"#$"%&"!""#!"#$%&% ()*$+, (-!"*(.+/(0*+1"2 ()*+!$,)+ % %&$ %%" ( - ( - -! - - ( - (! (+ ("!!"*!+ ("""!! +# :*%+- - 9- - (""".+$(&!""# "%."%&$.(,- -!"#$%& ( )* ( +$,$-.)% $%" $%$/0-.&$/ - &1%.23

More information

種 類 左 淋 巴 總 管 ( 胸 管 ) 右 淋 巴 總 管 血 管 連 接 連 接 左 鎖 骨 下 靜 脈 連 接 右 鎖 骨 下 靜 脈 淋 巴 收 集 範 圍 左 上 半 身 及 下 半 身 淋 巴 液 右 上 半 身 淋 巴 液 長 度 很 長 很 短 (3) 循 環 路 徑 : (4)

種 類 左 淋 巴 總 管 ( 胸 管 ) 右 淋 巴 總 管 血 管 連 接 連 接 左 鎖 骨 下 靜 脈 連 接 右 鎖 骨 下 靜 脈 淋 巴 收 集 範 圍 左 上 半 身 及 下 半 身 淋 巴 液 右 上 半 身 淋 巴 液 長 度 很 長 很 短 (3) 循 環 路 徑 : (4) ( 一 ) 淋 巴 系 統 與 循 環 A 淋 巴 系 統 的 功 能 : (1) 包 括 淋 巴 淋 巴 管 淋 巴 組 織 淋 巴 器 官 (2) 回 收 組 織 液 : 有 組 織 液 送 回 血 液, 以 維 持 血 液 成 分 恆 定 (3) 運 送 脂 溶 性 養 分 : 運 送 小 腸 乳 靡 管 吸 收 的 脂 溶 性 養 分 回 血 液 (4) 產 生 免 疫 反 應 : 具 有

More information

C/C++语言 - 运算符、表达式和语句

C/C++语言 - 运算符、表达式和语句 C/C++ Table of contents 1. 2. 3. 4. C C++ 5. 6. 7. 1 i // shoe1.c: # include # define ADJUST 7. 64 # define SCALE 0. 325 int main ( void ) { double shoe, foot ; shoe = 9. 0; foot = SCALE * shoe

More information

# " $ % $ # ( $ $ %% * $ %+ $, -., / ", 0, %, %%%%, " % 2 %% #. $ 3 *3 %45 6" %% 9: :" : "

#  $ % $ # ( $ $ %% * $ %+ $, -., / , 0, %, %%%%,  % 2 %% #. $ 3 *3 %45 6 %% 9: : : #$$% #$$% #$$ #$$% #$$% #$$ #$$ # $ " #($ # $ #$ #($ *$ #$ $+ %$ #* # *, #+ *, -#+ -, #%+, " " #$$% + #+ -+ #$$( +." HI # 6 J : HI - 6 J #. KL38 ( /0. KL # 6 38 # ( : 4 G7 < $ 7 6 : 6 58 758 % 7 6 < =

More information

!"#$ % & ())*$ $ +,-./0)1)1/.21/.$ 3 4$ 5 4$ 6 789:;9< $ = :; A B CD ())* E )FG(*? H$ $ $ $ $ $ $ $ $ $ % IJ!"#% &$ KLMNO 2(* H 2G))(2 $ PQ R

!#$ % & ())*$ $ +,-./0)1)1/.21/.$ 3 4$ 5 4$ 6 789:;9< $ = :; A B CD ())* E )FG(*? H$ $ $ $ $ $ $ $ $ $ % IJ!#% &$ KLMNO 2(* H 2G))(2 $ PQ R !"#$ % & ())*$ $ +,-./0)1)1/.21/.$ 3 4$ 5 4$ 6 789:;9< $ = >?((@0$ :; A B CD ())* E )FG(*? H$ $ $ $ $ $ $ $ $ $ % IJ!"#% &$ KLMNO 2(* H 2G))(2 $ PQ R STU$ VW ;XY Z [$ \] ^_ a\]b$ c ())* d G ee 2 $ H +,-./0)1)1/.21/.

More information

高二立體幾何

高二立體幾何 008 / 009 學 年 教 學 設 計 獎 勵 計 劃 高 二 立 體 幾 何 參 選 編 號 :C00 學 科 名 稱 : 適 用 程 度 : 高 二 簡 介 一 本 教 學 設 計 的 目 的 高 中 立 體 幾 何 的 學 習 是 學 生 較 難 理 解 而 又 非 常 重 要 的 一 個 部 分, 也 是 高 中 教 學 中 較 難 講 授 的 一 個 部 分. 像 國 內 的 聯 校

More information

!"!"# # $!""%& ()*+, - ". - "/!%,0 -.! $ " $ # $ $ $ 1 %%&0/! 2(3!""% "/%,.4 "/" -." "" - 5/" - "045 /"""" # # 999$ 6:8$ :;<$ =>

!!# # $!%& ()*+, - . - /!%,0 -.! $  $ # $ $ $ 1 %%&0/! 2(3!% /%,.4 / -.  - 5/ - 045 / # # 999$ 6:8$ :;<$ => !"!"# # $!""%& ()*+, - ". - "/!%,0 -.! $ " $ # $ - - - $ $ 1 %%&0/! 2(3!""% "/%,.4 "/" -."0.055 00 5"" - 5/" - "045 /""""4 6778 # # 999$ 6:8$ :; "/" -."/.".5 6778 # # 999$ 6:8$ =?@$ =>,5, A 4 " /

More information

<5B BECBB0EDB8AEC1F25D312D34B0AD5FC3E2BCAEBCF6BEF7C0DAB7E F31702E504446>

<5B BECBB0EDB8AEC1F25D312D34B0AD5FC3E2BCAEBCF6BEF7C0DAB7E F31702E504446> : 2 = 3 4? 0 an ordered set of unambiguous, executable steps that produces a result and terminates in a finite time (computational theory) ( ) 5 6 (C-) int min, max; float degree, b; char ch, token; /,,,

More information

网C试题(08上).doc

网C试题(08上).doc 学习中心 姓名 学号 西安电子科技大学网络与继续教育学院 高级语言程序设计 (C) 全真试题 ( 闭卷 90 分钟 ) 题号一二三总分 题分 60 20 20 得分 一 单项选择题 ( 每小题 3 分, 共 60 分 ) 1.C 语言程序的基本单位是 A) 程序行 B) 语句 C) 函数 D) 字符 2. 下列四组选项中, 均是不合法的用户标识符的选项是 A)A B)getc C)include D)while

More information

数 学 高 分 的 展 望 一 管 理 类 联 考 分 析 第 一 篇 大 纲 解 析 篇 编 写 : 孙 华 明 1 综 合 能 力 考 试 时 间 :014 年 1 月 4 日 上 午 8:30~11:30 分 值 分 配 : 数 学 :75 分 逻 辑 :60 分 作 文 :65 分 ; 总

数 学 高 分 的 展 望 一 管 理 类 联 考 分 析 第 一 篇 大 纲 解 析 篇 编 写 : 孙 华 明 1 综 合 能 力 考 试 时 间 :014 年 1 月 4 日 上 午 8:30~11:30 分 值 分 配 : 数 学 :75 分 逻 辑 :60 分 作 文 :65 分 ; 总 目 录 数 学 高 分 的 展 望... 1 第 一 篇 大 纲 解 析 篇... 1 一 管 理 类 联 考 分 析... 1 二 最 新 大 纲 解 析... 1 三 考 前 复 习 资 料 及 方 法... 第 二 篇 总 结 篇... 4 1 应 用 题 考 点 总 结 与 技 巧 归 纳... 4 代 数 模 块 题 型 归 纳 及 考 点 总 结... 9 3 数 列 模 块 题 型 归

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc Java C++ Pascal C# C# if if if for while do while foreach while do while C# 3.1.1 ; 3-1 ischeck Test() While ischeck while static bool ischeck = true; public static void Test() while (ischeck) ; ischeck

More information

WWW PHP Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2

WWW PHP Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2 WWW PHP 2003 1 Comments Literals Identifiers Keywords Variables Constants Data Types Operators & Expressions 2 Comments PHP Shell Style: # C++ Style: // C Style: /* */ $value = $p * exp($r * $t); # $value

More information

中華民國青溪協會第四屆第三次理監事聯席會議資料

中華民國青溪協會第四屆第三次理監事聯席會議資料 - 1 - 中 華 民 國 第 八 屆 第 四 次 理 監 事 聯 席 會 議 程 序 表 日 期 中 華 民 國 1 0 4 年 1 2 月 1 9 日 ( 星 期 六 ) 地 點 臺 南 南 紡 夢 時 代 雅 悅 會 館 五 樓 ( 臺 南 東 區 中 華 東 路 一 段 366 號 ) 項 次 程 序 起 訖 時 間 使 用 時 間 主 持 人 或 報 告 人 報 到 16:30~17:00

More information

1 2 9

1 2 9 8 1 2 9 3 4 10 11 5 6 12 13 7 14 8 9 bk bl bm 15 bn bo 16 bp bq br bs bt 17 ck cl cm cn 18 19 co cp 20 21 cq cr 22 23 cs ct 24 dk 25 dl 26 dm dn do dp dq 27 dr ds dt ek 28 el em 29 en eo ep eq er 30 es

More information

!!""# $ %#" & $$ % $()! *% $!*% +,-. / 0 %%"#" 0 $%1 0 * $! $#)2 "

!!# $ %# & $$ % $()! *% $!*% +,-. / 0 %%# 0 $%1 0 * $! $#)2 ! """"""""""""""""""" " !!""# $ %#" & $$ % $()! *% $!*% +,-. / 0 %%"#" 0 $%1 0 * $! $#)2 " !"#$%#$&!!!!!!!!!!!!!!!!!!!!!!!!!!!"#$%& (& #) *+&,"-./%0 1 2"0*-"3* #4 5%&6&4"&00 78 9+& :"/;& 7< 9+& =#4-%%/

More information

untitled

untitled 說 參 例 邏 邏 1. 說 2. 數 數 3. 8 4. 理念 李 龍老 立 1. 理 料 2. 理 料 3. 數 料 4. 流 邏 念 5. 良 6. 讀 行 行 7. 行 例 來 邏 1. 說 說 識 量 2. 說 理 類 3. 數 數 念 4. 令 5. 良 6. 流 邏 念 7. 說 邏 理 力 1. 2. 3. 4. 5. 列 念 1 參 1. ( Visual Basic 例 ) (1)

More information

C/C++ - 数组与指针

C/C++ - 数组与指针 C/C++ Table of contents 1. 2. 3. 4. 5. 6. 7. 8. 1 float candy [ 365]; char code [12]; int states [50]; 2 int array [6] = {1, 2, 4, 6, 8, 10}; 3 // day_mon1.c: # include # define MONTHS 12 int

More information

#$%&% () % ()*% +,-. /01 % + (/) " " " 2- %** -340 $%&% 5!$%&% () % ()*% +,-. /01 % + (/) " " " 2- %** -340 /64 7%,(8(, *--9( ()6 /-,%/,65 :$%&

#$%&% () % ()*% +,-. /01 % + (/)    2- %** -340 $%&% 5!$%&% () % ()*% +,-. /01 % + (/)    2- %** -340 /64 7%,(8(, *--9( ()6 /-,%/,65 :$%& ! " "!! " "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! " #$$% & ()*+,-.(*/!0%1 23)4-(4 5).67*(*8. #$$%!9 #$$% #!$1#$!1 #9 19 :9 %; :< #$$% = 0!$ ; = : : : = 1 % #!9 #$%&% () % ()*% +,-. /01 % + (/) " " " 2- %**

More information

New Doc 1

New Doc 1 U N I V E R SI T Y O F M A L ; 1ï i l i dvol 1 l 2 0 1 8 w 1a1 p&t«apa«ridia ti p E g s l am an Pt d1an h Ma @Mi u Ooam a1 ol am S1udl es} ]111 / 2 1 Dr Mo11an a Daw 11a mai amy 1 P r o f e s s o r D r

More information

《米开朗琪罗传》

《米开朗琪罗传》 ! " # ! """"""""""""""""""" """"""""""""""""" """""""""""""""" $% """"""""""""" &# """"""""""""""" %# """"""""""""""" # """""""""""""""!$% """""""""""""""!&!! # $$$$$$$$$$$$$$$$$$ $$$$$$$$$!"#!%& (! "

More information

试卷

试卷 ( 试 题 中 凡 主 观 题 答 案 意 思 对 即 可, 若 与 答 案 不 同 而 言 之 成 理, 亦 可 酌 情 给 分 ) 一 ~ 二 (45 分 ) 1.B( 原 文 并 未 说 网 络 社 会 生 态 系 统 的 核 心 与 现 实 社 会 生 态 系 统 的 核 心 不 同 ) 2.D( 服 务 网 络 收 集 到 的 数 据 要 和 关 系 网 络 的 数 据 整 合 在 一 起,

More information

因 味 V 取 性 又 鸟 U 且 最 大 罗 海 惜 梅 理 春 并 贵 K a t h l ee n S c h w e r d t n er M f l e z S e b a s t i a n C A Fe rs e T 民 伊 ' 国 漳 尤 地 视 峰 州 至 周 期 甚 主 第 应

因 味 V 取 性 又 鸟 U 且 最 大 罗 海 惜 梅 理 春 并 贵 K a t h l ee n S c h w e r d t n er M f l e z S e b a s t i a n C A Fe rs e T 民 伊 ' 国 漳 尤 地 视 峰 州 至 周 期 甚 主 第 应 国 ' 东 极 也 直 前 增 东 道 台 商 才 R od e ric h P t ak 略 论 时 期 国 与 东 南 亚 的 窝 贸 易 * 冯 立 军 已 劳 痢 内 容 提 要 国 与 东 南 亚 的 窝 贸 易 始 于 元 代 代 大 规 模 开 展 的 功 效 被 广 为 颂 扬 了 国 国 内 市 场 窝 的 匮 乏 窝 补 虚 损 代 上 流 社 会 群 体 趋 之 若 鹜 食 窝

More information

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc References (Section 5.2) Hsuan-Tien Lin Deptartment of CSIE, NTU OOP Class, March 15-16, 2010 H.-T. Lin (NTU CSIE) References OOP 03/15-16/2010 0 / 22 Fun Time (1) What happens in memory? 1 i n t i ; 2

More information

爱学习

爱学习 2013 中 建 教 育 二 级 建 造 师 建 设 工 程 施 工 管 理 点 题 班 习 题 ( 一 ) 一 单 项 选 择 题 ( 共 70 题, 每 题 1 分, 每 题 的 备 选 项 中, 只 有 1 个 最 符 合 题 意 ) 1 建 设 工 程 项 目 管 理 就 是 自 项 目 开 始 到 完 成, 通 过 ( ) 使 项 目 目 标 得 以 实 现 A 项 目 策 划 和 项 目

More information

! #$ % & ( ) % & ( ) % & ( ) % & ( ) % & ( ) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! # ################################################### % & % & !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

More information

untitled

untitled 8.1 f G(f) 3.1.5 G(f) f G(f) f = a 1 = a 2 b 1 = b 2 8.1.1 {a, b} a, b {a} = {a, a}{a} 8.1.2 = {{a}, {a, b}} a, b a b a, b {a}, {a, b}{a} {a, b} 8.1.3

More information

!"#$%"#$!& () #*("+$,# -+(&. )!""# $ $ $ $ $ $ $ $ $ !!!"#$%#$&!"#$% #" %#&# %# (%!) (&#"*%!!!!!!!!!!!!!!!!!!!!!!! " "# (&$")(!*+,*)-%$ ".%).(%/!!!!!!!!!!!!!!!!!!!!!!!!!!!! $ (&$")(!*+ &$*$(&$(!*+,*)-%$

More information

!"#$%"#$!& () #*("+$,# -+(&. )!""! # # # # # # # # !!!"#$%#$&!"#$% #" %#&# %# (%!) (&#"*%!!!!!!!!!!!!!!!!!!!!!!! " "# (&$")(!*+,*)-%$ ".%).(%/!!!!!!!!!!!!!!!!!!!!!!!!!!!! $ (&$")(!*+ &$*$(&$(!*+,*)-%$

More information

!"#$%"#$!& () #*("+$,# -+(&. )!""! # # # # # # # # !!!"#$%#$&!"#$% #" %#&# %# (%!) (&#"*%!!!!!!!!!!!!!!!!!!!!!!! " "# (&$")(!*+,*)-%$ ".%).(%/!!!!!!!!!!!!!!!!!!!!!!!!!!!! $ (&$")(!*+ &$*$(&$(!*+,*)-%$

More information

( ) Wuhan University

( ) Wuhan University Email: huangzh@whueducn, 47 Wuhan Univesity i L A TEX,, : http://affwhueducn/huangzh/ 8 4 49 7 ii : : 4 ; 8 a b c ; a b c 4 4 8 a b c b c a ; c a b x y x + y y x + y x x + y x y 4 + + 8 8 4 4 + 8 + 6 4

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

20151107083515_題目卷

20151107083515_題目卷 國 中 歷 史 B3:L6 明 代 與 盛 清 的 發 展 練 習 卷 一 單 一 選 擇 題 1. ( ) 明 清 兩 代 的 統 治 措 施 有 何 相 似 之 處? (A) 均 薙 髮 留 辮 (B) 均 種 族 歧 視 (C) 均 興 文 字 獄 (D) 均 設 特 務 機 關 2. ( ) 小 明 參 觀 北 京 的 長 陵, 領 隊 先 生 介 紹 此 乃 明 代 因 發 動 宗 室 之

More information

2/80 2

2/80 2 2/80 2 3/80 3 DSP2400 is a high performance Digital Signal Processor (DSP) designed and developed by author s laboratory. It is designed for multimedia and wireless application. To develop application

More information

!# $#!#!%%& $# &% %!# (# )#! "

!# $#!#!%%& $# &% %!# (# )#! ! " "!! " "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! " #$$%! # & % ( #$$%! #$$% ) #$$% # #!!# %!!!! ( ) #!!& # &#$$%!* #$$ $+ %%$+ ( # # # # #!+ !# $#!#!%%& $# &% %!# (# )#! " ! " " S1.+(/8.-1.,3(413 516*+/,

More information

Persuasive Techniques (motorcycle helmet)

Persuasive Techniques  (motorcycle helmet) M O D E A T H E E L E M E N T S O F A N A R G U M E N T 1n t h l s t e s t i m o n y g iv e n b e f o r e t h e M a ry l a n d Se n a t e t h e s p e a ke r m a ke s a s t r o n g c l a i m a b o u t t

More information

优合会计考点直击卷子之财经法规答案——第八套

优合会计考点直击卷子之财经法规答案——第八套 原 题 导 航 基 础 第 一 套 第 1 题 参 考 答 案 : C 试 题 评 析 : 在 社 会 主 义 市 场 经 济 条 件 下, 会 计 的 对 象 是 社 会 再 生 产 过 程 中 主 要 以 货 币 表 现 的 经 济 活 动 第 2 题 参 考 答 案 :B 试 题 评 析 : 在 权 责 发 生 制 下, 本 期 售 货 尚 未 收 到 销 售 货 款 属 于 当 期 收 入

More information

Static Enforcement of Security with Types

Static Enforcement of Security with Types 例题 1 一个 C 语言程序及其在 X86/Linux 操作系统上的编译结 果如下 根据所生成的汇编程序来解释程序中四个变 量的存储分配 生存期 作用域和置初值方式等方面 的区别 static long aa = 10; short bb = 20; func( ) { } static long cc = 30; short dd = 40; static long aa = 10; func(

More information

<313034A4BDB67DA4C0B56FBA5DB3E65FBD64A5BB2E786C7378>

<313034A4BDB67DA4C0B56FBA5DB3E65FBD64A5BB2E786C7378> 科 別 : 國 文 科 (A 區 ) 分 發 16 名 1 600110129 黃 毅 潔 國 立 豐 原 高 級 商 業 職 業 學 校 2 600110446 鄭 安 芸 國 立 南 投 高 級 中 學 3 600110632 李 孟 毓 桃 園 市 立 大 園 國 際 高 級 中 學 4 600110492 洪 珮 甄 南 投 縣 立 旭 光 高 級 中 學 5 600110262 柯 懿 芝

More information