编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2019
|
|
- 婴 稽
- 4 years ago
- Views:
Transcription
1 编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2019
2 什么叫语法制导的翻译 (SDT) 求表达式的值 id 1 + id 2 *id * 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 E 2 = id 2 E 3 = id 3 E 4 = E 2 * E 3 E 5 = E 1 * + E 4 对于计算器的计算结果 : 19
3 翻译之一 : 源程序 中间代码 求表达式的值 id 1 + id 2 *id * 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 E 2 = id 2 E 3 = id 3 E 4 = E 2 * E 3 E 5 = E 1 + E 4 对于计算器的计算结果 : 19 源程序是语句流, 中间代码是指令流, 都是线性结构
4 中间代码形式 源程序 高级中间表示形式 低级中间表现形式 目标代码 文法 :E E + E E * E id E 5 E 1 + E 4 id 1 E 2 * E 3 + * E 1 = id 1 E 2 = id 2 E 3 = id 3 E 4 = E 2 * E 3 E 5 = E 1 * + E 4 id 2 id 3 id 1 id 1 id 1 语法分析树 抽象语法树 三地址码
5 中间代码形式 有向无环图 DAG DAG(directed acyclic graph) 表达式 a + a * (b - c) + (b - c ) * d 的 DAG: + + * a * - d b c
6 中间代码形式 有向无环图 DAG 表达式 a + a * (b - c) + (b - c ) * d + + * * - a b c d DAG
7 DAG 与抽象语法树的联系与差异 生成抽象语法树的 SDD 产生式 1)E E 1 + T 2)E T 3)T T 1 * F 4)T F 5)F (E) 6)F id 语义规则 E.node = new Node('+', E 1.node, T.node) E.node =T.node E.node = new Node('*', T 1.node, F.node) T.node = F.node F.node = E.node F.node = new Leaf(id, id.entry)
8 产生式 1)E E 1 + T 2)E T 3)T T 1 * F 4)T F 5)F (E) 6)F id DAG 与抽象语法树的联系与差异 : 生成 DAG 的 SDD 语义规则 E.node = gennode('+', E 1.node, T.node) E.node =T.node E.node = gennode('*', T 1.node, F.node) T.node = F.node F.node = E.node F.node = gen Leaf(id, id.entry) gennode((op, left_node, right_node) { node = getnode(op, left_node, right_node); if (node == null ) then return new Node(op, left_node, right_node); else return node; } 差异何在?
9 6.2 中间代码 : 三地址代码 概念计算机上执行的指令流 ( 指令序列 ), 无穷的存储器 1 运算指令 : 一个运算符, 两个运算分量, 一个运算结果 ; x = y op z 运算分量 : 名字 : 用源程序中名字作为三地址代码的地址 常量 : 源程序中出现的 ; 编译器生成的临时变量 ;
10 三地址代码 (2) 运算 / 赋值指令 :x=y op z, 或者 x=op y 复制指令 :x = y 无条件转移指令 :goto L 条件转移指令 :if x goto L if False x goto L 条件转移指令 :if x relop y goto L
11 三地址代码 (3) 过程调用 / 返回 : param x1 param x2 param xn call p, n // 调用子过程 p,n 为参数个数 带下标的复制指令 :x=y[i] x[i] = y 地址 / 指针赋值指令 : x=&y, x=*y, *x=y
12 三地址码例子 语句 : do i = i + 1; while (a[i]<v); L: t 1 = i + 1 i = t 1 t 2 = i * 8 t 3 = a[t 2 ] IF t 3 < v GOTO L 符号表 id name type size 0 i integer 4 1 a float(6, integer) 2 v integer 4 3 t1 integer 4 4 t2 integer 4 5 t3 integer : 组元素的大小 ( 字节数 )
13 其它中间代码表达形式 在实现时, 还有四元式 三元式 间接三元式 静态单 赋值 ; 四元式 :op, arg1, arg2, result; 三元式 : 就是 DAG;
14 对程序的中间代码的理解 (1) 表达式 a+b*c 结合律, 交换律 带来了写程序时表达的灵活性 : 写成 b*c+a; c*b+a; a+c*b 都行 t 1 =b*c t 2 =a+t 1 识别 : 结合律, 交换律 引入了通用计算机特性 : ü 计算的单元化特性 ; ü 计算指令的序列性 ; ü 计算结果的存储性
15 对程序的中间代码的理解 (2) c=0 L 0 : if (c>10) goto L 1 goto L2 L 1 : c=c-1 if(a>b) goto L 3 goto L 4 L 3 : d=x+y goto L 5 L 4 : d=x*y goto L 5 L 5 : goto L 0 L 2 : x=1 { c=0; while(c>10) { c=c-1; if (a>b) d=x+y; else d=x*y; } x=1 } 在外形上, 层次结构变成了线性结构 控制语句的多样性, 变成了单一性 :for, do,if,while,switch if + goto
16 对程序的中间代码的理解 (3) int a[2][3], c, i, j; 表达式 c+a[i][j] 的三地址码 : t 1 = i * 12 t 2 = j * 4 t 3 = t 1 + t 2 t 4 = a[ t 3 ] t 5 = c + t 4 数组在三地址码中, 概念完全不同, 变成了 相对位置概念, 与基地址的偏移量 ( 字节数 )
17 对程序的中间代码的理解 (4) 函数调用 :n = f(x+y, x*y); 的三地址码 : t 1 = x + y t 2 = x*y param t 1 param t 2 t 3 = call f, 2 n = t 3 更加接近函数调用的实现机理
18 语义分析和中间代码生成中的数据结构 1. 中间代码表 三地址中间代码表 : nextinstr row_id tag code goto src_row_id 1 L 1 : i = j + k 2 3 生成特点 : 分析中通过栈缓存来实现了顺序调转, 只增不插 操作 : gen(get(i) '=' E.addr); gen( if (' E 1.addr ' >' E 2.addr ') goto' begin); AddLabel( begin ':'); backpatch( list, nextinstr);
19 语义分析之一 : 变量先定义后使用原则 2. 符号表 每申明一个变量, 便在符号表中添加一行 在中间代码表中, 变量的真实表达为 :V Tid.Rid 变量要先申明后使用, 因此每遇到一个变量, 都要到符号表 中检查, 检查它是否已经申明 ; 就近匹配原则, 确定是指哪个变量 ; 变量申明的重复性检查 : 同一块中申明的变量不允许同名 ; int main( ) { int p = 2; MyFun( p ); if (p > 0) { float p = 4; s = substr(s 1, p); } }
20 符号表的数据结构 T ID row_id name type_id offset s_row_num 1 i 符号表 : 2 j k cur_pos 中间代码中的变量, 标识形式 :V TID. RID AddVariable(id, type,offset); 全局变量 : 符号表数量计数器 :st_num;
21 在生成机器代码前, 求符号表中的每行数据的 offset 字段值 T ID row_id name type_id offset s_row_num cur_pos 1 i 符号表 : 2 j k UPDATE Tid AS t1 SET offset = (SELECT width FROM TypeT AS t2 WHERE t1.type_id = t2.row_id) + (SELECT offset FROM Tid AS t3 WHERE t3.row_id = t1.row_id - 1) WHERE row_id > 1
22 类型表和类型的项表 cur_pos TypeTable row_id name type width d_row_num 1 student record float 符号表 : item row_id type_id name type offset d_row _num 1 1 age integer tall float cur_pos
23 符号表的链表 : 每个 Block, 以 {} 标识, 都有自己的符号表 S { M S } N M { st = new SymbolTable(); st. prior =cst; cst = st; } N { cst = cst.prior; } E id { E.addr = Position(id); } class SymbolTable { Table T; int cur_pos; int offset; int TID; SymbolTable* prior; }
24 在符号表的链表中查找某个变量是否已经申明 position(id) { st = cst; i = st.cur_pos; find = false; while (1) { while ( i == 0 && st.prior!= null ) { st = st.prior; i = st.cur_pos; } if (i == 0 && st.prior == null) ' 未定义 return null; while( i > 0 ) { if(st[i - 1].name == id) ' 找到 ' return V [st.id, i]; i-- ; } } }
25 变量声明的 SDT D T L; L L, id; { if(nodulplicate(id)) AddVarible(id, T.type); } L id; { if(nodulplicate(id)) AddVarible(id, T.type); } 这个文法是 LR 的, 还是 LL 的? 下面的是书上的, 乱搞 1) F {top = new Env(); D.offset= 0 } D 2) D T id; { top.put(id, T.type, offset); D 1.offset = D.offset + T.width; } D 1 { D.offset = D 1.offset ; } 3) D
26 变量申明时, 在当前符号表中查找变量名是否有重复现象 NoDulplicate( id ) { i = cst.cur_pos; while( i >0 ) { } if(cst[i-1].name == id) ' 申明出现重名 ' return fasle; i-- ; } return true;
27 申明一个变量时, 往当前符号表中添加一行, 表达该变量 AddVarible( id,type_id ) { APPEND INTO cst.table VALUES( cst.cur_pos, id, type_id, cst.offset); cst.cur_pos ++; cst.offset += width(type_id); return; }
28 中间代码的特性 (5) 源程序中数据 ( 变量的申明 / 定义 ) 和代码混合交叉在一起, 须要时就定义, 数据是以名字来标识 中间代码中, 数据和代码进行了分离 数据都规一到符号表中 在中间代码中, 数据的标识, 不再是名字, 而是它在符号表中的位置, 即 Tid.Rid 在机器代码中, 数据的标识, 是它的内存地址 中间代码将变量都规一到符号表中, 变量的内存地址于是就是符号表在内存的地址 ( 即基地址 )+offset 第七章再介绍
29 3. 其它数据结构 goto 标签表 操作 label =NewLabel(); AddLabel(label ':'); gen('goto' label); 全局计数器 goto 标签表 row_id tag value 1 L L 这个表仅仅只有在 LL 分析中用到, 在 LR 分析中不须要 AddLabel(label ':') 这个函数, 就是把 nextinstr 的值赋给指定的标签行的 value 字段 goto 的值, 在随后中间代码优化, 或者翻译成机器码时, 查此表, 得到它的实际值
30 观察 c=0 if (c>10) goto L 1 goto L 0 L 1 : c=c-1 if(b>c) goto L 3 goto L 2 L 3 : b=x+y if(a>b) goto L 5 goto L 4 L 3 : a=x*y L 0 : L 2 : L 4 : x=1 c=0; if(c>10) { c=c-1; if (b>c) { b=x+y; if (a>b) { a=x*y; } } } x=1 在 LL(1) 中, 对 L SL 1, 要展开 S 时, 不知道 L 1 将会是按照 L SL 1 还是 L 展开? 导致每个语句的 S.next =newlabel( );
31 c=0 if (c>10) goto L 1 goto L 0 L 1 : c=c-1 if(b>c) goto L 3 goto L 2 L 3 : b=x+y if(a>b) goto L 5 goto L 4 L 3 : a=x*y L 0 : L 2 : L 4 : x=1 观察 c=0; if(c>10) { c=c-1; if (b>c) { b=x+y; if (a>b) { a=x*y; } } } x=1 在 LL(1) 分析中, 对 L SL 1, 要展开 S 时, 就要确定 S.next 的值, 因为随后在 B 中生成 goto 语句时, 要用到 在 LR(1) 分析中不一样, 规约出 S 后,S.next 的值才确定下来, 此 时看当前输入符, 如果是 '}', 说明 S 是当前块中的最后一个语句 ;
32 临时变量 临时变量 :E.addr = new temp(); 其含义是在当前符号表中, 添加一行 返回所添加的这一行的 标识 id, 即 Tid. Rid 注意 : 每申明一个变量, 也是往当前符号表中添加一行, 随后要使用这个变量时, 再基于名字 (id) 到符号表中来查出它所指的行, 返回该行的标识 id, 即 Tid. Rid, 作为中间代码中对该变量的标识
33 6.3 类型和变量声明 类型检查 (Type Checking) 规则 : 保证运算分量的类型和运算符的预期类型要匹配 翻译 : 确定变量的类型, 需要的内存空间 计算数组元素的 地址 ( 即存储空间布局 ( 相对地址 ) 类型转换 选择正确 的运算符 ;
34 类型表达式 类型表达式 (type expression) 表示类型的结构, 其定义如下 : 基本类型是一个类型表达式 如 :boolean integer,float, void 等 类名是一个类型表达式 类型构造算子作用于类型仍是类型表达式 array[ 数字, 类型表达式 ] record { < 字段类型 > 对的列表 } list 类型 set 类型
35 类型表达式 从函数的角度来看待类型 : 类型构造算子 : 是用类型作为参数, 构造出新的类型 ; 从类型 s 到类型 t 的函数记作 s t; 按照函数的写法应该是 t (s) 例如 :list( ) 的结果是列表类型, 其元素的类型为 ; class Cell { int info; Cell* next; } 类型名和递归类型 ; 可以给类型取名, 例如上面的 Cell 某种类型的变量,
36 数组类型的类型表达式, 及其长度求解的 SDD 产生式 T BC B int B float C [num]c 1 C 语义规则 C.inh_t = B.t C.inh_w = B.w T.t = C.t, T.w = C.w B.t = integer, B.w=4 B.t = float, B.w=8 C 1.inh_t = C.inh_t C 1.inh_w = C.inh_w C.t = array(num, C 1.t) C.t= C.inh_t C.w =C.inh_w LL 文法, 还是 LR 文法? T B t int syn syn inhc inh [ 2 ] C 1 syn sy inh [ 3 ] n C 2 例, int [2][3] 类型表达式为 array(2, array(3,integer)
37 上述 SDD 的 SDT 1)T B{C.inh_t = B.t; C.inh_w = B.w;} C { T.t = C.t; T.w = C.w; } 2)B int {B.t= integer; B.w = 4; } 3)B float {B.t= float; B.w = 8; } 4)C { C 1.inh_t = C.inh_t; C 1.inh_w = C.inh_w; } [num {S.inh= num; } ] C 1 { C.t = array(s.inh, C 1.t); C.w =S.inh* C 1.w } S 5)C {C.t = C.inh_t; C.w = C.inh_w; } 当 S 变成栈顶时, 要弹出它, 然后用它的产生式的右部倒着压入栈 中, 现在 S, 而且这个产生式中没有动作 即 S 直接出栈
38 在 LR 语法和 LR 分析中的 SDT 例如,int [2][3] 的类型表达式为 array(2, array(3,integer)) 1) T BC { T.t= B.t; T.w= B.w; while(int i=s.pop()) { B.t = array(num, B.t); T.w=T.w* i; } delete s; AddType(id, T.t, T.w); } } 2) B int { B.t = integer; B.w = 4 } 3) B float { B.t = float; B.w = 8 } 4) C C 1 [num] { s.push(num); } 5) C [num] { s = new stack(); s.push(num); } s 是一个全局变量, 该方案可行吗?
39 记录类型的定义文法和 SDT T record id { I } I I 1 T id; I T id; LL 文法, 还是 LR 文法? T record id { H I } { UpdateWidth( Rid, I.width); } I I 1 T id;{ AddItem( H.Rid, id, T.type); I.width = I 1.width +T.width;} I T id;{ AddItem( H.Rid, id, T.type); I.width = T.width; } H {H.Rid = AddType( id, record); }
40 程序中的变量 每申明一个变量, 便在符号表中添加一行 在中间代码表中, 变量的真实表达为 :V Tid.Rid 变量要先申明后使用, 因此每遇到一个变量, 都要到符号表 中检查, 检查它是否已经申明 ; 就近匹配原则, 确定是指哪个变量 ; 变量申明的重复性检查 ; int main( ) { int p = 2; MyFun( p ); if (p > 0) { float p = 4; s = substr(s 1, p); } }
41 局部变量的存储布局 变量有类型概念 类型又有宽度概念, 即内存大小 (Bytes), 变量有值和地址两个两个概念 变量值放在内存中, 基于其内存地址来访问变量的值 ; 变量的类型信息存储在类型表中 ; 变量信息存储在符号表中 每个块 (block) 都有自己的符号表 ; root 块的符号表存放了所有全局变量 root 块的子块为函数块
42 变量的作用域和内存布局 scheme 在一个函数里面, 其所有局部变量放在一个连续的存储空间中, 变量在该空间的放置顺序与声明顺序一致 ; 每申明一个变量,SDT 所做处理 : 在当前块的符号表中, 检查是否出现名字重复的变量定义 ; 如果无, 则在当前符号表中, 增加一行 ( 变量实例 ): 书上的是 :top.put(id.lexeme, T.type, offset); 我们的是 :AddVarible( ); 见前面的内容
43 将表达式 三地址指令序列的 SDD 产生式 1)S id=e; 2)E E 1 + E 2 3)E -E 1 4)E (E 1 ) 5)E id 语义规则 S.code =E.code gen(top.get(id.lexeme) '=' E.addr) E.addr = new temp(), E.code =E 1.code E 2.code gen(e.addr '= E 1.addr '+' E 2.addr) E.addr = new temp() E.code =E 1.code gen(e.addr '=' 'minus' E 1.addr ) E.addr = E 1.addr E.code =E 1.code E.addr = top.get(id.lexeme) E.code =''
44 增量式翻译方案 SDT 1)S id=e; 2)E E 1 + E 2 3)E -E 1 { gen(top.get(id.lexeme) '=' E.addr); } { E.addr = new temp(); gen(e.addr '= E 1.addr '+' E 2.addr); } { E.addr = new temp() gen(e.addr '=' 'minus' E 1.addr ); } 4)E (E 1 ) { E.addr = E 1.addr; } 5)E id { E.addr = top.get(id.lexeme); }
45 数组元素在中间代码中表达 一个一维数组, 元素从 0 到 n-1 编号, 在内存中依次 连续存 储 其起始地址为 base, 第 i 个元素的地址为 :base+i*w, w 为元素的类型的宽度 ; K 维数组 : 将其视为一个一维数组, 其元素的类型为一个 k- 1 维数组 A[i 1 ][i 2 ] [i k ] 的地址 : base+(( ((i 1 *n 2 +i 2 )*n 3 +i 3 ) )*n k +i k )*w 在符号表中有 A 的条项,A 的条项中记录了 A 的类型,base 就是 A 的地址 ;
46 数组元素的文法含义 L L[E] L id[e] 例如 : a[i][j] LL 文法, 还是 LR 文法? L 1 是 a 的元素, L 2 是 L 1 的元素 L 1 a [ E ] L 2 [ E ] j 数组定义 :int a[10][20], 对于数组元素 a[5][6] a.type = array(10, array(20, integer)); L 1.type = a.type.elem = array(20, integer); L 2.type = integer; i
47 求数组元素的偏移地址 L 2 L 是 a 的元素 L [ E ] a [ E ] i j L id[e];{ L.array = top.get(id.lexeme); L.type =L.array.type.elem; L.addr = new Temp(); gen( L.addr '=' E.addr '*' L.type.width); }
48 求数组元素的偏移地址 L 是 L 1 的元素 L L 1 [ E ] a [ E ] i j L L 1 [E]; { L.array = L 1.array_id ; L.type =L 1.type.elem; t = new Temp(); L.addr = new Temp(); gen( t '= E.addr '*' L.type.width); gen( L.addr '=' L 1.addr '+' t); }
49 数组元素作为因子 L 的代码只计算了偏移量 ; 数组元素的值 : L 的数组基址加上偏移量 ; 使用三地址指令 x=a[i] 5)E L { E.addr = new temp(); AddCode(E.addr '=' L.array'[' L.addr ']'); }
50 给数组元素赋值 使用三地址指令 a[i]=x S L = E; { gen(l.array '[' L.addr ']' '=' E.addr); }
51 c int a[2][3], c, i, j; 求赋值语句 c = c+a[i][j] 的三地址码序列 addr E addr= c c S = addr a [ E addr=i ] type=array(2, array(3, integer)) addr i addr E + addr=t 5 注释语法分析树 E L L type=array(3,integer) array = a addr=t 1 addr=t 4 array = a; type=integer addr=t 3 [ E addr=j ] j addr t 1 = i * 12 t 2 = j * 4 t 3 = t 1 + t 2 t 4 = a[ t 3 ] t 5 = c + t 4 c= t 5
52 类型检查和转换 类型系统 : 编译时, 目标代码中的元素有值, 类型, 存储地址 的概念 ; 编译时就解决类型匹配问题 保证运行时, 不再存在 有关类型的问题要处理, 不会出错 : 强类型的语言 ; 编译时来发现错误, 以提高运行时效率 确定临时变量的大小 例如 float b; int i; i= &b;
53 类型检查的两种方式 类型综合例如, 对于表达式 E 1 +E 2, 已知 E 1 和 E 2 的类型, 那么运算的结果的类型是什么? 类型推导 根据语言结构的使用方式来确定该结构的类型例 :null(x) 是一个测试列表是否为空的函数, 则根据函数 null(x) 可推断出 x 必定是一个列表, 但 x 的元素类型未知 不要求名字先定义的语言需要类型推导, 如 :ML
54 类型转换 设表达式 x+i,x 为浮点数 i 为整数, 则结果应该是浮点数 x 和 i 使用不同的二进制表示方式 浮点数相加, 和整数相加使用不同的指令 t1 = (float) i t2 = x + t1
55 类型的 widening 和 narrowing Java 类型转换规则区分了拓宽转换和窄化转换 编译器自动完成的转换为隐式转换, 程序员用代码指定的转换为显式转换
56 处理类型转换的 SDT E E 1 +E 2 { E.type = max(e 1.type, E 2.type); a 1 =widen(e 1.addr, E 1.type, E.type); a 2 =widen(e 2.addr, E 2.type, E.type); E.addr = new Temp( ); gen(e.addr '=' a1 '+' a2); } Addr widen(addr a, Type t, Type w) { if (t=w) return a; else if (t=integer and w= float) { temp = new Temp(); gen(temp '=' '(float)' a); return temp; } }
57 函数 / 运算符的重载 重载 (overload) 是面向对象程序设计语言的一个特征 例 :Java 语言中 + 算符可表示串连接或加法运算, 由操作数的类型来区分 用户自定义的函数也可以重载, 如 : Void err( ) { } Void err(string S) { } 通过查看参数个数, 类型, 顺序, 就能解决的函数重载问题
58 LL 语法分析中程序文法的表达 P S 1 S if (B) S T T else S 3 S id = E 4 S while(b) S 5 S T id 6 S {L} L SL L 程序 if 语句赋值语句 while 语句变量定义语句语句序列当前输入符为 } 或者 $, 选择 L E E+E E*E (E) id B B && B B B (B) E > E id true false
59 S { L } S L c = 0 S L while (B) S S c > 10 { L } x = 1 S L c=c-1 S L if ( B ) S else S d=x+y d=x*y L LL 语法分析树例子 { c=0; while(c>10) { c=c-1; if (a>b) d=x+y; else d=x*y; } x=1 }
60 LR 语法分析中程序文法的表达 P S 1 S if (B) S 2 S if (B) S else S 3 S id = E 4 S while(b) S 5 S T id 6 S {S} 7 S SS B B && B B B (B) E> E id true false E E+E E*E (E) id
61 LR 语法分析树例子 S c = 0 S { S } S S S x = 1 while ( B ) S c > 10 { S } S S { c=0; while(c>10) { c=c-1; if (a>b) d=x+y; else d=x*y; } x=1 } c=c-1 if ( B ) S else S d=x+y d=x*y
62 I 4 S id = E id=e I 0 P S S {S} S SS S if(b) S S while(b) S S id = E S I 1 P S S S S S SS S if(b) S S while(b) S S id = E S I 5 S SS S S S S SS S if(b) S S while(b) S S id = E S S if I 3 S if( B ) S S {S} S SS S if(b) S S while(b) S S id = E { S if I 2 S { S} S SS S if(b) S S while(b) S S id = E I 6 S {S } S S S S SS S if(b) S S while(b) S S id = E } I 7 S {S} S I 8 S if( B ) S
63 语言的 DFA I 4 S id = E I 0 P S S {S} S if(b) S S while(b) S S id = E if id S { { I 1 P S I 2 S { S} S SS S if(b) S S while(b) S S id = E S I 5 S {S } S S S S if(b) S S while(b) S S id = E } S I 7 S {S} I 8 S SS I 3 S if( B ) S S {S} S if(b) S S while(b) S if S id = E I S 6 S if( B ) S
64 表达式的类型 算术表达式 E; 优先级 :(),*/, +/- 布尔表达式 B; 优先级 :(),!,&&, 正则表达式 R; 优先级 :(),*, 联接,
65 6.6 控制流的翻译 布尔表达式可以用于改变控制流, 计算逻辑值 文法 B B B B && B!B (B) E relop E id true false B 1 B 2 中,B 1 为真时, 不计算 B 2, 整个表达式为真 因此, 当 B 1 为真时应该跳过 B 2 的代码 B 1 && B 2 中,B 1 为假时, 不计算 B 2, 整个表达式为假 短路代码 通过跳转指令实现控制流的处理
66 短路代码的例子 S if (B) S 1 语句的实例 : if (x<100 x>200 && x!= y) x = 0; 三地址码如下 : if x < 100 goto L 2 if FALSE x > 200 goto L 1 if FALSE x!= y goto L 1 L 2 : x=0 L 1 : 非终结符的属性 : S.next = L 1 ; B.true =L 2 ; B.false = S.next
67 S while(b) S 1 语句的 SDD 继承属性 : B.true B.false S.next begin: B.true: B.false: B.code S 1.code goto begin... to B.true to B.false 产生式 4)S while (B) S 1 语义规则 begin = newlable( ); B.true = newlable( ); B.false =S.next; S 1.next= begin; S.code =label(begin) B.code label(b.true) S.code
68 S if (B) S 1 语句的 SDD 继承属性 : B.true B.false S.next 综合属性 : B.code S.code B.true: B.false: B.code S 1.code... to B.true to B.false if x<100 goto L 2 goto L 3 L 3 : if x> 200 goto L 4 goto L 1 L 4 : if X!=y goto L 2 goto L 1 L 2 : x = 0 L 1 : 产生式 if (x<100 x>200 && x!= y) x = 0; 语义规则 S if (B) S 1 B.true = newlable( ); B.false = S.next; S 1.next= S.next; S.code =B.code label(b.true) S 1.code
69 S if (B) S 1 else S 2 语句的 SDD 继承属性 : B.true B.false S.next B.true: B.false: S.next: B.code S 1.code goto S.next S 2.code... to B.true to B.false 产生式 3)S if (B) S 1 else S 2 语义规则 B.true = newlable( ); B.false = newlable( ); S 1.next= S.next; S 2.next= S.next; S.code =B.code label(b.true) S 1.code gen('goto' S.next) label(b.false) S 2.code
70 P S 产生式的 SDD 产生式 继承属性 : S.next 综合属性 : S.code P.code 语义规则 1)P S; S.next =newlable( ); P.code = S.code label(s.next) 5)L SL 1 S.next = newlable( ); L 1.next = L.next; L.code =S.code L 1.code 继承属性 : L {if S 是控制语句 S.next = newlable( ); L 1.next= S.next; } S {L 1.inh_code+ = S.code } L 1 {L.code += L 1.code} L {L.code = L.inh_code}
71 S while(b) S 1 语句的 SDT begin: B.true: B.false: B.code S 1.code goto begin... to B.true to B.false S.next 随堂测试 : 写出在 LL 分析中的 SDT; 写出在 LR 分析中的 SDT;
72 布尔表达式的中间代码例子 例 : 将 if (x<100 x > 200 && x!= y ) x = 0; 翻译成三地址 码 if x<100 goto L 2 goto L 3 L 3 : if x> 200 goto L 4 goto L 1 B 1 B B 4 L 4 : if X!=y goto L 2 goto L 1 L 2 : x = 0 L 1 : x<100 B 2 x>200 && B 3 x!=y
73 翻译布尔表达式 B 的 SDD 产生式 1)B true; 2)B false 3)B E 1 rel E 2 语义规则 B.code = gen('goto' B.true) B.code = gen('goto' B.false) B.code =E 1.code E 2.code gen('if' E 1.addr rel.op E 2.addr 'goto' B.true) gen('goto' B.false)
74 翻译布尔表达式的 SDD 产生式 4)B!B 1 ; 语义规则 B1.true =B.false; B1.false = B.true; 5)B B 1 && B 2 B 1.true = newlabel( ); B 1.false = B.false; B 2.true = B.true; B 2.false = B.false; B.code =B 1.code label(b 1.true) B 2.code
75 翻译布尔表达式的 SDD 产生式 6)B B 1 B 2 语义规则 B 1.true = B.true; B 1.false = newlabel( ); B 2.true = B.true; B 2.false = B.false; B.code =B 1.code label(b 1.false) B 2.code
76 布尔表达式代码的例子 例 : 将 if (x<100 x > 200 && x!= y ) x = 0; 翻译成三地址 码 if x<100 goto L 2 goto L 3 L 3 : if x> 200 goto L 4 goto L 1 B 1 B B 4 L 4 : if X!=y goto L 2 goto L 1 L 2 : x = 0 L 1 : x<100 B 2 x>200 && B 3 x!=y
77 优化 : 减少 goto 指令 例 : 将 if (x<100 x > 200 && x!= y ) x = 0; 翻译成三地址 码 if x<100 goto L 2 goto L 3 L 3 : if x> 200 goto L 4 goto L 1 L 4 : if X!=y goto L 2 goto L 1 L 2 : x = 0 L 1 : 多余 iffalse x>200 goto L 1 iffalse x!=y goto L 1 if(b) S 1 B 的指令之后就是 S 1, B.true 不须要, 设为 fall
78 S if (B) S 1 语句中减少 goto 指令 B.true: B.false: 产生式 3)B E 1 rel E 2 B.code S 1.code... 语义规则 if B.true fall then B.code =E 1.code E 2.code gen('if' E 1.addr rel.op E 2.addr 'goto' B.true) else to B.true to B.false B.false: B.true= fall B.code S 1.code... B.false B.code =E 1.code E 2.code gen('if False' E 1.addr rel.op E 2.addr 'goto' B.false)
79 减少 goto 指令 产生式 3)B E 1 rel E 2 语义规则 B.code =E1.code E1.code gen('if' E1.addr rel.op E2.addr 'goto' B.true) 产生式 3)B E 1 rel E 2 语义规则 if B.true fall then B.code =E1.code E1.code gen('if' E1.addr rel.op E2.addr 'goto' B.true) else B.code =E1.code E1.code gen('if False' E1.addr rel.op E2.addr 'goto' B.false)
80 减少 goto 指令 (2) B B 1 B 2 当 B.true=fall 时 B 1.true S.next B 1.code B 2.code S 1.code... to B 1.true to B 2.false 因为 B 1.false 就是 B 2.code, 因此设 B 1.false=fall, 要省了一 条 goto B 2 起始处的指令 因为 B.true=fall, 又 B 1.code 中要跳转到 S 1.code 的开始 处, 只好创建 B 1.true
81 减少 goto 指令 (2) B B 1 && B 2 当 B.true=fall 时 B 1.true S.next B1.code B 2.code S1.code... to B 1.false to B 2.false 因为 B 1.true 就是 B 2.code 起始处, 因此要设 B 1.true=fall, 省了一条 goto B 2 起始处的指令因为 B 2.true=fall, 又 B 2.code 后自然接 S 1, 省了一条 goto S 1 起始处的指令
82 goto 的优化 c=0 L 0 : if (c>10) goto L 1 goto S (while).next L 1 : L 3 : L 4 : c=c-1 if(a>b) goto L 3 goto L 4 d=x+y goto S (if).next d=x*y S (if).next: goto L 0 S (while).next: x=1 { c=0; while(c>10) { c=c-1; if (a>b) d=x+y; else d=x*y; } x=1 } goto 的目标, 还是一个 goto
83 goto 的优化 S while(b) S 1 S 1.next = S.begin 现在 :S 1 S a S b 直接表明了 S a.next 就是 S b S b.next 应该 = S 1.next { c=0; while(c>10) { c=c-1; if (a>b) d=x+y; else d=x*y; } x=1 } 产生式 语义规则 5)S S 1 S 2 S 1.next = newlable( ); S 2.next= S.next; S.code =S 1.code label( S 1.next) S 2.code 5)S S 1 S 2 S 2.next= S.next; S.code =S 1.code S 2.code
84 S { L } S L c = 0 S L while (B) S S c > 10 { L } x = 1 S L c=c-1 S L if ( B ) S else S d=x+y d=x*y L 观察 { c=0; while(c>10) { c=c-1; if (a>b) d=x+y; else d=x*y; } x=1 } 在 LL(1) 中,L SL 1 对于 S, 它怎么知道自己是不 是当前块中的最后一个语句?
85 观察 c=0 if (c>10) goto L 1 goto L 0 L 1 : c=c-1 if(b>c) goto L 3 goto L 2 L 3 : b=x+y if(a>b) goto L 5 goto L 4 L 3 : a=x*y L 0 : L 2 : L 4 : x=1 c=0; if(c>10) { c=c-1; if (b>c) { b=x+y; if (a>b) { a=x*y; } } } x=1 在 LL(1) 中, 对 L SL 1, 要展开 S 时, 不知道 L 1 将会是按照 L SL 1 还是 L 展开? 导致每个语句的 S.next =newlabel();
86 翻译布尔表达式的 SDD 产生式 6)B B 1 B 2 语义规则 B 1.true = B.true; B 1.false = newlabel( ); B 2.true = B.true; B 2.false = B.false; B.code =B 1.code label(b 1.false) B 2.code 产生式 6)B B 1 B 2 语义规则 if B.true = fall then B 1.true = newlabel(); else B 1.true = B.true; B 1.false = fall; B 2.true = B.true; B 2.false = B.false; if B.true = fall then B.code =B 1.code B 2.code label(b 1.true) else B.code =B 1.code label(b 1.false) B 2.code
87 求布尔表达式的值, 比如 :x= a<b S id =B 等价于 if (B) id=true else id = false; 随堂测试 : 写出在 LL 分析中的 SDT; 写出在 LR 分析中的 SDT;
88 生成 goto 时, 其目标指令有两种情形 : 在前 ; 在后 c=0 L 0 : if (c>10) goto L 1 goto S (while).next L 1 : L 3 : L 4 : c=c-1 if(a>b) goto L 3 goto L 4 d=x+y goto S (if).next d=x*y S (if).next: goto L 0 S (while).next: x=1 在前 在后 目标指令尚未已知 c=0; while(c>10) { c=c-1; if (a>b) d=x+y; else d=x*y; } x=1
89 在 LR 分析中, 回填技术的基本思想 在代码生成中, 当生成 goto S.next 指令时, 记下该指令的 id, 即该指令在三地址码表中的行号, 添加到 S 的综合属性 S.nextList 中 随后, 当规约 S while (B) S 1 时, 在执行 AddLabel(S.next ':') 时,S.next 的值就确定下来了 使用 S.nextList, 就知道哪些 goto 指令的目标是 S.next 定位这些前面的 goto 指令所在的行号, 回填上这些行所要的 S.next 值 ;
90 中 布尔表达式的回填翻译 对布尔表达式 B, 因为有继承属性 ture 和 false, 自然也要引入两个综合属性 truelist: 对于 goto 指令, 如果其目标是 B.true, 则其 id( 即在三地址码表中所在的行号 ) 在 truelist 中 ; Falselist: 包含跳转指令的列表, 为 false 时执行这些指令辅助函数 : Makelist(i) : 创建一个只含 i 的列表, 返回该列表 ; Merge(p 1,p 2 ): 合并 p 1 和 p 2 两个列表, 返回合并后的列表 Backpatch(p,i): 将 i 作为 goto 目标地址, 回填到 p 所含各指令
91 布尔表达式的回填翻译 SDT 1)B true; { B.truelist = makelist(nextinstr); gen('goto _'); } 2)B false; { B.falselist = makelist(nextinstr); gen('goto _');} 3)B E 1 rel E 2 { B.truelist = makelist(nextinstr); B.falselist = makelist(nextinstr + 1); gen('if' E 1.addr rel.op E 2.addr 'goto _'); gen('goto _'); }
92 布尔表达式的回填翻译 SDT 4)B (B 1 ); { B.truelist = B 1.truelist; B.falselist = B 1.falselist ; } 5)B!(B 1 ); { B.truelist = B 1.falselist; B.falselist = B 1.truelist; }
93 布尔表达式的回填翻译 SDT 6)B B 1 && { B 2.instr = nextinstr; } B 2 { Backpatch(B 1.truelist, B 2.instr); B.truelist = B 2.truelist; B.falselist = merge(b 1.falselist, B 2.falselist); } 7)B B 1 { B 2.instr = nextinstr; } B 2 { Backpatch(B 1.falselist, B 2.instr); B.falselist = B 2.falselist; B.truelist = merge(b 1.truelist, B 2.truelist); }
94 回填例子 :x<100 x>200 && x!=y 假设从 nextinstr = 100 开始 B 1 t={100} f={101} x<100 i=102 B 5 t={100,104} f={103,105} t={104} i=104 B 4 B 2 t={102} f={103} && f={103,105} B 3 t={104} f={105} 100: if x<100 goto _ 101: goto _ 102: if x>200 goto _ 103: goto _ 104: if x!=y goto _ 105: goto _ x>200 x!=y
95 回填例子 :x<100 x>200 && x!=y 假设从 nextinstr = 100 开始 if (x<100 x > 200 && x!= y ) x = 0; B 1 t={100} f={101} i=102 B 5 t={100,104} f={103,105} t={104} i=104 B 4 f={103,105} 100: if x<100 goto _ 101: goto _ 102: if x>200 goto _ 103: goto _ 104: if x!=y goto _ 105: goto _ 106: x=0 107: x<100 B 2 t={102} f={103} x>200 && t={104}b 3 f={105} x!=y B.code Label(B.true) S 1.code Label(B.false)
96 L 1 : L 3 : 观察 : 在 LL 分析中, 可能一行的前面有多个 goto 标签 c=0 c=0; if (c>10) goto L 1 if(c>10) { goto L 0 c=c-1; c=c-1 if (b>c) { if(b>c) goto L 3 b=x+y; goto L 2 if (a>b) { b=x+y a=x*y; if(a>b) goto L 5 } goto L 4 } a=x*y } x=1 L 3 : L 0 : L 2 : L 4 : x=1 原因是 : 控制语句嵌套, 而且被嵌套的控制语句在其所在的块中 为最后一个语句 存在嵌套关系的三个 if 语句的 next 都是 x=1 语句 ;
97 观察 : 在 LL 分析中,goto 的目标, 可能也是 goto c=0 L 0 : if (c>10) goto L 1 goto S (while).next L 1 : L 3 : L 4 : c=c-1 if(a>b) goto L 3 goto L 4 d=x+y goto S (if).next d=x*y S (if).next: goto L 0 S (while).next: x=1 c=0; while(c>10) { c=c-1; if (a>b) d=x+y; else d=x*y; } x=1 原因是 : 要展开 if 语句时, 无法知道它是其所在块的最后一个语句 只有当它被匹配完之后, 看到当前输入符为 '}' 时, 才能知道它是其所在块中的 last 语句 但为时已晚, 因为开始时就要确定其 next
98 LR 分析中, 能克服上述两个问题 c=0 if (c>10) goto L 1 goto L 0 L 1 : c=c-1 if(b>c) goto L 3 goto L 2 L 3 : b=x+y if(a>b) goto L 5 goto L 4 L 3 : a=x*y L 0 : L 2 : L 4 : x=1 c=0; if(c>10) { c=c-1; if (b>c) { b=x+y; if (a>b) { a=x*y; } } } x=1 a=x*y; 语句规约出来后, 看当前输入符, 它是 }, 意味着该语句 在其所在块中是最后一个语句, 意味着它的 next 并不确定, 是其 父的 next 即其父.nextlist = 它的.next
99 c=0 if (c>10) goto L 1 goto L 0 L 1 : c=c-1 if(b>c) goto L 3 goto L 2 L 3 : b=x+y if(a>b) goto L 5 goto L 4 L 3 : a=x*y L 0 : L 2 : L 4 : x=1 LR 分析中, 一个语句的 next 变得确定的时刻 c=0; if(c>10) { c=c-1; if (b>c) { b=x+y; if (a>b) { a=x*y; } } } x=1 一个语句要被规约出来的时候, 看当前输入符, 如果不是 }, 意 味着该语句在其所在的块中不是 last 语句 此时该语句的 next 变 得确定, 就是 nextinstr;
100 在 LL 分析中,goto 的目标可能也是 goto, LR 分析能优化它 c=0 L 0 : if (c>10) goto L 1 goto S (while).next L 1 : L 3 : L 4 : c=c-1 if(a>b) goto L 3 goto L 4 d=x+y goto S (if).next d=x*y S (if).next: goto L 0 S (while).next: x=1 c=0; while(c>10) { c=c-1; if (a>b) d=x+y; else d=x*y; } x=1 此例中 S while(b) S 1 ; 这里 S 1 {S 2 }, S 2 S a S b,s b 是 if 语句 是其所在块的 last 语句, 因此 S b.next = S 2.next =S 1.next =L 0 当 S b 要规约出来时, 因当前输入符是 }, 意味着 S 1 到了末尾
101 控制转移语句的回填 S if ( B ) S 1 if (B) S 1 else S 2 while (B) S 1 { L } A L L S S 语句的综合属性 :S.nextlist
102 if 语句的回填 (2) 1) S if (B) { S 1.instr = nextinstr;} S 1 { backpatch(b.truelist, S 1.instr); S.nextlist = merge(b.falselist, S 1.nextlist); } 2) S if (B) { S 1.instr = nextinstr; } S 1 N else {S 2.instr = nextinstr;} S 2 { backpatch(b.truelist, S 1.instr); backpatch(b.falselist, S 2.instr); temp= merge(s 1.nextlist, N.nextlist); S.nextlist = merge(temp, S 2.nextlist); } 3) N { N.nextlist = makelist(nextinstr); gen('goto _'); } N 的作用是生成 goto 指令坯,N.nextlist 记录了这个指令的位置
103 S while (B) S 1 语句的回填 4) S while ( { B.instr = nextinstr;} B) { S 1.instr = nextinstr;} S 1 { backpatch(s 1.nextlist, B.instr); backpatch(b.truelist, S 1.instr); S.nextlist = B.falselist; gen('goto' B.instr); }
104 其它语句的回填 (3) S A; { S.nextlist =null; } S {S 1 } { S.nextlist =S 1.nextlist ; } S S 1 { backpatch(s 1.nextlist, nextinstr); } S 2 { S.nextlist = S 2.nextlist; }
105 Break Continue 的处理 虽然 break continue 在语法上就是一个句子, 但是它的代码 却和外围语句相关 只有在循环语句中才能出现, 否则就是语 法错误
106 6.8 switch 语句 switch 语句结构 : switch (E) of { case V 1 : S 1 ; case V 2 : S 2 ; case V n-1 :S n-1 ; otherwise: S n }
107 翻译法 1 T=E L 1 : if T V 1 goto L 2 S 1 的代码 goto next L 2 : if T V 2 goto L 3 S 2 的代码 goto next L 3 : L n-1 : if T V n-1 goto L n S n-1 的代码 goto next L n : next: S n 的代码
108 翻译法 2 L 1 : L n-1 : L n : T=E goto test 关于 S 1 的中间码 goto next 关于 S n-1 的中间码 goto next 关于 S n 的中间码 goto next test: if T=V 1 goto L 1 if T=V 2 goto L 2... if T=V n-1 goto L n-1 goto L n next:
109 用来翻译 switch 语句的 case 三地址代 码指令 Case t V 1 L 1 Case t V 2 L 2 Case t V n-1 L n-1 Case t t L n next:
110 过程的中间代码 在三地址码中, 函数调用被拆分为准备进行调用时的参数求值, 然后是调用本身 设 a 为 int 类型的数组, n = f(a[i]); 的三地址码 : t 1 =i*4 t 2 =a[t 1 ] param t 2 t 3 = call f, 1 n = t 3
111 函数定义和调用的产生式 D T id(f) {S} F T id T id, F S return E; E id(a) A E E, A
112 过程调用的处理 过程调用主要对应两种事 : 传递参数 转子 传地址 : 把实在参数的地址传递给相应的形式参数 调用段预先把实在参数的地址传递到被调用段可以拿到的地方 ; 程序控制转入被调用段之后, 被调用段首先把实在参数的地址抄进自己相应的形式单元中 ; 过程体对形式参数的引用域赋值被处理成对形式单元的间接访问
113 过程调用的翻译 翻译方法 : 把实参的地址逐一放在转子指令的前面. 例如, CALL S(A,X+Y) 翻译为 : t1=x+y param A /* 第一个参数的地址 */ param t1 /* 第二个参数的地址 */ call S,2 /* 转子 */
114 过程调用的翻译 过程调用文法 : (1) S id (Elist) (2) Elist Elist, E (3) Elist E 参数的地址存放在一个队列中 最后对队列中的每一项生成一条 param 语句
115 翻译模式 3. Elist E { 初始化 queue 仅包含 E.place;n=0 } 2. Elist Elist, E { 将 E.place 加入到 queue 的队尾 ;n=n+1 } 1. S id(elist) { for 队列 queue 中的每一项 p do gen( param p); gen( call id.addr, n) }
116 第六章中间代码生成 语义分析和中间代码生成 中间代码表示 类型检查和翻译 中间代码生成 DAG 图 三地址码 静态单赋值 表达式翻译 控制流翻译 回填 过程翻译
117 谢谢谢谢!
编译原理 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编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2019
编译原理 Compiler Principles 第六章中间代码生成 湖南大学信息科学与工程学院 软件工程系杨金民 2019 什么叫语法制导的翻译 (SDT) 求表达式的值 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
More informationPowerPoint Presentation
第六章中间代码生成 许畅 南京大学计算机系 2018 年春季 本章内容 中间代码表示 表达式的有向无环图 DAG 三地址代码 :x = y op z 类型检查 类型 类型检查 表达式的翻译 中间代码生成 控制流 回填 2 编译器前端的逻辑结构 前端是对源语言进行分析并产生中间表示 处理与源语言相关的细节, 与目标机器无关 前端后端分开的好处 : 不同的源语言 不同的机器可以得到不同的编译器组合 3
More informationMicrosoft PowerPoint - 6 Intermediate-Code Generation.pptx
第六章中间代码生成 陈林 本章内容 中间代码表示 抽象语法树 三地址代码 中间代码生成 表达式 类型检查 控制流 编译器前端的逻辑结构 静态类型检查和中间代码生成的过程都可以用语法制导的翻译来描述和实现 对于抽象语法树这种中间表示的生成, 第五章已经介绍过 表达式的有向无环图 语法树中, 公共子表达式每出现一次, 就有一个对应的子树 表达式的有向无环图 (Directed Acyclic Graph,DAG)
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 informationMicrosoft PowerPoint - ch6 [Compatibility Mode]
第 6 章 中间代码生成 记号流 分析器 本章内容 静态检查器 中间代码生成器 中间代码 代码生成器 介绍几种常用的中间表示 : 后缀表示 图形表示和三地址代码 用语法制导定义和翻译方案来说明源语言的各种构造怎样被翻译成中间形式 6.1.1 后缀表示表达式 E 的后缀表示可以如下归纳定义 如果 E 是变量或常数, 那么 E 的后缀表示就是 E 本身 如果 E 是形式为 E 1 ope 2 的表达式,
More informationMicrosoft PowerPoint - ch7 [Compatibility Mode]
记号流 第七章 分析器 静态检查器 中间代码生成 中间代码生成器 中间代码 代码生成器 本章内容 介绍几种常用的中间表示 (intermediate representation): 后缀表示 图形表示和三地址代码 用语法制导定义和翻译方案来说明源语言的各种构造怎样被翻译成中间形式 7.1.1 后缀表示 E E ope uope (E) id num 表达式 E 的后缀表示可以如下归纳定义 : 表达式
More informationMicrosoft 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大侠素材铺
编译原理与技术 中间代码生成 Ⅰ 计算机科学与技术学院 李诚 12/11/2018 关于课程实验 目标 : 为 PL0 语言实现一个简单的编译器 Project 1: 词法分析 Project 2: 语法分析 Project 3: 语法错误处理 + 对前两个 project 的扩展, 11.15 release,11.30 提交 Project 4: 代码生成,12.1 release,12.15
More informationMicrosoft PowerPoint - ch7.ppt [兼容模式]
第七章 中间代码生成 静态中间代码记号分析检查代码中间生成流器器生成代码器器本章内容 介绍几种常用的中间表示 (intermediate representation): 后缀表示 图形表示和三地址代码 用语法制导定义和翻译方案来说明源语言的各种 用语法制导定义和翻译方案来说明源语言的各种构造怎样被翻译成中间形式 7.1.1 后缀表示 7.1 中间语言 E E ope uope (E) id num
More informationMicrosoft PowerPoint - ir
中间语言与中间代码生成 张昱 编译原理和技术 0551-63603804,yuzhang@ustc.edu.cn 中国科学技术大学计算机科学与技术学院 记号流 本章内容 分析器 语法树 静态检查器 语法树 中间中间代码代码生成器 代码生成器 符号表本章内容 中间语言 : 常用的中间表示 (Intermediate Representation) 后缀表示 图表示 三地址代码 LLVM IR 基本块和控制流图
More information词 法 分 析
中间语言与中间代码生成 编译原理和技术 张昱 0551-63603804,yuzhang@ustc.edu.cn 中国科学技术大学计算机科学与技术学院 本章内容 记号流 分析器 语法树 静态检查器 语法树 中间代码生成器 中间代码 代码生成器 本章内容 中间语言 : 常用的中间表示 (Intermediate Representation) 后缀表示 图表示 三地址代码 LLVM IR 基本块和控制流图
More information编译技术 Compiler Principles 课程总结 湖南大学信息科学与工程学院软件工程系杨金民 2019/06
编译技术 Compiler Principles 课程总结 湖南大学信息科学与工程学院软件工程系杨金民 2019/06 软件工程技术知识体系 机器学习 / 神经网络 (AI) 不确定性 ( 概率 ) 编译技术 灵活多变, 但有基因 数据库技术 基础技术 联线 : 直观易懂 联系 组合, 摘取分布式系统面向对象编程计算机网络操作系统数据结构 2 灵活多变 : 计算器该如何编程实现? a + b a +
More informationchap07.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内容提要 1 语法制导翻译语法制导定义 S 属性定义的自下而上计算 L 属性定义的自上而下计算 L 属性定义的自下而上计算 2 中间代码生成中间语言声明语句赋值语句布尔表达式和控制流语句
编译原理 第七章语法制导翻译及中间代码生成 方徽星 扬州大学信息工程学院 (505) fnghuixing@yzueducn 2018 年 6 月 内容提要 1 语法制导翻译语法制导定义 S 属性定义的自下而上计算 L 属性定义的自上而下计算 L 属性定义的自下而上计算 2 中间代码生成中间语言声明语句赋值语句布尔表达式和控制流语句 11 语法制导定义 (Syntx-Directed Definition)
More informationエスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 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大侠素材铺
编译原理与技术 语法制导翻译 Ⅱ 计算机科学与技术学院 李诚 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大侠素材铺
编译原理与技术 词法分析 Ⅱ 计算机科学与技术学院李诚 13/09/2018 主要内容 记号 (token) 源程序 词法分析器 getnexttoken 语法分析器 符号表 词法分析器的自动生成 正则表达式 NFA DFA 化简的 DFA 词法分析器的生成器 Lex: flex jflex Fst lexicl nlyzer genertor 2/51 Regulr Expr to NFA 正则表达式
More informationMicrosoft 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 informationCC213
: (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 informationOOP 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新・解きながら学ぶJava
481! 41, 74!= 40, 270 " 4 % 23, 25 %% 121 %c 425 %d 121 %o 121 %x 121 & 199 && 48 ' 81, 425 ( ) 14, 17 ( ) 128 ( ) 183 * 23 */ 3, 390 ++ 79 ++ 80 += 93 + 22 + 23 + 279 + 14 + 124 + 7, 148, 16 -- 79 --
More informationOOP 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没有幻灯片标题
指针作为函数参数 : 原因 : 1 需要修改一个或多个值,( 用 return 语句不能解决问题 ) 2 执行效率的角度 使用方法 : 在函数原型以及函数首部中需要声明能够接受指针值的形参, 具体的写法为 : 数据类型 * 形参名 如果有多个指针型形参, 则用逗号分隔, 例如 : void swap(int *p1, int *p2) 它说明了形参 p1 p2 是指向整型变量的指针 在函数调用时,
More information, 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 informationOOP 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 informationuntitled
1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override
More information再版前言
第七章中间代码生成 在第一章已经介绍, 编译器的前端把源程序翻译成中间表示, 后端从中间代码产生目标代码, 与目标语言有关的细节尽可能限制在后端 使用独立于机器的中间形式的好处是 : 1. 再目标 (retargeting) 比较容易 把针对新机器的后端加到现成的前端上, 可以得到另一种机器的编译器 2. 独立于机器的代码优化器可用于这种中间表示 第九章将介绍这种代码优化 因此, 虽然可以把源程序直接翻译并生成目标代码,
More informationC++ 程序设计 告别 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无类继承.key
无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255
More informationGuava学习之Resources
Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于
More informationMicrosoft PowerPoint - L9-v3.pptx
Lecture 9: 语法制导的翻译 -I Xiaoyuan Xie 谢晓园 xxie@whu.edu.cn 计算机学院 E301 Introduction 9.1 概述 语义分析在编译程序中的作用 词法分析 目标代码生成 语法分析 中间代码优化 语义分析 分析 中间代码生成 合成 语法和语义的区别 语法 是描述一个合法定义的程序结构的规则 例如 id( ) 语义 说明一个合法定义的程序的含义
More information1... . 48 30 14 1000c.c 7.5 60 5 (7.5 ) (22 15 6 ). () 90 11 ~91 3 --- 1 2 3 4 () 91 4 ~91 5 --- 1 1 60 5 2 1 3 18 11 350ml ( ) 2 1 350ml 2 2 1-a 91 4 ~91 5 3 1-b 91 4 ~91 5 4 1-c 91 4 ~91 5 5 1 -- ab
More informationC/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帝国CMS下在PHP文件中调用数据库类执行SQL语句实例
帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)
More informationMicrosoft PowerPoint - 5 Syntax-Directed Translation.pptx
第五章语法制导的翻译 陈林 引言 使用上下文无关文法引导语言的翻译 CFG 的非终结符号代表了语言的某个构造 程序设计语言的构造由更小的构造组合而成 一个构造的语义可以由小构造的含义综合而来 比如 : 表达式 x+y 的类型由 x y 的类型和运算符 + 决定 也可以从附近的构造继承而来 比如 : 声明 int x; 中 x 的类型由它左边的类型表达式决定 语法制导定义和语法制导翻译 语法制导定义
More informationMicrosoft Word - 01.DOC
第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的
More informationC/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 informationGenerated by Unregistered Batch DOC TO PDF Converter , please register! 浙江大学 C 程序设计及实验 试题卷 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:3
浙江大学 C 程序设计及实验 试题卷 2002-2003 学年春季学期考试时间 : 2003 年 6 月 20 日上午 8:30-10:30 注意 : 答题内容必须写在答题卷上, 写在本试题卷上无效 一. 单项选择题 ( 每题 1 分, 共 10 分 ) 1. 下列运算符中, 优先级最低的是 A.
More informationC/C++程序设计 - 字符串与格式化输入/输出
C/C++ / Table of contents 1. 2. 3. 4. 1 i # include # include // density of human body : 1. 04 e3 kg / m ^3 # define DENSITY 1. 04 e3 int main ( void ) { float weight, volume ; int
More informationC/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 informationMicrosoft 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 informationC/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 informationOOP with Java 通知 Project 4: 5 月 2 日晚 9 点
OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =
More information新汉语水平考试
新 汉 语 水 平 考 试 HSK( 四 级 ) H41005 注 意 一 HSK( 四 级 ) 分 三 部 分 : 1. 听 力 (45 题, 约 30 分 钟 ) 2. 阅 读 (40 题,40 分 钟 ) 3. 书 写 (15 题,25 分 钟 ) 二 听 力 结 束 后, 有 5 分 钟 填 写 答 题 卡 三 全 部 考 试 约 105 分 钟 ( 含 考 生 填 写 个 人 信 息 时
More information新汉语水平考试
新 漢 語 水 平 考 試 HSK( 四 級 ) H41005 注 意 一 HSK( 四 級 ) 分 三 部 分 : 1. 聽 力 (45 題, 約 30 分 鐘 ) 2. 閱 讀 (40 題,40 分 鐘 ) 3. 書 寫 (15 題,25 分 鐘 ) 二 聽 力 結 束 後, 有 5 分 鐘 填 寫 答 題 卡 三 全 部 考 試 約 105 分 鐘 ( 含 考 生 填 寫 個 人 資 訊 時
More informationFY.DOC
高 职 高 专 21 世 纪 规 划 教 材 C++ 程 序 设 计 邓 振 杰 主 编 贾 振 华 孟 庆 敏 副 主 编 人 民 邮 电 出 版 社 内 容 提 要 本 书 系 统 地 介 绍 C++ 语 言 的 基 本 概 念 基 本 语 法 和 编 程 方 法, 深 入 浅 出 地 讲 述 C++ 语 言 面 向 对 象 的 重 要 特 征 : 类 和 对 象 抽 象 封 装 继 承 等 主
More information<4D6963726F736F667420506F776572506F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>
程 序 设 计 实 习 INFO130048 3-2.C++ 面 向 对 象 程 序 设 计 重 载 继 承 多 态 和 聚 合 复 旦 大 学 计 算 机 科 学 与 工 程 系 彭 鑫 pengxin@fudan.edu.cn 内 容 摘 要 方 法 重 载 类 的 继 承 对 象 引 用 和 拷 贝 构 造 函 数 虚 函 数 和 多 态 性 类 的 聚 集 复 旦 大 学 计 算 机 科 学
More informationebook14-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. (A) (B) (C) A (D) (E). (A)(B)(C)(D)(E) A
. () () () () () (A) (B) (C) B (D) (E). (A) (B) (C) E (D) (E) (A) (B) (C) (D). () () () () E (A) (B) (C) (D) (E). C (A) (B) (C) (D) (E). (A) (B) (C) (D) D (E). () - () - () - () - () - D (A) (B) (C) (D)
More informatione 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 程序设计语言应用
计算概论 A 程序设计部分 字符数组与字符串 李戈 北京大学信息科学技术学院软件研究所 lige@sei.pku.edu.cn 字符数组的定义 #include int main() char a[10] = 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' ; for (int i = 0; i < 10; i++) cout
More information试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new
试卷代号 :1075 座位号 rn 国家开放大学 ( 中央广播电视大学 )2015 年秋季学期 " 开放本科 " 期末考试 c+ 十语言程序设计试题 2016 年 1 月 t 问一 Urr-f 斗 士 1 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. long 2. 在每个 C 十 + 程序中都必须包含有这样一个函数, 该函数的函数名为 ) A.main
More informationMicrosoft PowerPoint - 5. 指针Pointers.ppt [兼容模式]
指针 Pointers 变量指针与指针变量 Pointer of a variable 变量与内存 (Variables and Memory) 当你声明一个变量时, 计算机将给该变量一个内存, 可以存储变量的值 当你使用变量时, 计算机将做两步操作 : - 根据变量名查找其对应的地址 ; - 通过地址对该地址的变量内容进行读 (retrieve) 或写 (set) 变量的地址称为变量的指针! C++
More informationMicrosoft Word - n9786954.doc
企 业 境 外 所 得 税 收 抵 免 操 作 指 南 目 录 第 一 条 关 于 适 用 范 围 第 二 条 关 于 境 外 所 得 税 额 抵 免 计 算 的 基 本 项 目 第 三 条 关 于 境 外 应 纳 税 所 得 额 的 计 算 第 四 条 关 于 可 予 抵 免 境 外 所 得 税 额 的 确 认 第 五 条 关 于 境 外 所 得 间 接 负 担 税 额 的 计 算 第 六 条 关
More informationMicrosoft PowerPoint - syntaxdirect
本章内容 语法制导的翻译 编译原理和技术 张昱 055-63603804,yuzhang@ustc.edu.cn 中国科学技术大学计算机科学与技术学院 语义描述的一种形式方法 语法制导的定义 (syntax-directed definition) + E.code = E.code.code + 可读性好, 更适于描述规范 翻译方案 (translation scheme) + { pr + 陈述了实现细节
More information新汉语水平考试
新 汉 语 水 平 考 试 HSK( 四 级 ) H41003 注 意 一 HSK( 四 级 ) 分 三 部 分 : 1. 听 力 (45 题, 约 30 分 钟 ) 2. 阅 读 (40 题,40 分 钟 ) 3. 书 写 (15 题,25 分 钟 ) 二 听 力 结 束 后, 有 5 分 钟 填 写 答 题 卡 三 全 部 考 试 约 105 分 钟 ( 含 考 生 填 写 个 人 信 息 时
More information试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. l
试卷代号 ~1075 座位号 E 口 国家开放大学 ( 中央广播电视大学 )20]5 年秋季学期 " 开放本科 " 期末考试 C 十十语言程序设计 试题 同二二十斗 2016 年 1 月 巴叫一 1. 下面的保留字 ( ) 不能作为函数的返回类型 A. void B. int C. new D. long 2. 在每个 c++ 程序中都必须包含有这样一个函数, 该函数的函数名为 ( ) A. main
More informationC/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 informationSDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基
开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些
More informationMicrosoft PowerPoint - 4. 数组和字符串Arrays and Strings.ppt [兼容模式]
Arrays and Strings 存储同类型的多个元素 Store multi elements of the same type 数组 (array) 存储固定数目的同类型元素 如整型数组存储的是一组整数, 字符数组存储的是一组字符 数组的大小称为数组的尺度 (dimension). 定义格式 : type arrayname[dimension]; 如声明 4 个元素的整型数组 :intarr[4];
More information新版 明解C++入門編
511!... 43, 85!=... 42 "... 118 " "... 337 " "... 8, 290 #... 71 #... 413 #define... 128, 236, 413 #endif... 412 #ifndef... 412 #if... 412 #include... 6, 337 #undef... 413 %... 23, 27 %=... 97 &... 243,
More information2011-论文选集-2.cdr
! "#$# $$ "#$#$$" " $% &%!$ $ "#$$ " ! "!#!$ %" #& # ( #$ ) )& )# )$ ** "& ")! ! "" # $% & &( ( # ) )** )*+ )*$ )) ))" ),+ )," -./ ) ) ) " )++ )+" )%,, !"#" $ ! " #$% & ( & ) % #$% #$% & * #$%#$% #$% (
More informationMicrosoft PowerPoint - typecheck
本章内容 类型检查 编译原理和技术 张昱 0551-63603804,yuzhang@ustc.edu.cn 中国科学技术大学计算机科学与技术学院 记号流 语法分析器 语法树语法树类型中间代码中间检查器生成器表示 符号表 语义检查中最典型的部分 类型检查 类型系统 类型检查 符号表的作用 多态函数 重载 其他的静态检查 ( 不详细介绍 ) 控制流检查 唯一性检查 关联名字检查 张昱 : 编译原理和技术
More information数据结构与算法 - Python基础
Python 教材及课件 课件及作业见网址 xpzhang.me 1 1. Python 2. 3. (list) (tuple) 4. (dict) (set) 5. 6. 7. 2 Python Python 3 Python 4 Python 1, 100, -8080, 0,... 0x 0-9, a-f 0 xff00, 0 xa432bf 5 1.24, 3.14, -9.80,...
More informationMicrosoft Word - mei.doc
看上去很美 王朔 编者的话 时隔七年 王朔又拿出了他的新作 一个过去写过很多东西 又曾声言放弃写作的 人 此番重新拿起笔 令我们感兴趣的倒也不是他的食言自肥 而是他是否确有一些新 意要表达 这才构成一部文学作品产生的必要成因 关于王朔 我们听到较多的是他的 调侃和所谓玩世不恭的写作态度 作为出版过他的全部作品的编者 我们知道那类作品 只是他全部作品的一小部分 在某一时刻被刻意演染夸张开来的一种风格
More information1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10
Java V1.0.1 2007 4 10 1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 6.2.10 6.3..10 6.4 11 7.12 7.1
More informationOOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac)
OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 2 提交时间 : 3 月 21 日晚 9 点 作业提交格式 学习使用 文本编辑器 cmd, PowerShell (Windows), terminal(linux, Mac) 复习 面向对象编程 将实际问题分解成不同的对象 不的对象提供不同的服务 对象之间可以传递消息 例子小李深夜
More informationuntitled
1-1 1-2 1-3 1-4 1-5 1-6 1-7 1-8 1-1-1 C int main(void){ int x,y,z; int sum=0; double avg=0.0; scanf("%d",&x) ; scanf("%d",&y) ; scanf("%d",&z) ; sum=x+y+z ; avg=sum/3.0; printf("%f\n",avg); system("pause");
More information第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修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 下面是一个 C 语言程序 : long f1( i
2013.12.8 7.4 修改图 7.5 中计算声明名字的类型和相对地址的翻译方案, 允许名字表而不是单个名字出现在形式为 D id : T 的声明中 即允许 a, b, c : integer 这种形式的变量声明 2013.12.1 6.12 下面是一个 C 语言程序 : long f1( i ) long i; { return(i 10); long f2(long i) { return(i
More information(京)新登字063号
教 育 部 职 业 教 育 与 成 人 教 育 司 推 荐 教 材 Java 程 序 设 计 教 程 ( 第 二 版 ) 沈 大 林 主 编 沈 昕 肖 柠 朴 曾 昊 等 编 著 内 容 简 介 Java 是 由 美 国 SUN 公 司 开 发 的 一 种 功 能 强 大 的, 具 有 简 单 面 向 对 象 分 布 式 可 移 植 等 性 能 的 多 线 程 动 态 计 算 机 编 程 语 言
More information全国计算机技术与软件专业技术资格(水平)考试
全 国 计 算 机 技 术 与 软 件 专 业 技 术 资 格 ( 水 平 ) 考 试 2008 年 上 半 年 程 序 员 下 午 试 卷 ( 考 试 时 间 14:00~16:30 共 150 分 钟 ) 试 题 一 ( 共 15 分 ) 阅 读 以 下 说 明 和 流 程 图, 填 补 流 程 图 中 的 空 缺 (1)~(9), 将 解 答 填 入 答 题 纸 的 对 应 栏 内 [ 说 明
More information概述
OPC Version 1.6 build 0910 KOSRDK Knight OPC Server Rapid Development Toolkits Knight Workgroup, eehoo Technology 2002-9 OPC 1...4 2 API...5 2.1...5 2.2...5 2.2.1 KOS_Init...5 2.2.2 KOS_InitB...5 2.2.3
More information,,,,,,,,,, : 12, 2 ; 1921,,,, ( ) ( ), ( ) ( ) ( ) ( ) 1945, 44 9, 33 4 1956 1 97 14, 73 8,,, 1949,,,,,,, ( ),, ( ),,, ( ),,,,,, 2 ,,,,,,,,,,,,, ; ;,,,,,, 3 1925,,,,, ( ),,,, 1 ( ),, 1922, ( ), 1925,,
More information2009年挑战乔戈里
2009 年 挑 战 乔 戈 里 活 动 概 况 : 乔 戈 里 峰 海 拔 8611 米, 它 是 喀 喇 昆 仑 山 脉 的 主 峰, 是 世 界 上 第 二 高 峰, 国 外 又 称 K2 峰 乔 戈 里 峰, 国 际 登 山 界 公 认 的 攀 登 难 度 较 大 的 山 峰 之 一 乔 戈 里 峰 峰 巅 呈 金 字 塔 形, 冰 崖 壁 立, 山 势 险 峻, 在 陡 峭 的 坡 壁 上
More informationPs22Pdf
990 1995 ( ),,,,,,, ( ) ( ) ;, ;,, ( ),, 2000 7 1 ( 1 ) ( 4 ) ( 6 ) ( 15 ) ( 21 ) ( 33 ) ( 36 ) ( 43 ) ( 53 ) ( 60 ) ( 65 ) ( 74 ) ( 84 ) ( 87 ) ( 92 ) ( 97 ) (100) (111) (116) (119) (122) (127) (138)
More informationPython a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2
Chapter 02 變數與運算式 2.1 2.1.1 2.1.2 2.1.3 2.1.4 2.2 2.2.1 2.2.2 2.2.3 type 2.2.4 2.3 2.3.1 print 2.3.2 input 2.4 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 + 2.4.6 Python Python 2.1 2.1.1 a p p l e b e a r c 65438790
More information2007
2007 年 上 半 年 软 件 评 测 师 考 试 浅 析 作 者 : 陈 嘉 祥 方 耀 公 司 : 广 东 亿 迅 科 技 有 限 公 司 ( 质 量 管 理 部 ) 1 简 介 1.1 目 的 本 文 章 主 要 介 绍 软 件 评 测 师 考 试 的 范 围 内 容 以 及 其 重 要 性, 还 有 相 关 的 试 题 分 析 1.2 适 用 范 围 有 意 参 与 或 将 来 有 意 参
More informationC/C++语言 - 分支结构
C/C++ Table of contents 1. if 2. if else 3. 4. 5. 6. continue break 7. switch 1 if if i // colddays.c: # include int main ( void ) { const int FREEZING = 0; float temperature ; int cold_ days
More informationMicrosoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc
2 5 8 11 0 13 1. 13 2. 15 3. 18 1 23 1. 23 2. 26 3. 28 2 36 1. 36 2. 39 3. 42 4. 44 5. 49 6. 51 3 57 1. 57 2. 60 3. 64 4. 66 5. 70 6. 75 7. 83 8. 85 9. 88 10. 98 11. 103 12. 108 13. 112 4 115 1. 115 2.
More informationPowerPoint Presentation
数据结构与算法 ( 六 ) 张铭主讲 采用教材 : 张铭, 王腾蛟, 赵海燕编写高等教育出版社,2008. 6 ( 十一五 国家级规划教材 ) http://www.jpk.pku.edu.cn/pkujpk/course/sjjg 第 6 章树 C 树的定义和基本术语 树的链式存储结构 子结点表 表示方法 静态 左孩子 / 右兄弟 表示法 动态表示法 动态 左孩子 / 右兄弟 表示法 父指针表示法及其在并查集中的应用
More informationMicrosoft PowerPoint - ch4.ppt [兼容模式]
第四章语法制导的翻译 本章内容 1 介绍语义描述的一种形式方法 : 语法制导的翻译 (sytax-directed traslatio), 它包括两种具体形式 语法制导的定义 (sytax-directed defiitio) E.code = E 1.code.code 可读性好, 更适于描述规范 翻译方案 (traslatio scheme) { prit } 陈述了实现细节 ( 如语义规则的计算时机
More information壹、
1 1 20ml. 10 35% 10 3 2 2 250ml. 10 2 (30c.c) 1 75ml 2 4 3 2 1 1 2 1. 2. 1c 3 4 5 1. 2. 3. 4. 5. 1. 2 6 2. 1 3. 7 1. 2. 3. 1. 2. 1 3. 8 1. 9 2. 50 3. 4. 10 5. 10 6. 25c.c. 4 7. 8. 50c.c. 9. 10. 11 12 25.63
More information2010年3月计算机等级考试四级网络工程师笔试
计 算 机 二 级 VB 经 典 预 测 题 下 列 各 题 A) B) C) D) 四 个 选 项 中, 只 有 一 个 选 项 是 正 确 的 请 将 正 确 选 项 填 涂 在 答 题 卡 相 应 位 置 上, 答 在 试 卷 上 不 得 分 (1) 下 列 叙 述 中 正 确 的 是 ( ) A) 循 环 队 列 是 队 列 的 一 种 链 式 存 储 结 构 B) 循 环 队 列 是 队
More informationOOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点
OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 : Project 2 提交时间 : 3 月 15 日晚 9 点 复习 : Java 类型 基本类型 boolean, char, 封装 (wrappers) 类 (class) 定义 class MyType { int i; double d; 数据 (Fields) char c; void set(double
More informationMicrosoft Word - 新1-12.doc
实训 5 面向对象编程练习 实训 5 面向对象编程练习 5.1 实训目的 通过编程和上机实验理解 Java 语言是如何体现面向对象编程基本思想 以及如何创建类 和对象 了解成员变量和成员方法的特性 5.2 实训要求 编写一个体现面向对象思想的程序 编写一个创建对象和使用对象的方法的程序 5.3 实训内容 5.3.1 创建对象并使用对象 1 定义一个 Person 类 可以在应用程序中使用该类 成员属性
More information:53 "# $%& % ' # # _(! ], X ) DC?]%'4 ) )M - N 3 U? G 95 N Z[$ 4 ] 9 ]C
2015-03-05 14:53 http://www.cnki.net/kcms/detail/51.1686.n.20150305.1453.012.html! "# $%& % ' # # _(! ], X ) DC?]%'4 ) )M - N 3 U? G 95 N Z[$ 4 ] 9 ]C ' '? `L 1]a 9$ ; < _ O ]C+ >+ O ` ] EQ + $ 4 ] 7 V
More informationFun 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目 前 言... 1 一 发 展 背 景... 2 ( 一 ) 发 展 优 势...2 ( 二 ) 机 遇 挑 战...6 ( 三 ) 战 略 意 义...8 二 总 体 要 求... 9 ( 一 ) 指 导 思 想...9 ( 二 ) 基 本 原 则...10 ( 三 ) 战 略 定 位... 1
吉 林 省 东 部 绿 色 转 型 发 展 区 总 体 规 划 吉 林 省 发 展 和 改 革 委 员 会 2015 年 1 月 目 前 言... 1 一 发 展 背 景... 2 ( 一 ) 发 展 优 势...2 ( 二 ) 机 遇 挑 战...6 ( 三 ) 战 略 意 义...8 二 总 体 要 求... 9 ( 一 ) 指 导 思 想...9 ( 二 ) 基 本 原 则...10 ( 三
More informationMicrosoft PowerPoint - 3. 函数Functionl.ppt [兼容模式]
函数 Function 如何重用代码 How to reuse code 3 4 = 3*3*3*3 3 4,6 5 : 拷贝 - 粘帖代码 (Copy-paste code) 3 4,6 5,12 10 : 拷贝 - 粘帖代码 (Copy-paste code) Bad! 使用函数 (with a function) 使用函数 (with a function) 使用函数 (with a function)
More information02
Thinking in C++: Volume One: Introduction to Standard C++, Second Edition & Volume Two: Practical Programming C++ C C++ C++ 3 3 C C class C++ C++ C++ C++ string vector 2.1 interpreter compiler 2.1.1 BASIC
More informationMicrosoft Word - 《C语言开发入门》课程教学大纲-2.doc
C 语言开发入门 课程教学大纲 ( 课程英文名称 ) 课程编号 :201409210011 学分 :5 学分学时 :60 学时 ( 其中 : 讲课学时 :37 学时上机学时 :23 学时 ) 先修课程 : 计算机导论后续课程 :C++ 程序设计适用专业 : 信息及其计算机相关专业开课部门 : 计算机系 一 课程的性质与目标 C 语言开发入门 是计算机各专业必修的基础课程, 是数据结构 C++ Java
More information勤 學 * 卓 越 * 快 樂 成 長 本 校 在 老 師 群 策 群 力 共 同 討 論 下, 型 塑 了 學 校 願 景 : 勤 學 卓 越 快 樂 成 長 ( 一 ) 勤 學 運 用 真 的 力 量 培 養 勤 學, 以 語 文 教 為 基 礎 紮 根 ( 二 ) 卓 越 利 用 美 的 感
桃 園 市 復 旦 國 民 小 學 104 學 年 度 學 校 課 程 計 畫 壹 依 據 貳 目 的 一 教 基 本 法 第 13 條, 國 民 教 法 第 4 條 二 教 部 92 公 佈 之 國 民 中 小 學 九 年 一 貫 課 程 綱 要 三 桃 園 市 政 府 推 動 國 民 中 小 學 九 年 一 貫 課 程 實 施 計 畫 四 桃 園 市 政 府 97.5.29 府 教 數 字 第
More informationC/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 informationC++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1
C++ 程序设计 告别 OJ2 - 参考答案 MASTER 2019 年 5 月 3 日 1 1 TEMPLATE 1 Template 描述 使用模板函数求最大值 使用如下 main 函数对程序进行测试 int main() { double a, b; cin >> a >> b; cout c >> d; cout
More informationMicrosoft PowerPoint - 8. 运算符重载 Operator Overloading.pptx
运算符重载 Operator Overloading class Point { public: ; double x_, y_; Why Operator Overloading? Point (double x =0, double y = 0):x_(x),y_(y) { int main(){ Point a(1., 2), b(3,4); Point c = a + b; return 0;
More information個 人 的 手, 拉 著 瞎 子 的 手 把 他 帶 往 村 外 的 時 候, 對 於 瞎 子 來 講, 那 個 人 的 手 和 耶 穌 的 手 有 沒 有 區 別? 沒 有! 為 什 麼 沒 有 區 別? 因 為 對 於 一 個 瞎 子 來 說, 手 和 耳 朵 就 是 他 接 觸 世 界, 瞭
課 目 : 講 道 法 學 生 : 楊 建 偉 老 師 : 汪 院 長 時 間 :2009 年 8 月 1 日 靈 命 三 階 ( 可 8:22-26) 在 四 部 福 音 書 中, 這 是 一 段 很 特 別 的 記 載 特 別 在 什 麼 地 方 呢? 是 不 是 特 別 在 耶 穌 基 督 對 一 個 病 人 的 醫 治? 不, 在 耶 穌 三 年 半 的 服 侍 當 中, 曾 經 醫 治 數
More information四川省普通高等学校
四 川 省 普 通 高 等 学 校 计 算 机 应 用 知 识 和 能 力 等 级 考 试 考 试 大 纲 (2013 年 试 行 版 ) 四 川 省 教 育 厅 计 算 机 等 级 考 试 中 心 2013 年 1 月 目 录 一 级 考 试 大 纲 1 二 级 考 试 大 纲 6 程 序 设 计 公 共 基 础 知 识 6 BASIC 语 言 程 序 设 计 (Visual Basic) 9
More informationC++ 程式設計
C C 料, 數, - 列 串 理 列 main 數串列 什 pointer) 數, 數, 數 數 省 不 不, 數 (1) 數, 不 數 * 料 * 數 int *int_ptr; char *ch_ptr; float *float_ptr; double *double_ptr; 數 (2) int i=3; int *ptr; ptr=&i; 1000 1012 ptr 數, 數 1004
More information