第七章 (1)编译原理

合集下载

编译原理第13讲(第七章)

编译原理第13讲(第七章)

1
常见优化技术
如死代码消除、循环优化、内联函数、常数传播等。
2
优化级别
编译器通常提供多个优化级别,用户可以根据需求选择适当的级别。
3
优化策略
编译器根据程序特性和运行环境选择合适的优化策略。
编译原理的应用
编译原理在计算机科学的各个领域有着广泛的应用和重要性。
编程语言
编译原理是编程语言的核心,包括语法定义和翻译 规则。
编译器设计
编译器是将高级语言转化为机器代码的关键工具。
代码优化
编译原理提供了多种优化技术,提高程序执行效率。
程序分析
编译原理提供了程序分析的方法和工具,如静态分 析和动态分析。
总结
编译原理是计算机科学的基础学科,研究将高级语言程序翻译成机器可执行代码的原理和方法。
关键概念
词法分析、语法分析、语义分析、中间代码生成等。
3
语义分析器
对语法结构树进行语义检查,并构建语法结
中间代码生成
4
构的语义意义。
将语法结构树转化为中间表示形式,用于后 续优化和目标代码生成。
编译的阶段
编译过程包括前端和后端阶段,前端负责生成中间代码,后端负责生成目标代码和优化。
前端
将源代码转化为中间代码,检查语法和语义的正确性。
后端
将中间代码转化为目标机器代码,并对代码进行优化。
3 பைடு நூலகம்际应用
编译原理在编程语言、编译器设计和优化等领域有着广泛的应用。
编译器的工作方式
编译器将源代码转化为目标代码的过程涉及多个阶段,如词法分析、语法分析、语义分析和中间代码生成。
1
词法分析器
将源代码分解为词法单元,并产生词法单元

编译原理ppt第七章

编译原理ppt第七章
1 目标
提升生成的目标代码的性能和效率。
2 优化方法
通过代码转换和代码生成技术进行优化,如常量传播、死代码删除等。
3 效果
优化后的代码可以提高程序的执行效率,减少资源消耗。
图片来源
编译系统组成
了解编译系统的组成对于理解整个 编译过程非常重要。
词法分析器
词法分析器将源代码分解成一个个 词法单元,如标识符、关键字、运 算符。
编译原理ppt第七章
通过这一章的学习,你将深入了解编译系统的组成和各个阶段的作用,包括 词法分析器、语法分析器、语义分析器、中间代码生成以及编译器的优化。
课程概述
1 理解编译原理的重要性 2 学习编译原理的实际
应用
编译原理是计算机科学的基
3 掌握编译器的工作原理
通过学习编译器的各个阶段,
础,掌握它有助于开发高效
了解编译系统可以更好地理
你将能够设计和实现自己的
且可靠的软件。
解代码运行的过程,进而改
编译器。
进代码的性能和可维护性。
编译系统概述
定义
编译系统是一种将源代码转换 为目标代码的软件工具。
组成
编译系统由多个阶段组成,每 个阶段负责不同的任务。
功能
编译系统可以进行词法分析、 语法分析、语义分析等操作, 最终生成可执行的目标代码。
编译器的优化
编译器的优化可以提高代码的性能 和效率。
编译系统的阶段
1
词法分析器
将源代码转换为一系列词法单元,如标识符、
语法分析器
2
关键字、运算符等。
根据语法规则分析词法单元的组合,生成抽象语法。3语义分析器
对抽象语法树进行语义检查,如类型匹配、
中间代码生成

编译原理第七章

编译原理第七章

