编译原理 第11章(清华大学)
编译原理(清华大学-第2版)课后习题答案

第三章N=>D=> {0,1,2,3,4,5,6,7,8,9}N=>ND=>NDDL={a |a(0|1|3..|9)n且 n>=1}(0|1|3..|9)n且 n>=1{ab,}a nb n n>=1第6题.(1) <表达式> => <项> => <因子> => i(2) <表达式> => <项> => <因子> => (<表达式>) => (<项>)=> (<因子>)=>(i)(3) <表达式> => <项> => <项>*<因子> => <因子>*<因子> =i*i(4) <表达式> => <表达式> + <项> => <项>+<项> => <项>*<因子>+<项>=> <因子>*<因子>+<项> => <因子>*<因子>+<因子> = i*i+i (5) <表达式> => <表达式>+<项>=><项>+<项> => <因子>+<项>=i+<项> => i+<因子> => i+(<表达式>) => i+(<表达式>+<项>)=> i+(<因子>+<因子>)=> i+(i+i)(6) <表达式> => <表达式>+<项> => <项>+<项> => <因子>+<项> => i+<项> => i+<项>*<因子> => i+<因子>*<因子> = i+i*i第7题第9题语法树ss s* s s+aa a推导: S=>SS*=>SS+S*=>aa+a*11. 推导:E=>E+T=>E+T*F语法树:E+T*T F短语: T*F E+T*F直接短语: T*F句柄: T*F12.<E><E> <T> <POP><T> <F> <MOP>短语:<T><F><MOP> <E><T><F><MOP><POP>直接短语:<T><F><MOP>句柄: <T><F><MOP>13.(1)最左推导:S => ABS => aBS =>aSBBS => aBBS=> abBS => abbS => abbAa => abbaa 最右推导:S => ABS => ABAa => ABaa => ASBBaa=> ASBbaa => ASbbaa => Abbaa => a1b1b2a2a3 (2) 文法:S → ABSS → AaS →εA → aB → b(3) 短语:a1 , b1 , b2, a2 , , bb , aa , abbaa,直接短语: a1 , b1 , b2, a2 , ,句柄:a114 (1)S → ABA → aAb | εB → aBb | ε(2)S → 1S0S → AA → 0A1 |ε第四章1. 1. 构造下列正规式相应的DFA(1)1(0|1)*101NFA(2) 1(1010*|1(010)*1)*0NFA(3)NFA(4)NFA2.解:构造DFA 矩阵表示a,bb其中0 表示初态,*表示终态用0,1,2,3,4,5分别代替{X} {Z} {X,Z} {Y} {X,Y} {X,Y,Z} 得DFA状态图为:3.解:构造DFA矩阵表示构造DFA的矩阵表示其中表示初态,*表示终态替换后的矩阵4.(1)解构造状态转换矩阵:{2,3} {0,1}{2,3}a={0,3}{2},{3},{0,1}{0,1}a={1,1} {0,1}b={2,2}(2)解:首先把M的状态分为两组:终态组{0},和非终态组{1,2,3,4,5} 此时G=( {0},{1,2,3,4,5} ) {1,2,3,4,5}a={1,3,0,5}{1,2,3,4,5}b={4,3,2,5}由于{4}a={0} {1,2,3,5}a={1,3,5}因此应将{1,2,3,4,5}划分为{4},{1,2,3,5}G=({0}{4}{1,2,3,5}){1,2,3,5}a={1,3,5}{1,2,3,5}b={4,3,2}因为{1,5}b={4} {23}b={2,3}所以应将{1,2,3,5}划分为{1,5}{2,3}G=({0}{1,5}{2,3}{4}){1,5}a={1,5} {1,5}b={4} 所以{1,5} 不用再划分{2,3}a={1,3} {2,3}b={3,2}因为 {2}a={1} {3}a={3} 所以{2,3}应划分为{2}{3}所以化简后为G=( {0},{2},{3},{4},{1,5})7.去除多余产生式后,构造NFA如下确定化,构造DFA 矩阵G={(0,1,3,4,6),(2,5)} {0,1,3,4,6}a={1,3}{0,1,3,4,6}b={2,3,4,5,6}所以将{0,1,3,4,6}划分为 {0,4,6}{1,3} G={(0,4,6),(1,3),(2,5)}{0,4,6}b={3,6,4} 所以 划分为{0},{4,6} G={(0),(4,6),(1,3),(2,5)}不能再划分,分别用 0,4,1,2代表各状态,构造DFA 状态转换图如下;b8.代入得S = 0(1S|1)| 1(0S|0) = 01(S|ε) | 10(S|ε) = (01|10)(S|ε)= (01|10)S | (01|10)= (01|10)*(01|10)构造NFA由NFA可得正规式为(01|10)*(01|10)=(01|10)+9.状态转换函数不是全函数,增加死状态8,G={(1,2,3,4,5,8),(6,7)}(1,2,3,4,5,8)a=(3,4,8) (3,4)应分出(1,2,3,4,5,8)b=(2,6,7,8)(1,2,3,4,5,8)c=(3,8)(1,2,3,4,5,8)d=(3,8)所以应将(1,2,3,4,5,8)分为(1,2,5,8), (3,4)G={(1,2,5,8),(3,4),(6,7)}(1,2,5,8)a=(3,4,8) 8应分出(1,2,5,8)b=(2,8)(1,2,5,8)c=(8)(1,2,5,8)d=(8)G={(1,2,5),(8),(3,4),(6,7)}(1,2,5)a=(3,4,8) 5应分出G={(1,2), (3,4),5, (6,7) ,(8) }去掉死状态8,最终结果为 (1,2) (3,4) 5,(6,7) 以1,3,5,6代替,最简DFA为b正规式:b*a(da|c)*bb*第五章1.S->a | ^ |( T )T -> T , S | S(a,(a,a))S => ( T ) => ( T , S ) => ( S , S ) => ( a , S) => ( a, ( T )) =>(a , ( T , S ) ) => (a , ( S , S )) => (a , ( a , a ) ) S=>(T) => (T,S) => (S,S) => ( ( T ) , S ) => ( ( T , S ) , S ) => ( ( T , S , S ) , S ) => ( ( S , S , S ) , S )=> ( ( ( T ) , S , S ) , S ) => ( ( ( T , S ) , S , S ) , S ) =>( ( ( S , S ) , S , S ) , S ) => ( ( ( a , S ) , S , S ) , S ) => ( ( ( a , a ) , S , S ) , S ) => ( ( ( a , a ) , ^ , S ) , S ) => ( ( ( a , a ) , ^ , ( T ) ) , S )=> ( ( ( a , a ) , ^ , ( S ) ) , S ) => ( ( ( a , a ) , ^ , ( a ) ) , S ) => ( ( ( a , a ) , ^ , ( a ) ) , a )S->a | ^ |( T )T -> T , ST -> S消除直接左递归:S->a | ^ |( T )T -> S T’T’ -> , S T’ | ξSELECT ( S->a) = {a}SELECT ( S->^) = {^}SELECT ( S->( T ) ) = { ( }SELECT ( T -> S T’) = { a , ^ , ( }SELECT ( T’ -> , S T’ ) = { , }SELECT ( T’ ->ξ) = FOLLOW ( T’ ) = FOLLOW ( T ) = { )}构造预测分析表分析符号串( a , a )#分析栈剩余输入串所用产生式#S ( a , a) # S -> ( T )# ) T ( ( a , a) # ( 匹配# ) T a , a ) # T -> S T’# ) T’ S a , a ) # S -> a# ) T’ a a , a ) # a 匹配# ) T’,a) # T’ -> , S T’# ) T’ S , , a ) # , 匹配# ) T’ S a ) # S->a# ) T’ a a ) # a匹配# ) T’) # T’ ->ξ# ) ) # )匹配# # 接受2.E->TE’E’->+E E’->ξT->FT’T’->T T’->ξF->PF’F’->*F’F’->ξP->(E) P->a P->b P->∧SELECT(E->TE’)=FIRST(TE’)=FIRST(T)= {(,a,b,^)SELECT(E’->+E)={+}SELECT(E’->ε)=FOLLOW(E’)= {#,)}SELECT(T->FT’)=FIRST(F)= {(,a,b,^}SELECT(T’ —>T)=FIRST(T)= {(,a,b,^)SELECT(T’->ε)=FOLLOW(T’)= {+,#,)}SELECT(F ->P F’)=FIRST(F)= {(,a,b,^}SELECT(F’->*F’)={*}SELECT(F’->ε)=FOLLOW(F’)= {(,a,b,^,+,#,)}3. S->MH S->a H->Lso H->ξK->dML K->ξL->eHf M->K M->bLM FIRST ( S ) =FIRST(MH)= FIRST ( M ) ∪FIRST ( H ) ∪{ξ} ∪{a}= {a, d , b , e ,ξ} FIRST( H ) = FIRST ( L ) ∪{ξ}= { e , ξ}FIRST( K ) = { d , ξ}FIRST( M ) = FIRST ( K ) ∪{ b } = { d , b ,ξ}FOLLOW ( S ) = { # , o }FOLLOW ( H ) = FOLLOW ( S ) ∪{ f } = { f , # , o }FOLLOW ( K ) = FOLLOW ( M ) = { e , # , o }FOLLOW ( L ) ={ FIRST ( S ) –{ξ} } ∪{o} ∪FOLLOW ( K )∪{ FIRST ( M ) –{ξ} } ∪FOLLOW ( M )= {a, d , b , e , # , o }FOLLOW ( M ) ={ FIRST ( H ) –{ξ} } ∪FOLLOW ( S )∪{ FIRST ( L ) –{ξ} } = { e , # , o }SELECT ( S-> M H) = ( FIRST ( M H) –{ξ} ) ∪FOLLOW ( S )= ( FIRST( M ) ∪FIRST ( H ) –{ξ} ) ∪FOLLOW ( S )= { d , b , e , # , o }SELECT ( S-> a ) = { a }SELECT ( H->L S o ) = FIRST(L S o) = { e }SELECT ( H ->ξ) = FOLLOW ( H ) = { f , # , o }SELECT ( K-> d M L ) = { d }SELECT ( K->ξ) = FOLLOW ( K ) = { e , # , o }SELECT ( L-> e H f ) = { e }SELECT ( M->K ) = ( FIRST( K ) –{ξ} ) ∪FOLLOW ( M ) = {d,e , # , o }SELECT ( M -> b L M )= { b }4 . 文法含有左公因式,变为S->C $ { b, a }C-> b A { b }C-> a B { a }A -> b A A { b }A-> a A’ { a }A’-> ξ{ $ , a, b }A’-> C { a , b }B->a B B { a }B -> b B’ { b }B’->ξ{ $ , a , b }B’-> C { a, b }5. <程序> --- S <语句表>――A <语句>――B <无条件语句>――C <条件语句>――D <如果语句>――E<如果子句> --FS->begin A end S->begin A end { begin }A-> B A-> B A’ { a , if }A-> A ; B A’-> ; B A’ { ; }A’->ξ{ end }B-> C B-> C { a } B-> D B-> D { if }C-> a C-> a { a }D-> E D-> E D’ { if }D-> E else B D’-> else B { else }D’->ξ{; , end } E-> FC E-> FC { if }F-> if b then F-> if b then { if }非终结符是否为空S-否A-否A’-是B-否C-否D-否D’-是E-否F-否FIRST(S) = { begin }FIRST(A) = FIRST(B) ∪FIRST(A’) ∪{ξ} = {a , if , ; , ξ} FIRST(A’) ={ ; , ξ}FIRST(B) = FIRST(C) ∪FIRST(D) ={ a , if }FIRST(C) = {a}FIRST(D) = FIRST(E)= { if }FIRSR(D’) = {else , ξ}FIRST(E) = FIRST(F) = { if }FIRST(F) = { if }FOLLOW(S) = {# }FOLLOW(A) = {end}FOLLOW(A’) = { end }FOLLOW(B) = {; , end }FOLLOW (C) = {; , end , else }FOLLOW(D) = {; , end }FOLLOW( D’ ) = { ; , end }FOLLOW(E) = { else , ; end }FOLLOW(F) = { a }S A A’ B C D D’ E F if then else begin end a b ;6. 1.(1) S -> A | B(2) A -> aA|a(3)B -> bB |b提取(2),(3)左公因子(1) S -> A | B(2) A -> aA’(3) A’-> A|ξ(4) B -> bB’(5) B’-> B |ξ2.(1) S->AB(2) A->Ba|ξ(3) B->Db|D(4) D-> d|ξ提取(3)左公因子(1) S->AB(2) A->Ba|ξ(3) B->DB’(4) B’->b|ξ(5) D-> d|ξ3.(1) S->aAaB | bAbB(2) A-> S| db(3) B->bB|a4(1)S->i|(E)(2)E->E+S|E-S|S提取(2)左公因子(1)S->i|(E)(2)E->SE’(3)E’->+SE’|-SE’ |ξ5(1)S->SaA | bB(2)A->aB|c(3)B->Bb|d消除(1)(3)直接左递归(1)S->bBS’(2)S’->aAS’|ξ(3)A->aB | c(4) B -> dB’(5)B’->bB’|ξ6.(1) M->MaH | H(2) H->b(M) | (M) |b消除(1)直接左递归,提取(2)左公因子(1)M-> HM’(2)M’-> aHM’ |ξ(3)H->bH’ | ( M )(4)H’->(M) |ξ7. (1)1)A->baB2)A->ξ3)B->Abb4)B->a将1)、2)式代入3)式1)A->baB2)A->ξ3)B->baBbb4)B->bb5)B->a提取3)、4)式左公因子1)A->baB2)A->ξ3)B->bB’4)B’->aBbb | b5)B->a(3)1)S->Aa2)S->b3)A->SB4)B->ab将3)式代入1)式1)S->SBa2)S->b3)A->SB4)B->ab消除1)式直接左递归1)S->bS’2)S’->BaS’ |ξ3)S->b4)A->SB5)B->ab删除多余产生式4)1)S->bS’2)S’->BaS’ |ξ3)S->b4)B->ab(5)1)S->Ab2)S->Ba3)A->aA4)A->a提取3)4)左公因子1)S->Ab2)S->Ba3)A->aA’4)A’-> A |ξ5)B->a将3)代入1)5)代入21)S->aA’b2)S->aa3)A->aA’4)A’-> A |ξ5)B->a提取1)2)左公因子1)S-> aS’2)S’->A’b | a3)A->aA’4)A’-> A |ξ5)B->a删除多余产生式5)1)S-> aS’2)S’->A’b | a3)A->aA’4)A’-> A |ξA A’S’S将3)代入4)1)S-> aS’2)S’->A’b | a3)A->aA ’4)A’-> aA’ |ξ将4)代入2)1)S-> aS’2)S’->aA’b3)S’->a4)S’->b5)A->aA ’6)A’-> aA’ |ξ对2)3)提取左公因子1)S->aS’2)S’->aS’’3)S’’->A’b|ξ4)S’->b5)A->aA ’6)A’-> aA’ |ξ删除多余产生式5)1)S->aS’3)S’’->A’b|ξ4)S’->b5)A’-> aA’ |ξ第六章1S → a | ∧ | ( T )T → T , S | S解:(1) 增加辅助产生式 S’→#S#求 FIRSTVT集FIRSTVT(S’)= {#}FIRSTVT(S)= {a ∧ ( }= { a ∧ ( }FIRSTVT (T) = {,} ∪ FIRSTVT( S ) = { , a ∧ ( }求 LASTVT集LASTVT(S’)= { # }LASTVT(S)= { a ∧ )}LASTVT (T) = { , a ∧ )}(2)算符优先关系表因为任意两终结符之间至多只有一种优先关系成立,所以是算符优先文法(3)a ∧( ) , #F 1 1 1 1 1 1g 1 1 1 1 1 1f 2 2 1 3 2 1g 2 2 2 1 2 1f 3 3 1 3 3 1g 4 4 4 1 2 1f 3 3 1 3 3 1g 4 4 4 1 2 1(4)#<·( a,a)# 移进#( <· a ,a)# 移进# (a ·> , a)# 规约#(T <·, a)# 移进#(T,<· a )# 移进#(T,a ·> ) # 规约#(T,T ·> ) # 规约#(T =·) # 移进#(T) ·> #规约#T =·#接受4.扩展后的文法S’→#S# S→S;G S→G G→G(T) G→H H→a H→(S)T→T+S T→S(1)FIRSTVT(S)={;}∪FIRSTVT(G) = {; , a , ( }FIRSTVT(G)={ ( }∪FIRSTVT(H) = {a , ( }FIRSTCT(H)={a , ( }FIRSTVT(T) = {+} ∪FIRSTVT(S) = {+ , ; , a , ( }LASTVT(S) = {;} ∪LASTVT(G) = { ; , a , )}LASTVT(G) = { )} ∪LASTVT(H) = { a , )}LASTVT(H) = {a, )}LASTVT(T) = {+ } ∪LASTVT(S) = {+ , ; , a , ) }因为任意两终结符之间至多只有一种优先关系成立,所以是算符优先文法(2)句型a(T+S);H;(S)的短语有:a(T+S);H;(S) a(T+S);H a(T+S) a T+S (S) H直接短语有: a T+S H (S)句柄: a素短语:a T+S (S)最左素短语:a(3)分析a;(a+a)不能用最右推导推导出上面的两个句子。
编译原理 课件第十一章

11.2 局部优化:基本块内的优化 局部优化:
基本块:是指程序中一顺序执行的语句序列, 基本块:是指程序中一顺序执行的语句序列,其中只有一个 入口语句和一个出口语句。 入口语句和一个出口语句。 入口语句: 入口语句: 1. 程序的第一个语句;或者, . 程序的第一个语句;或者, 2. 条件转移语句或无条件转移语句的转移目标语句;或者 . 条件转移语句或无条件转移语句的转移目标语句; 3. 紧跟在条件转移语句后面的语句。 . 紧跟在条件转移语句后面的语句。
main() { int x, y, z; x = (1+20)*( -x); ( ) y = x*x+(x/y); y = z = (x/y)/(x*x); }
tmp1 = 1 + 20 ; tmp2 = -x ; x = tmp1 * tmp2 ; tmp3 = x * x ; tmp4 = x / y ; y = tmp3 + tmp4 ; tmp5 = x / y ; tmp6 = x * x ; z = tmp5 / tmp6 ; y = z ;
11.1 11.2 11.3 11.4
什么是代码优化 局部优化 控制流程分析和循环 数据流分析举例
11.1 优化技术简介
何谓代码优化: 宗旨: 获得较好性能的代码 宗旨: 等价 意图,结果, 意图,结果,权衡 目标代码优化 阶段: source front I.R code target code generator code 用户 中间代码优化
第十一章 代码优化
为了让编译程序能够生成效率高的目标代码, 为了让编译程序能够生成效率高的目标代码, 应对中间代码进行优化 注意:优化≠ 注意:优化≠最佳化 要求:相对合理性。 要求:相对合理性。应考虑空间和时间上的 取舍,及二者的平衡。 取舍,及二者的平衡。 本章将介绍基于结构信息的优化 基于结构信息的优化。 本章将介绍基于结构信息的优化。 假定 优化对象是四元式序列的中间代码
编译原理 11章

11.2 优化举例
6:循环中不变式的外提 • Tl=2*j外提 • 由于这里的循环中不 变式的外提是在非线 性块上的优化,所以 是全局优化。 • 经这两步优化后,便 得到图11.4中所示的 中间程序。
① i:=1; ② T1:=2*j; ③ T2:=T1;
④ T2:=100+T2; ⑤ R1:=B[T2]; ⑥ A[T5]:=R1+15.708; ⑦ i:=i+1; ⑧ if i≤100 then goto ② ≤
11.2 优化举例
3:常量合并
① i:=1;
② T1:=2*j; ③ T2:=100i+T1; ④ T3:=5*3.1416; ⑤ R1:=B[T2]; ⑥ T4:=2*j; ⑦ T5:=100*i+T4; ⑧ A[T5]:=R1+T3; ⑨ i:=i+1; ⑩ if i≤100 then goto ② ≤
n4 n3
图11.6 环路图
11.5 借助 借助DAG进行优化 进行优化
2: 无环有向图描述四元式
• 可用无环有向图来描述四元式。 例如,与四元式(op B C A)对应的DAG如图11.7所示。 利用DAG来进行优化的主要思想是: 将一基本块中的每一个四元式依次表示成对应的一个DAG, 该基本块就对应一较大的DAG(即其中各个四元式的DAG的合成)。 再按原来构造DAG结点的顺序重写四元式序列,便可得到“合并 了已知量”、“删除了无用赋值”、“删除了多余运算”的等价 的基本块——优化了的基本块。
11.1 基本块及其求法
• 1:基本块 基本块: 一个入口(第一语句) 一个出口(最后一语句) 入口语句集: 程序的第一个语句号; goto语句的下一条语句号; goto语句转到的语句号。 基本块划分: 入口语句集排序后每一入口语句到下一入口语句号 的前一语句。 最后一基本块为最后入口语句号到最后语句。
编译原理课后习题答案+清华大学出版社第二版

用以引用非局部(包围它的过程)变量时,寻找该变量的地址。 DL: 动态链,指向调用该过程前正在运行过程的数据段基地址,用以过程执行结束释放
数据空间时,恢复调用该过程前运行栈的状态。 RA: 返回地址,记录调用该过程时目标程序的断点,即调用过程指令的下一条指令的地
编译程序大致有哪几种开发技术?
答案:
(1)自编译:用某一高级语言书写其本身的编译程序。 (2)交叉编译:A 机器上的编译程序能产生 B 机器上的目标代码。 (3)自展:首先确定一个非常简单的核心语言 L0,用机器语言或汇编语言书写出它的编
译程序 T0,再把语言 L0 扩充到 L1,此时 L0⊂ L1 ,并用 L0 编写 L1 的编译程序 T1,再把语 言 L1 扩充为 L2,有 L1 ⊂ L2 ,并用 L1 编写 L2 的编译程序 T2,……,如此逐步扩展下 去, 好似滚雪球一样,直到我们所要求的编译程序。 (4)移植:将 A 机器上的某高级语言的编译程序搬到 B 机器上运行。
(main).
答案: 程序执行到赋值语句 b∶=10 时运行栈的布局示意图为:
1
《编译原理》课后习题答案第二章
第 3题 写出题 2 中当程序编译到 r 的过程体时的名字表 table 的内 容。
name
kind
level/val
adr
size
答案:
题 2 中当程序编译到 r 的过程体时的名字表 table 的内容为:
盛威网()专业的计算机学习网站
2
《编译原理》课后习题答案第一章
合实现方案,即先把源程序翻译成较容易解释执行的某种中间代码程序,然后集中解释执行 中间代码程序,最后得到运行结果。
编译原理第三版课后答案清华大学

编译原理第三版课后答案清华大学出版社
一、单项选择题
1.每一个解释器必须完成运行程序所需的基本功能是什么?
A.翻译代码
B.执行代码
C.优化代码
D.分析代码
答案:B.执行代码
2.下列哪个不是一种程序设计语言?
A.C
B. Lisp
C. Java
D.汇编语言
答案:D.汇编语言
3.哪一种语言可以编译成多种机器语言?
A.动态语言
B.汇编语言
C.静态语言
D.高级语言
答案:D.高级语言
4.什么类型的编译器可以将源代码转换为机器可以识别的字节码?
A.汇编器
B.解释器
C.直译器
D.编译器
答案:D.编译器
二、填空题
5.编译器用于将高级语言(________)翻译成机器语言(________)。
答案:源代码,目标代码
6.编译器通过不同的(________)实现程序翻译的过程。
编译原理蒋宗礼课件第11章

关键任务
进行类型检查、确定符号引 用的含义,以及生成中间代 码等。
工具
语义分析是编译过程中相当 复杂的一部分,通常需要使 用自定义的算法和工具进行 实现。
中间代码生成
1 什么是中间代码生成?
在编译过程的中间阶段,将源代码转化为计算机独立的中间表示形式。
2 优点
中间代码的生成可以简化编译器的设计和实现,并提供了优化和代码生成的灵活性。
编译原理蒋宗礼课件第11章
在本章中,我们将深入探讨编译原理的各个方面,包括词法分析、语法分析、 语义分析等等。
编译原理概述
什么是编译原理?
编译原理是计算机科学中的重要领域,研究如 何将高级语言编写的程序转化为计算机能够理 解和执行的机器码。
编译原理的应用
编译原理在各个领域都有广泛的应用,包括编 译器设计、程序语言设计以及软件工程等。
通过使用上下文无关文法 (Context-Free Grammar),语法 分析器可以验证源代码是否符合 语言的语法规则。
工具
常用的语法分析工具包括ANTLR、 Bison等,它们能够根据预先定义 好的文法生成语法分析器。
语义分析
什么是语义分析?
语义分析是编译过程中的第 三步,通过对语法树进行遍 历和分析,对源代码进行意 义的理解和检查。
为不同的Token类型,如标识符、关键字、
运算符等。
3
什么是词法分析?
词法分析是编译过程中的第一步,将源 代码转化为单词序列(Token Sequence)。
工具
常用的词法分析工具包括Flex等,它们能 够根据预先定义好的规则生成词法分析 器。
语法分析
什么是语法分析?
关键概念
语法分析是编译过程中的第二步, 将词法分析得到的Token序列转化 为语法树(Parse Tree)。
编译原理课后第十一章答案

对假设(2) B:=3 D:=A+C E:=A*C F:=D+E K:=B*5 L:=K+F
计算机咨询网()陪着您
10
《编译原理》课后习题答案第十一章
第7题 分别对图 11.25 和 11.26 的流图: (1) 求出流图中各结点 n 的必经结点集 D(n)。 (2) 求出流图中的回边。 (3) 求出流图中的循环。
(1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13)
i:=m-1 j:=n t1:=4*n v:=a[t1] i:=i+1 t2:=4*i t3:=a[t2] if t3< v goto (5) j:=j-1 t5:=4*j t5:=a[t4] if t5> v goto (9) if i >=编译原理》课后习题答案第十一章
第 5 题: 如下程序流图(图 11.24)中,B3 中的 i∶=2 是循环不变量,可以将其提到前置结点吗? 你还能举出一些例子说明循环不变量外移的条件吗?
图 11.24 答案: 不能。因为 B3 不是循环出口 B4 的必经结点。 循环不变量外移的条件外有: (a)(I)s 所在的结点是 L 的所有出口结点的必经结点 (II)A 在 L 中其他地方未再定值 (III)L 中所有 A 的引用点只有 s 中 A 的定值才能到达 (b)A 在离开 L 之后不再是活跃的,并且条件(a)的(II)和(III)成立。所谓 A 在离开 L 后不再是活跃的是指,A 在 L 的任何出口结点的后继结点的入口处不是活跃的(从此点后 不被引用) (3)按步骤(1)所找出的不变运算的顺序,依次把符合(2)的条件(a)或(b)的 不变运算 s 外提到 L 的前置结点中。如果 s 的运算对象(B 或 C)是在 L 中定值的,则只有 当这些定值四元式都已外提到前置结点中时,才可把 s 也外提到前置结点。
编译原理 清华大学出版社

Hale Waihona Puke 3、语义分析(1)语义
定义语言的单词符号和语法单位的意义.一个语言的 语义是指这样的一组规则,使用它可以定义一个程序的 意义.这些规则称为语义规则.
离开语义,语言只不过是一堆符号的集合.
语义分析阶段的主要任务
审查源程序有无语义错误,为代码生成阶段收集类型信 息.
18
3、语义分析(2)
例如: 类型审查、数组下标检查、强制类型转换等
2. 任何常数(整常数、实常数)是表达式。
3. 若表达式1和表达式2都是表达式,那么 ·表达式1+表达式2 ·表达式1*表达式2 ·(表达式1)
都是表达式。
16
程序结构(2)
语句的表示: 1. 标识符:=表达式 是语句。 2. while (表达式) do 语句 和
if (表达式) then 语句 else 语句 都是语句。
整数:10 界符:。
逗号:, 冒号::
分号:; 赋值号::= 加号:+ 乘号:*
机内码为:id1:=id2+id3*10
13
2、语法分析
❖ 任务:单词符号串 → 各类语法单位 在词法分析的基础上将单词序列分解成各类语法短语.通常 用语法树表示这种语法短语.
❖ 依据:语言的语法规则 ❖ 描述语法规则的工具:上下文无关文法、确定的下推自动机
任课教师:湛 燕 Email: zhanyan@
数学与计算机学院
1
教材与参考书
编译原理(第二版). 张素琴,吕映芝,蒋维杜,戴桂兰编 著,清华大学出版社,2005.2.
名称 编译原理 编译原理 编译原理
作者 何炎祥 陈火旺等 蒋立源
出版社 华中理工大学 国防工业出版社 西北工业大学
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(1)
read (C) (2) A:= 0 (3) B:= 1 (4) L1: A:=A + B (5) if B>= C goto L2 (6) B:=B+1 (7) goto L1 (8) L2: write (A) (9) halt
划分成四个基本块 B1,B2,B3,B4 B1 (1) (2) (3) 基本块内实行的优化:合并已知量 删除多余运算 B2 (4) 删除无用赋值 (5) B3 (6) (7) B4 (8) (9)
优化技术简介—代数简化
b = 5 + a + 10 ; _tmp0 = 5 ; _tmp1 = _tmp0 + a ; _tmp2 = _tmp1 + 10 ; b = _tmp2 ; _tmp0 = 15 ; _tmp1 = a + _tmp0 ;
优化技术简介—降低运算强度
a) i*2 = 2*i = i+i = i<<2 b) i/2 = (int)(i*0.5) c) 0-1 = -1 d) f*2 = 2.0 * f = f + f e) f/2.0 = f*0.5
基本块:是指程序中一顺序执行的语句序列,其中只有一个入 口语句和一个出口语句。 入口语句: 1.程序的第一个语句;或者, 2.条件转移语句或无条件转移语句的转移目标语句;或者 3.紧跟在条件转移语句后面的语句。
划分基本块的算法: 1.求出四元式程序之中各个基本块的入口语句。 2.对每一入口语句,构造其所属的基本块。它是由该语句到 下一入口语句(不包括下一入口语句),或到一转移语句 (包括该转移语句),或到一停语句(包括该停语句)之 间的语句序列组成的。 3.凡未被纳入某一基本块的语句,都是程序中控制流程无法 到达的语句,因而也是不会被执行到的语句,我们可以把 它们删除。
第11章
代码优化
11.1 11.2 11.3 11.4
什么是代码优化 局部优化 控制流程分析和循环 数据流分析举例
宗旨: 获得较好性能的代码 等价 意图,结果,权衡 阶段: source front I.R code target code end generator code 用户 中间代码优化 目标代码优化
优化技术简介—复写传播 tmp2 = tmp1 ; tmp3 = tmp1 * tmp1 ; tmp3 = tmp2 * tmp1; tmp5 = tmp3 * tmp1 ; tmp4 = tmp3 ; c = tmp5 + tmp3 ; tmp5 = tmp3 * tmp2 ; c = tmp5 + tmp4 ;
何谓代码优化:
int arr[10000]; void Binky() { int i; for (i=0; i < 10000; i++) arr[i] = 1; }
int arr[10000]; void Winky() { register int *p; for (p = arr; p < arr + 10000; p++) *p = 1; }
2 型: A:=B op C(op, B, C,A)
DAG 结点 n1 A n1 B n2 A op n1 n1 B n3 n3 A op n2 n1 n2 n1 B C
仅含 0,1,2 型四元式的基本块的 DAG 构造算法: 首先,DAG 为空。 对基本块的每一四元式,依次执行: 1.如果 NODE(B)无定义,则构造一标记为 B 的叶结点并 定义 NODE(B)为这个结点; 如果当前四元式是 0 型,则记 NODE(B)的值为 n,转 4。 如果当前四元式是 1 型,则转 2(1)。 如果当前四元式是 2 型,则: (I) 如果 NODE(1)无定义,则构造一标记为 C 的叶结点并 定义 NODE(1) 为这个结点; (II) 转 2 (2)
基本块的DAG表示及其应用
DAG Directed Acyclic Graph 无环路有向图 基本块的DAG是在结点上带有标记的DAG 叶结点 独特的标识符(名字,常数)标记 内部结点 运算符号标记 各个结点 附加标识符标记
用 DAG 进行基本块的优化 四元式 0 型:A:=B(:=,B,—,A) 1 型: A:=op B(op,B, —,A)
优化技术简介—常数合并
a = 10 * 5 + 6 - b; _tmp0 = 10 ; _tmp1 = 5 ; _tmp2 = _tmp0 * _tmp1 ;
_tmp3 = 6 ; _tmp4 = _tmp2 +
_tmp3 ; _tmp5 = _tmp4 – b; a = _tmp5 ;
_tmp0 = 56 ;
优化技术简介—常数传播 _tmp4 = 0 ; f0 = _tmp4 ; _tmp5 = 1 ; f1 = _tmp5 ; _tmp6 = 2 ; i = _tmp6 ; f0 = 0 ; f1 = 1 ; i = 2 ;
优化技术简介—代数简化 x+0 = x 0+x = x x*1 = x 1*x = x 0/x = 0 x-0 = x b && true = b b && false = false b || true = true b || false = b
main() { int x, y, z; x = (1+20)* -x; y = x*x+ห้องสมุดไป่ตู้x/y); y = z = (x/y)/(x*x); }
tmp1 = 1 + 20 ; tmp2 = -x ; x = tmp1 * tmp2 ; tmp3 = x * x ; tmp4 = x / y ; y = tmp3 + tmp4 ; tmp5 = x / y ; tmp6 = x * x ; z = tmp5 / tmp6 ; y = z ;
2.(1)如果 NODE(B)是标记为常数的叶结点 ,则转 2(3), 否则转 3(1)。 (2)如果 NODE(B)和 NODE(C)都是标记为常数的叶结 点,则转 2(4),否则转 3(2)。 (3)执行 op B(即合并已知量),令得到的新常数为 P。如果 NODE(B)是处理当前四元式时新构造出来的结点,则 删除它。如果 NODE(P)无定义,则构造一用 P 做标记的叶结 点 n。置 NODE(P)=n,转 4。 (4)执行 B op C(即合并已知量),令得到的新常数为 P。如果 NODE(B)或 NODE(C)是处理当前四元式时新构造出 来的结点,则删除它。如果 NODE(P)无定义,则构造一用 P 做标记的叶结点 n。置 NODE(P)=n,转 4。
4.如果 NODE(A)无定义,则把 A 附加在结点 n 上并令 NODE(A)=n;否则先把 A 从 NODE(A)结点上附加标识符集中 删除(注意,如果 NODE(A)是叶结点,则其标记 A 不删 除),把 A 附加到新结点 n 上并令 NODE(A)=n。转处理下一 四元式。 而后,我们可由 DAG 重新生成原基本块的一个优化的代码序 列。
n2
n4
(1)P:=0 (2)I:=1 (4)T2:=addr(A)-4
(7)T5:=addr(B)-4 (3)T1:=4*I (5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20 goto(3)
• • • •
(1)P:=0 (2)I:=1 (4)T2:=addr(A)-4 (7)T5:=addr(B)-4 (3)T1:=4*I (5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1
• • • • • •
(1) T0:=3.14 (2) T1:=2*T0 (3) T2:=R+r (4) A:=T1*T2 (5) B:=A (6) T3:=2*T0 (7) T4:=R+r (8) T5:=T3*T4 (9) T6:=R-r (10)B:=T5*T6
n1
To
3.14 (a)
n1
T0 (b)
n2
T1
3.(1)检查 DAG 中是否已有一结点,其唯一后继为 NODE(B),且标记为 op(即找公共子表达式)。如果没有, 则构造该结点 n,否则就把已有的结点作为它的结点并设该结 点为 n,转 4。 (2)检查中 DAG 中是否已有一结点,其左后继为 NODE(B),其右后继为 NODE(C),且标记为 op(即找公共子 表达式)。如果没有,则构造该结点 n,否则就把已有的结点 作为它的结点并设该结点为 n,转 4。
(1)P:=0 (4)T2:=addr(A)-4 (7)T5:=addr(B)-4 (3)T1:=4 (5)T3:=T2[T1] (8)T6:=T5[T1] (9)T7:=T3*T6 (10)P:=P+T7 (3’)T1:=T1+4 (12)if T1<=80 goto(5)
11.2 局部优化:基本块内的优化
(1)P:=0 (2)I:=1 (4)T2:=addr(A)-4 (7)T5:=addr(B)-4
(3)T1:=4
(5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[ ] T1 (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1
(3’)T1:=T1+4 (12)if T1 <=80 goto(5)
(1)P:=0
(2)I:=1 (4)T2:=addr(A)-4 (7)T5:=addr(B)-4 (3)T1:=4*I (5)T3:=T2[T1] (6)T4:=T1 (8)T6:=T5[T4] (9)T7:=T3*T6 (10)P:=P+T7 (11)I:=I+1 (12)if I<=20 goto(3)