4
LR 分析器工作示意图
5
步骤 符号栈 输入符号串
1) 2) 3) 4) 5) 6) 7) 8) 9) 10) 11) # #a #ab #aA #aAb #aA #aAc # aAcd #aAcB #aAcBe #S abbcde# bbcde# bcde# bcde# cde# cde# de# e# e# # #
13、 T • int 14、 T int • 15、 T •(E) 16、 T (• E) 17、 T (E •) 18、 T (E) • 注意: ① 初态 ② 句柄识别态 ③ 句子识别态
注意:拓广文法引入的意义。(确保初态唯一)
23
NFA for Viable Prefixes of the Example
求解方程组可得: [S’] = [S] = [A] = a+[A] [B] = aAc
推论:若文法G中有产生 式B→A,则有 LC(A) LC(B)· {}
[A] = a|[A]
[A] = a*=a
这样求出了每个非终结符在规范推导中用该非终结符的右部 替换该非终结符之前,它的左部可能出现的所有前缀,也就 是在规范归约过程中用句柄归约成该非终结符之前不包括句 柄的活前缀。 15
归约(如何找当前句柄归约)?
3
3) 4) 5) 6)
#ab #aA #aAb #aA
bcde# bcde# cde# cde#
归约(A→b) 移进 归约(A→Ab) 移进
分析:已分析过的部分在栈中的前缀不同,而且移进和归 约后栈中的状态会发生变化
我们引入一个新的状态栈来表示符号栈中的符号目前状态
用LR分析表来表示不同状态下对于各输入符号应采取的动 作

编译原理 - 陈火旺版 - 第七章

编译原理 - 陈火旺版 - 第七章

3
后缀式
后缀式(逆波兰式)
表达式E的后缀形式E’的写法:
• 若E是变量或常量,则E’ = E • 若E=E1 op E2,则E’ =E1’ E2’ op • 若E=(E1),则E’ = E1 表达式变为后缀形式的语义规则
E→E1 op E2 E→(E1) E→i {E.CODE := E1.CODE||E2.CODE||op } {E.CODE := E1.CODE} {E.CODE := i}
推广到表达式外的范围
• 例如 a:=b*c+b*d 后缀形式:abc*bd*+:=
5

抽象语法树
内部结点表示运算符,后代表示运算对象
无循环有向图(DAG)
与抽象语法树
• 相同之处:内部结点表示运算符,后代表示运算对象 • 不同之处:考虑到公共子表达式(不只一个父结点),更加紧 凑高效
四元组表示 (1) (-,C, D , T1) (2) (*, B, T1, T2) (3) (+, A, T2 , T3) (4) (↑, F, G , T4) (5) ( /, E, T4, T5) (6) (-, T3, T5 , T6)
13
说明语句的翻译
说明语句
定义局部于该过程的数据对象(以标识符标识) 为数据对象分配空间,在符号表中登记数据对象的名 字,类型,分配的存储地址 有过程嵌套的,表示出嵌套关系
编译方法
中国人民大学信息学院 陈文萍
1
第7章 语义分析和中间代码生成
中间语言 一些语法成分的翻译
说明语句 赋值语句 布尔表达式 控制语句 过程调用
类型检查
2
语义分析概述

编译原理讲什么

编译原理讲什么

编译原理讲什么
编译原理是研究程序编译的原理和方法的学科。

它主要涉及了程序的词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成以及代码生成和目标代码优化等几个方面。

编译原理的核心思想是将高级语言编写的程序转换为机器语言,使计算机能够正确、高效地执行这些程序。

在程序编译的过程中,首先需要进行词法分析,将程序源代码按照词汇单元进行划分,并生成对应的词法单元序列。

然后进行语法分析,根据语法规则判断词法单元序列是否符合语法规定,如果符合,则进行语法分析树的生成。

接下来是语义分析,对语法分析树进行验证和修正,以确保程序语义的正确性。

在语义分析之后,就需要生成中间代码,以便通过后续的编译过程进行处理。

中间代码是一种抽象的计算机指令集,它与特定的计算机体系结构无关。

在中间代码生成之后,就可以进行代码优化,以提高程序的执行效率和资源利用率。

目标代码生成是将中间代码翻译为目标机器平台上的机器代码的过程。

在目标代码生成之后,还可以进行目标代码优化,以进一步提高代码的执行效率和资源利用率。

编译原理的研究不仅能够帮助理解程序设计语言的工作原理,还有助于开发高效、可靠的编译器和解释器。

它对于提高程序的执行效率、减少资源消耗以及简化程序设计过程都具有重要的意义。

编译原理第七章

编译原理第七章

2014年6月15日12时14分
非终结符号T有两个综合属性 T.type 和T.width,分别表示 名字的类型和名字的域宽 (即该类型名字所占用的存储单 元个数)。 假定整数类型域宽为4;实数域宽为8;一个数组的域宽可 以通过把数组元素数目与一个元素的域宽相乘获得;每个 指针类型的域宽假定为4。 计算说明语句中名字的类型和相对地址的翻译模式如下:
子表达式 (base-((low1*n2)+low2)*w的值是可以在编译时 确定的。
2014年6月15日12时14分
例 1 设A为一个10*20的数组,即n1=10,n2=20。并设w=4。 赋值语句x:=A[y, z] 被翻译成如下三地址语句序列: T1:=y*20 T1:=T1+z T2:=A-84 T3:=4*T1 T4:=T2[T3] x:=T4
2014年6月15日12时14分
7.4 布尔表达式的翻译 在程序设计中,布尔表达式有两个基本作用:一个是用作 计算逻辑值;另一个用作控制流语句之中的条件表达式。 计算布尔表达式的值通常有两种办法。一种办法是,如同 计算算术表达式一样,一步不差地从表达式各部分的值计 算出整个表达式的值。例如,按通常的习惯,用数值1代 表true,用0代表false,那么,布尔式1 or (not 0 and 0) or 0的计算过程是: 1 or (not 0 and 0) or 0 =1 or (1 and 0) or 0 =1 or 0 or 0 =1 or 0 =1
S→id:=E {p:=lookup(); if p≠nil then emit(p’:=’E.place) else error} {E.place:=newtemp; emit(E.place’:=’E1.place’+’E2.place)}

编译原理7

编译原理7
… (p) goto (q) (p+1) (关于S2的四元式)
… (q)
// E.true
// E.false // E.true // E.false
回填 : (1)和(5)的转移地 址为(7), 它是在整个 布尔表达式的四元式 序列生成之后才回填 的地址。
if A<B goto 102 goto 106 …
108: if e<f goto 111 109: T3 =0 110: goto 112 111: T3 =1 112: T4 = T2 and T3 113: T5 = T1 or T4
7.4.2 作为条件控制的布尔式翻译
出现在条件语句
if E then S1 else S2
中的布尔表达式
E,
○ = 1 or (1 and 0) or 0 ○ = 1 or 0 or 0 ○ = 1 or 0 ○= 1
2.采取某种优化措施, 只计算部分表达式
把A or B解释成 if A then true else B
把A and B解释成 if A then B else false
第七章 语义分析和中间代码生成
0 1 中间语言 0 2 说明语句 0 3 赋值语句的翻译 0 4 布尔表达式的翻译 0 5 控制语句的翻译 0 6 过程调用的处理 0 7 类型检查
7.4 布尔表达式的翻译
布尔表达式文法G
○ E E1 or E2 | E1 and E2 | not E1 | ( E1 ) ○ | id1 relop id2 | true | false | id3
它的作
用仅在于控制对
S1和S2的选择。
无须保留E的值。
E.true: E.false:

编译原理作业集-第七章(精选.)

编译原理作业集-第七章(精选.)

编译原理作业集-第七章(精选.)第七章语义分析和中间代码产⽣本章要点1. 中间语⾔,各种常见中间语⾔形式;2. 说明语句、赋值语句、布尔表达式、控制语句等的翻译;3. 过程调⽤的处理;4. 类型检查;本章⽬标掌握和理解中间语⾔,各种常见中间语⾔形式;各种语句到中间语⾔的翻译;以及类型检查等内容。

本章重点1.中间代码的⼏种形式,它们之间的相互转换:四元式、三元式、逆波兰表⽰;3.赋值语句、算术表达式、布尔表达式的翻译及其中间代码格式;4.各种控制流语句的翻译及其中间代码格式;5.过程调⽤的中间代码格式;6.类型检查;本章难点1. 各种语句的翻译;2. 类型系统和类型检查;作业题⼀、单项选择题:1. 布尔表达式计算时可以采⽤某种优化措施,⽐如A and B⽤if-then-else可解释为_______。

a. if A then true else B;b. if A then B else false;c. if A then false else true;d. if A then true else false;2. 为了便于优化处理,三地址代码可以表⽰成________。

a. 三元式b. 四元式c. 后缀式d. 间接三元式3. 使⽤三元式是为了________:a. 便于代码优化处理b. 避免把临时变量填⼊符号表c. 节省存储代码的空间d. 提⾼访问代码的速度4. 表达式-a+b*(-c+d)的逆波兰式是________。

a. ab+-cd+-*;b. a-b+c-d+*;c. a-b+c-d+*;d. a-bc-d+*+;5. 赋值语句x:=-(a+b)/(c-d)-(a+b*c)的逆波兰式表⽰是_______。

a. xab+cd-/-bc*a+-:=;a. xab+/cd-bc*a+--:=;a. xab+-cd-/abc*+-:=;a. xab+cd-/abc*+--:=;6. 在⼀棵语法树中结点的继承属性和综合属性之间的相互依赖关系可以由________来描述。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

end
end;
电子科技大学计算机科学与工程学院
程序设计语言与编译 F→i|(E)
procedure F; if sym=‘i’ then advance(‘i’) else if sym=‘(’ then begin advance(‘(’); E; if sym=‘)’ then advance(‘)’) else error end else error;
E→TE’ E’→+TE’│ε
T→FT’ T’→*FT’│ε
F→(E)│i
电子科技大学计算机科学与工程学院
程序设计语言与编译
i+i*i#的递归下降分析过程
i
E
i
F M(i)
+
+ M(+) E’ T # + i # # + T’ E’ T M() M() # i * * F M(*)T’ M() # M(i) i # # T’ F M() M(i)
程序设计语言与编译 E→T{+T} T→F{*F} F→i|(E)
E→T{+T}
procedure E; Begin T;
while sym=’+’ do begin advance(‘+’); T end end
电子科技大学计算机科学与工程学院
程序设计语言与编译
T→F{*F}
procedure T; begin F; while sym=’*’ do begin advance(‘*’); F
电子科技大学计算机科学与工程学院
程序设计语言与编译 例三:实数可定义为
decimal→ [sign]integer.{digit}[exponent] exponent→E[sign]integer integer→digit{digit} sign→+│digit →0 │1 │… │9
电子科技大学计算机科学与工程学院
S→Qc│c Q→Rb│b R→Sa│a
S→abcS’│bcS’│cS’
S’→abcS’│
文法产生的语言:(abc|bc|c)(abc)*
电子科技大学计算机科学与工程学院
程序设计语言与编译
S→Qc│c 1.按S、Q、R排列, 代入后 Q→Rb│b S→Qc│c R→Sa│a Q→Rb│b R→ Qca│ca│a R→ Rbca│bca│ca│a 2.消除R中的直接左递归 R→ bcaR’│caR’│aR’ R’→ bcaR’│ 文法产生的语言:(bca|ca|a)(bca)*bc|bc|c
(1)回溯——公共左因子的存在 A→1| 2 (2)左递归 + A→Aα 或 AAα
直接左递归 间接左递归
(3)ε产生式
程序设计语言与编译
例子:
文法G(s): S → Sa
S → b 符合串baa的推导过程。 S S S b a

b a
S
S

S
b
a
程序设计语言与编译
ε产生式
文法G(S): S → aAS S → b A → bAS A → ε 输入串ab的推导过程。 a S
S→xAy A→ab│a
x

S A a b
S
y x
A
a

y
输入串为xay,说明分析过程。
从文法的开始符号S出发,选取S的候选式进行推 导,接着按最左推导进行下去;如果推导失败, 再换用其他的候选式;若穷尽所有的候选式都失 败,则表明w不是G的句子,w存在语法错语。
程序设计语言与编译
二. 存在的问题
程序设计语言与编译
2.间接左递归的消除
+ P Pα 例子:
A → Bc│a
B → Ab
改为:

A
A → Abc │a
→ aP’
P’→ bcP’│ ε
电子科技大学计算机科学与工程学院
程序设计语言与编译
算法
1.将文法G的所有非终结符按任一顺序排列,设为A1,…,An
2.执行下面算法,消除可能的左递归: for i:=1 to n do for j:=1 to i-1 do begin 把一个形如AiAj的产生式改写为 Aiδ1|δ2|…|δk 其中Ajδ1|δ2|…|δk是Aj的所有产生式; 消除Ai产生式的直接左递归; end 3.化简:删除多余产生式,即在从文法开始符号的 任何推导中都不会出现的非终结符的产生式;
电子科技大学计算机科学与工程学院
程序设计语言与编译
提取公共左因子 间接左递归 S → AB|bc A → Ad|Sbc|d S → AB|bc B → a|c B → a|c A → bcbcPQ|dPQ A → Ad|Sbc|d Q → BbcPQ| 直接左递归 P → dP| 间接左递归 S → AB|bc S → AB|bc B → a|c B → a|c A → SbcP|dP A → ABbcP|bcbcP|dP P→dP| P →dP|
S → Aa|Ac|bc
电子科技大学计算机科学与工程学院
程序设计语言与编译 第三节 递归下降分析法
当文法改造为无公共左因子 ,无左递归时 ,让 每个非终结符对应一个过程,该过程对相应 的非终结符产生式的右部短语进行语法分析, 这种分析方法称为递归下降分析法。这样的 分析程序称为递归下降分析器。
电子科技大学计算机科学与工程学院
电子科技大学计算机科学与工程学院
程序设计语言与编译
例一:标识符的定义利用扩充BNF表示为 I→L│LS I→L{L|D} S→T│ST L→a|b|…|z T→L│D D→0|1|…|9 L→a│b│. . .│z D→0│1│2│ . . .│9
例二:文法 E→E+T│T T→T*F│F F→(E) │i E→T{+T} T→F{*F} F→i|(E)
电子科技大学计算机科学与工程学院
程序设计语言与编译

S→Qc│c Q→Rb│b R→Sa│a 为例,按S,Q,R排列,或R,Q,S排列
程序设计语言与编译
S→Qc|c Q→Rb|b R→Sa|a
① ② ③
步骤:1.将非终结符按R,Q,S排列
2.执行算法
i=3,j=2, Ai=S,Aj=Q,S→Qc|c 将上面得到的Q的产生式代入 得: S→Sabc|abc|bc|c 消除上式的直接左递归得: S→abcS’|bcS’|cS’ S’→abcS’| 3.化简:经过上述算法,Q和R 的产生式为多余的产生式,可 删除。最后得: S→abcS’|bcS’|cS’ S’→abcS’|
符号串 (二元式流)
语法分析程序
正确句子的语法树 报告语法错误
程序设计语言与编译
二. 语法分析方法的分类
语法分析: 自上而下(自顶而下) 自下而上(自底而上) 自上而下语法分析法:或从开始符号出发, 找最左推导;或从根开始,构造推导树。 自下而上语法分析法:从输入串开始, 归约,直至文法开始符。
程序设计语言与编译
Error():出错处理函数
procedure advance(t:token);
begin
if sym==t then sym=nexttoken
else error()
end;
电子科技大学计算机科学与工程学院
程序设计语言与编译
E→TE’ E’→+TE’│ε
T→FT’ T’→*FT’│ε F→(E)│i procedure E’; if sym =‘+’ then begin advance(‘+’); T; E’
提取公共左因子
A→B|δ B→1|2|…|n
电子科技大学计算机科学与工程学院
程序设计语言与编译 四.消除左递归
1.消除直接左递归
P→Pα│β PPα|Pβ|γ PPα|β|γ
改写为
P→P ’ P’→αP’│ε P γP’ P’αP’|βP’| P βP’|γP’ P’αP’| ???
给定文法G=(VT, VN,S,P)以及输入串wVT*, 自上而下的语法分析:
从开始符号S出发,看能否找到一个最左推 导,使得Sw;或从S出发,能否构成一个 语法树,使得树的叶结点自左向右构成w;
自下而上的语法分析:
从w开始,看能否找到一个规范归约, 逐步向上归约,直到开始符号S。
程序设计语言与编译 第二节 回溯分析法 一.一个实例
procedure E; begin T; E’ end;
procedure T; begin F; T’ end;
procedure T’; if sym =‘*’ then
begin advance (‘*’);
F; T’
end;
end;
电子科技大学计算机科学与工程学院
程序设计语言与编译
procedure F; if sym=‘i’ then advance(‘i’) else if sym=‘(’ then begin advance (‘(’); E; if sym=‘)’ then advance(‘)’) else error() end else error();
S S
b

A
A
a
A
S
S
ε
b
程序设计语言与编译 三.解决回溯:提取公共左因子 例:将文法 S→xAy A→ab│a 改造成: S→xAy A→aB B→b│ xay的推导过程如右图
S
x
A a B

y
电子科技大学计算机科学与工程学院
程序设计语言与编译
一般方法
产生式: A→1|2|…|n|δ
程序设计语言与编译 一.分析方法
例: G(E)
E→E+T│T T→T*F│F F→(E) │i 消除左递归: E→TE’ E’→+TE’│ε
相关文档
最新文档