西安电子科技大学考研复试编译原理复习
(完整)编译原理复习整理(重点含答案),推荐文档
1、给出下面语言的相应文法。
L1={a n b n c i|n≥1,i≥0}从n,i的不同取值来把L1分成两部分:前半部分是anbn:A→aAb|ab后半部分是ci:B→Bc|ε所以整个文法G1[S]可以写为:G1(S):S→AB ;A→aAb|ab ;B→cB|ε3、构造一个DFA,它接受 ={a,b}上所有包含ab的字符串。
(要求:先将正规式转化为NFA,再将NFA确定化,最小化)4、对下面的文法G:E →TE’ E’→+E|ε T →FT’ T’→T|εF →PF’ F’ →*F’|ε P →(E)|a|b|∧(1)证明这个文法是LL(1)的。
(2)构造它的预测分析表。
(1)FIRST(E)={(,a,b,^}FIRST(E')={+,ε}FIRST(T)={(,a,b,^}FIRST(T')={(,a,b,^,ε} FIRST(F)={(,a,b,^}FIRST(F')={*,ε}FIRST(P)={(,a,b,^}FOLLOW(E)={#,)}FOLLOW(E')={#,)}FOLLOW(T)={+,),#}FOLLOW(T')={+,),#}FOLLOW(F)={(,a,b,^,+,),#} FOLLOW(F')={(,a,b,^,+,),#}FOLLOW(P)={*,(,a,b,^,+,),#} (2)考虑下列产生式:'→+'→'→'→E E T T F F P E a b ||*|()|^||εεεFIRST(+E)∩FIRST(ε)={+}∩{ε}=φ FIRST(+E)∩FOLLOW(E')={+}∩{#,)}=φ FIRST(T)∩FIRST(ε)={(,a,b,^}∩{ε}=φ FIRST(T)∩FOLLOW(T')={(,a,b,^}∩{+,),#}=φ FIRST(*F')∩FIRST(ε)={*}∩{ε}=φFIRST(*F')∩FOLLOW(F')={*}∩{(,a,b,^,+,),#}=φ FIRST((E))∩FIRST(a) ∩FIRST(b) ∩FIRST(^)=φ 所以,该文法式LL(1)文法. (3)+ * ( ) a b ^ # EE TE →'E TE →' E TE →' E TE →'E' '→+E E'→E ε'→E εTT F T →' T F T →' T F T →' T F T →' T' '→T ε'→T T '→T ε '→T T '→T T '→T T '→T εFF P F →'F P F →' F P F →' F P F →'F' '→F ε '→'F F * '→F ε '→F ε '→F ε '→F ε '→F ε '→F εPP E →() P a → P b → P →^5、考虑文法: S →AS|b A →SA|a (1)列出这个文法的所有LR(0) 项目。
编译原理复习重点含答案
编译原理复习重点含答案编译原理复习重点编译原理是计算机科学中的一门重要课程,它研究的是如何将高级语言程序转化为机器语言的过程。
在编译原理的学习中,我们需要掌握一些重要的概念和技术,以便能够理解和应用编译器的工作原理。
本文将重点介绍编译原理的几个重要主题,并提供相应的答案供参考。
一、词法分析词法分析是编译器的第一个阶段,它的任务是将输入的字符序列划分为一个个有意义的词素(token)。
词法分析器通常使用有限自动机(DFA)来实现,其工作原理是将输入字符序列逐个读入,并根据事先定义好的词法规则进行匹配和识别。
常见的词法单元包括关键字、标识符、常量、运算符等。
常见的词法规则包括:1. 关键字:例如if、while、for等。
2. 标识符:由字母、数字和下划线组成,且以字母或下划线开头。
3. 常量:包括整数常量、浮点数常量、字符常量和字符串常量等。
4. 运算符:例如加法运算符+、减法运算符-等。
5. 分隔符:例如逗号、分号等。
词法分析的结果是一个个词法单元,每个词法单元包含一个词素和对应的词法单元类型。
例如,对于输入程序"int a = 10;",词法分析的结果可能是[("int", "关键字"), ("a", "标识符"), ("=", "运算符"), ("10", "整数常量"), (";", "分隔符")]。
二、语法分析语法分析是编译器的第二个阶段,它的任务是将词法分析器输出的词法单元序列转化为抽象语法树(AST)。
语法分析器通常使用上下文无关文法(CFG)来描述语言的语法结构,并使用递归下降、LL(1)分析、LR分析等算法进行分析。
常见的语法规则包括:1. 表达式:例如算术表达式、布尔表达式等。
7西安电子科技大学《编译原理》
3.5.1 自下而上分析的基本方法
思路:从句子ω开始,从左到右扫描ω,反复用产生式的左部替换 产生式的右部、谋求对ω的匹配,最终得到文法的开始符号,或者 发现一个错误。
3.5.1.1 规范归约与“剪句柄”
定义3.13 设αβδ是文法G的一个句型, 若 存在S =*>αAδ,A =+>β, 则 称β是句型αβδ相对于A的短语, 特别的,若 有A→β, A→β 则 称β是句型αβδ相对于产生式A→β的直接短语。 一个句型的最左直接短语被称为句柄。 ■ ① 直观上,句型是一个完整结构,短语是句型中的某部分(针对 某非终结符)。S是一个句型,而不是一个短语(树根不是短语)。 ② 短语形成的两个要素: 1.从S可以推导出A,即S=*>αAδ; 2.从A至少一次推导出β,即A=+>β。
13
结
束
上节主要内容: 1. 自下而上分析的基本方法:归约(短语、直接短语、句柄、规 范(最左)归约) 2. 规范归约的形象表示-剪句柄; 3. 移进-归约分析工作模式:格局与格局变换 4. LR分析与LR文法: <1> 分析表:动作表与转移表 <2> 模拟算法:改变格局的两个重要动作-移进与归约 <3> LR分析器的实例分析 <4> LR文法
5
3.5.1.2 移进-归约分析器工作模式
移进-归约分析器的工作模式:
输入记号流 ip top 符 号 状 态 栈 驱动器 移进-归约 分析表 输出
与预测分析对比:
输入记号流 符 top 号 栈 ip 输出
驱动器 预测分析表 (b) 预测分析器模型
预测分析器: 移进-归约分析器: 1.分析方法:格局与格局变换 1. 分析方法:格局与格局变换 2.分析表 2. 分析表 3. 驱动器(模拟算法) 3. 驱动器(模拟算法) 4. LR(文法、语言、分析器) 4. 预测分析表的构造 5. LL(文法、语言、分析器) 5. SLR分析表的构造
西安电子科技大学编译原理 (10)
L →E ; L | ε E →TE' E'→ + T E' | - T E' | ε T →FT' T'→*F T'|/FT'|mod FT'|ε F →(E) | id | num
L →E ; L | ε E →TE' E'→ + T E' | - T E' | ε T →FT' T'→*F T'|/FT'|mod FT'|ε F →(E) | id | num
对文法的每个产生式A→α ② 对FIRST(α)的每个终结符a,加入α 到M[A,a]; ③ 若ε∈FIRST(α),则FOLLOW(A)每 个终结符b(包括#),加入α到M[A, b];
/ mod ( E;L TE' ε ε ) ; # ε
+
-
*
E'
T T' F
id
num
(E)
3.4 自上而下语法分析
...
E
T T F F id T FT
T
T FT
6
非终 结符 E E T T
输 入 符 号
id
E TE
+
E +TE
...
T FT T T FT
F
F id
栈
输
入
输
出
$E
id id + id$
id id + id$ id id + id$ id id + id$ id + id$ id + id$ id + id$ id + id$ F id
编译原理全复习(完整版)
1》编译程序的框架图与功能块:(1)画出编译程序的总体结构,并简述各部分的主要功能:七个部分(2)编译程序的结构分为几个阶段,各阶段的任务是什么?答编译程序总框架(1)词法分析器,又称扫描器,输入源程序,进行词法分析,输出单词符号。
(2)语法分析器,简称分析器,对单词符号串进行语法分析(根据语法规则进行推导或规约),识别出各类语法单位,最终判断输入串是否构成语法上正确的“程序”。
(3)语义分析与中间代码产生器,按照语义规则对语法分析器归约出(或推导出)的语法单位进行语义分析并把它们翻译成一定形式的中间代码。
(4)优化器,对中间代码进行优化处理。
(5)目标代码生成器,把中间代码翻译成目标程序。
(6)表格管理,登记源程序的各类信息,编译各阶段的进展状况。
(7)出错管理,把错误信息报告给用户。
编译程序的结构分为五个阶段:(1)词法分析.任务是:输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个的单词(亦称单词符号或简称符号),如基本字,标识符,常熟,算符和界符。
(2)。
语法分析,任务是:在词法分析的基础上,根据语言的语法规则,把单词符号串分解成各类语法单位(语法范畴)。
(3)语义分析与中间代码产生。
任务:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。
(4)优化。
任务在于对前段产生的中间代码进行加工变换,以期在最后阶段能产生出更为高效(省时间和空间)的目标代码。
(5)目标代码生成。
任务是:把中间代码(或优化出理之后)变换成特定机械上的低级语言代码。
2》.重要概念:a. 编译程序:是指能够把源语言程序转换成逻辑上等价的目标语言程序的一个程序。
b. 单词符号:是语言的基本组成成分,是人们理解和编写程序的基本要素,是语言中具有独立意义的最基本结构,它一般包括:基本字、标识符、常数、运算符和界符等c. 中间代码:是一种含义明确,便于处理的记号系统,它通常独立于具体的硬件。
西安电子科技大学编译原理 (23)
其他面向特定应用领域的语言 计算机辅助设计:MATLAB 集成电路设计:VHDL、Verilog 虚拟现实与人机交互:VRML ……
21
程序设计语言的发展
计算机语言举例
[例1]通用程序设计语言与汇编语言(包括机器 指令) Pascal语句: x := a+b; C++语句: x = a+b; 汇编指令: 十六进制代码 汇编指令 A10002 MOV AX, [A] 8B1E0202 MOV BX, [B] 01D8 ADD AX, BX A30402 MOV [X], AX 22
输出
特点
编译器:工作效率高,即时间快、省空间;交互性与动 态特性差、可移植性差。被大多数PL的翻译所采用; 解释器:工作效率低,即时间慢、费空间;交互性与动 态特性好、可移植性好。早期的Basic和现在的Java等。 基本功能:二者相同; 采用技术:从翻译的角度来讲,两种方式所涉及的原理、 方法、技术相似。
26
1.3 编译器与解释器
语言翻译的两种基本形态 先翻译后执行
源程序 输入数据
边翻译边执行
源程序 输入数据
编译器 目标程序
目标程序
输出
解释器
输出
[例5]假设有源程序P:x=3;
P 编译器 目标程序 目标程序
P
解释器
x=3
27
3
x=3
3
1.3 编译器与解释器
西安电子科技大学编译原理 (1)
8
b
2.3 记号的识别-有限自动机
NFA如何识别记号? 对字符串,从初态开始,是否可以经过一系列状态转 移到达终态? 例如:字符串abb是否可以被上页的NFA所识别
S = {0, 1, 2, 3} Σ = {a, b} move = { move(0, a) = {0, 1}, move(0, b) = 0, move(1, b) = 2, move(2, b) = 3 } s0 = 0 F = {3}
digit1=[1-9]
num=digit1(digit)*(ε |.digit*digit1)
3
2.3 记号的识别-有限自动机
正规式(模式的描述)
有限状态自动机(识别记号)
id = letter(letter|num)*
69fed? F987y?
正规式:(((letter|digit)*num)*|digit*}num)*
辅助定义
letter=[a-z,A-Z] digit=[0-9]
id = letter(letter|digit)* literal=“(letter|digit)*”
integer=digit digit*
num=integer(ε| . integer)
0000.0000 ? 0000.0000?
18
2.3 记号的识别-有限自动机
DFA对NFA施加的两条限制: 限制1:没有ε状态转移 限制2:同一状态经过同一字符最多有一个状态转移 [例2.10] 正规式(a|b)*abb的DFA,识别输入序列abb和abab:
a a b 0 b a a 3 2 b 1 b
0 1 2 3
a 1 1 1 1
西电编译原理_第二章习题解答
最终的正规式: 1* | 1*(01|0)* = 1*(01|0)*
© 西安电子科技大学 · 软件学院
5
1. 根据模式写出正规式
习题2.4 (2) 所有不含有子串 011 的01串 思路2:考虑包含 011 的串,然后构造没有011的串 ① 含有 子串 011 的最简单的串:
然后据上,考查每条从初态到终态的路径,综合正规式即可。
© 西安电子科技大学 · 软件学院 9
2.依据NFA/DFA,给出正规式
习题2.10 (2) 用正规式描述 DFA 所接受的语言;
0 b,c 2 b,c a b a a,c 1
该DFA从初态到终态有三条路径:0b2,0c2,0a1b2 用正规式表示为: b | c | a(a|c)*b, 而且是这三条路径均至少重复一次, 故最终的正规式为:(b|c|a(a|c)*b)+
© 西安电子科技大学 · 软件学院 13
其它
习题2.9 构造 10*1 的最小DFA 解: 活用 Thompson 算法 (1) 分解为三部分:1,0*,1; (2) 画出三者的状态转换图:
0 1 0 1 2 3 1 4
(3) 连接运算:子图首尾相连
0
1
0 1 1
1
4
这已经是最小的DFA
© 西安电子科技大学 · 软件学院
© 西安电子科技大学 · 软件学院
11
其它
关于:正规式 -> NFA -> DFA -> DFA最小化:
说明:(一般)逐步计算 正规式->NFA: (1)呆板Thompson算法: 自上而下分解正规式—— 语法树, 自下而上构造NFA —— 后续遍历; 特点:每个运算对应一次构造,繁琐! (2)活用Thompson算法: 分解正规式:得到若干规模适中的子正规式; 为每个子正规式:画出其最简的状态转换图(子图); 按Thompson算法,将子图组合,得到完整的图。
西安电子科技大学编译原理 (24)
... ... ...
1.4 编译器的工作原理与基本组成
语法分析按照语言的语法规则检测词法分析输出的记 号流是否符合语法规则,并用树的形式描述该记号流 的语法结构
每个阶段将程序完整分析一遍的工作模式称为一遍扫描。 确定扫描遍数的因素有: 源程序 1. 软、硬件条件,如内存太小,或全局优化 词法分析 2. 语言结构,如规定标识符的先声明后引用 语法分析 x := f(a); 出 … 符 语义分析 号 错 function f(a:integer):integer; 表 管 处 3. 编译技术,如拉链-回填 中间代码生成 理 goto lab1; 理 代码优化 … lab1: … 目标代码生成
目标代码
17
1.5 编译器的编写
1. 2. 3.
直接使用汇编语言和程序设计语言; 利用编译器编写工具:词/语法、语法制导翻译、代码生成、 数据流分析等; 基于编译器基础架构的编译器构造系统(开放式编译器, 如GCC、SUIF等)。
GCC Home Page. . Gasta Homepage. SUIF Compiler System Home Page.
15
1.4 编译器的工作原理与基本组成
编译器的分析/综合模式
编译器 分析(前端) 源程序 中间代码 综合(后端) 目标代码
语法/语义分析
代码生成/优化
1. 2. 3.
前端:语言结构和意义的分析; 后端:语言意义处理; 中间代码:前端与后端的分界;
《编译原理》总复习
17
<2> 符号表的组织
1. 符号表的条目与信息的存储(关键字+内容) 2. 作用域信息的保存(栈结构) 3. 线性表与散列表
<3> 声明语句的翻译
1. 定义与声明:类型定义与变量声明,过程定义与过程声明 2. 变量声明:符号表信息的填写 3. 过程声明: • 左值与右值 • 参数传递:参数传递的不同形式 • 名字的作用域:静态作用域与最近嵌套原则 • 声明中作用域信息的保存
12
<3> 自上而下分析
1. 分析方法:推导,从上到下构造分析树,是一种预测的、 试探的方法; 2. 对文法的要求:没有公共左因子和左递归; 3. 递归下降子程序方法:匹配终结符,展开非终结符(子 程序调用) 4. 预测分析表方法: • 工作方式与过程:PDA(DPDA)、格局与改变格局的 动作; • 预测分析表的构造:FIRST集合与FOLLOW集合, FIRST与FOLLOW的计算; • LL(1)文法及其判别:预测分析表中没有多重定义条 目(推论3.2)。
2. 移进-归约分析表:动作表+转移表; 3. LR文法与LR分析:LR(0)、SLR(1)、LALR(1)、LR(1)。
15
第四章 语法制导翻译生成中间代码
本章讨论程序设计语言的静态语义分析,并且在语法分析 的基础上生成中间代码,采用的基本方法是语法制导翻译。 与前两章词法分析和语法分析不同的是,词法分析和语法 分析的讨论侧重于理论,而本章则侧重于结合程序设计语言的 实际例子讨论语言结构的具体翻译方法和一些实用的技术。
西安电子科技大学软件工程研究所归纳总结所学内容锻炼提高抽象能力一引言二词法分析三语法分析四语法制导翻译生成中间代码学习不能走捷径付出多少劳动就有多少收获
西电编译原理_总复习
构造SLR(1)分析表的方法:
a J I A K
1.可移进项直接从DFA上看: action[I,a]:=sj goto[I,A]:=k 2.可归约项分两步走:若在I状态中有[A→α.], 首先计算:FOLLOW(A), 然后填写:action[I,b]:=Ri 其中:b∈FOLLOW(A)且A→α是第i个产生式。Βιβλιοθήκη ,三、计算题(3.3)
3.3(13分)已知一个NFA如图。 (a)(4 分 ) 用自然语言简要叙述该自动机所识别的语 言 的特点,列举两个它可识别的串。 (b)(3分)写出与该自动机等价的正规式r。 (c)(6分)用子集法构造识别r的最小DFA。
a,b 0 b 1 b
a,b 2
三、计算题(3.4)
3.4( 15 分)有文法 G 如下(注: G 中终结符 id 仅由单个英文字母 组成,如a, b等):E→E*T|T T→T+F|F F→(E)|id 和G的语法制导翻译如下:
E→E1*T | T T→T1+F | F F→(E) | id {E.place=newtemp; emit(*,E1.place,T.place,E.place;} {E.place=T.place;} {T.place=newtemp; emit(+,T1.place,F.place,T.place;} {T.place=F.place;} {F.place=E.place;} {F.place=;}
用自然语言给出下述正规式所描述的语言,并构造他们的最小DFA 10*1 (0|1)*011(0|1)*
问题:看得懂,但是不太会用自然语言较好的表达 说明:所谓用自然语言描述就是解释字符串的性质,一般情 况下是已经有了形式化描述。注意:这就是练习的目的。 解: 10*1:首尾是1中间有零或若干个0的01串。 (0|1)*011(0|1)* :至少含一个011的01串。 注意:绝对不允许用正规式形式表示,因为正规式已经给出
西安电子科技大学编译原理 (20)
(1) S→goto id {if 现 then
entry().type='未知'
-- 标识符第一次出
fill(entry(),'标号', '未定义', nextstat); emit('goto -'); entry().type ='标号' -- 已出现且是标号 then emit('goto', entry(id).addr); --addr有双重含义 if entry().def='未定义' -- 尚未定义,需要更新链头为最新序号 then fill(entry(),'标号','未定义',nextstat-1); end if; else error; -- 标识符已出现且类型不是标号,出错 end if;
end if;}
符号表: .name .type .def .addr Lab 标号 未定义 1
4.8 控制语句
goto lab; goto lab; lab: x := a+b; goto lab; 三地址码: (1) goto (2) goto 1
else if
(1) S→goto id {if 现 then
end if;}
符号表: .name .type .def .addr Lab 标号 未定义 2-1
4.8 控制语句
goto lab; goto lab; lab: x := a+b; goto lab; 三地址码: (1) goto (2) goto 1
(3) LAB→id ':' {if entry().type='未知' -- 标识符第一次出现 then fill(entry(), '标号', '已定义', nextstat); else if entry().type='标号' and entry().def='未定义' -- 还未定义出现 then q:=entry().addr; fill(entry(), '标号', '已定义', nextstat);--更新条目 backpatch(q, nextstat); else error; -- 其它情况均出错 end if; end if; }
编译原理考试知识点复习
第一章:编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序。
解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。
编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序)。
解释程序和编译程序的根本区别:是否生成目标代码第三章:Chomsky对文法中的规则施加不同限制,将文法和语言分为四大类:0型文法(PSG)◊ 0型语言或短语结构语言文法G的每个产生式α→β中:若α∈V*VNV*, β∈(VN∪VT)* ,则G是0型文法,即短语结构文法。
1型文法(CSG)◊ 1型语言或上下文有关语言在0型文法的基础上:若产生式集合中所有|α|≤|β|,除S→ε(空串)外,则G是1型文法,即:上下文有关文法另一种定义:文法G的每一个产生式具有下列形式:αAδ→αβδ,其中α、δ∈V*,A∈VN,β∈V+;2型文法(CFG)◊ 2型语言或上下文无关语言文法G的每个产生式A→α,若A∈VN ,α∈(VN∪VT)*,则G是2型法,即:上下文无关文法。
3型文法(RG)◊ 3型语言或正则(正规)语言若A、B∈VN,a∈VT或ε,右线性文法:若产生式为A→aB或A→a左线性文法:若产生式为A→Ba或A→a都是3型文法(即:正规文法)最左(最右)推导在推导的任何一步α⇒β,其中α、β是句型,都是对α中的最左(右)非终结符进行替换规范推导:即最右推导。
规范句型:由规范推导所得的句型。
句子的二义性(这里的二义性是指语法结构上的。
)文法G[S]的一个句子如果能找到两种不同的最左推导(或最右推导),或者存在两棵不同的语法树,则称这个句子是二义性的。
文法的二义性一个文法如果包含二义性的句子,则这个文法是二义文法,否则是无二义文法。
西安电子科技大学编译原理 (8)
(1)...(2) (3)...(4) (5)...(6) (7)...(9) (10)...(11) (12)...(15)
13
3.2 上下文无关文法(CFG)
S MS
S
if C
x<3
if then
x<3 if then else
x>0 x:=5 x:=-5
then
MS
else
MS
if then else
3
3.2 上下文无关文法(CFG)
① 改写 基本思想:通过引入新的非 终结符,使原来分辨不清的结 构受到约束,从而使得对任意 一个句子,仅能构造一棵分析 树。
[例3.9] 与G3.2等价的非二义文法:E→E+E
E→E+T |T T→T*F|F (G3.4) F →(E)| -F | id
| E*E |(E) (G3.2) | -E | id
x<3 if x>0 then x:=5 x:=-5
UMS
C
x<3
?
if
then
MS
else
UMS
?
S → MS | UMS MS → if C then MS else MS | id := E UMS→ if C then S | if C then MS else UMS (G3.5) C →E=E|E<E|E>E E →E+T|T T → (E) | -T | id | n
[例3.10] 改写二义文法G3.2为G3.4 : ① 引入新的非终结符,增加一个子结构并提高一级优先 级; ② 递归非终结符在终结符左边,运算具有左结合性,否 E→E+E (1) 则具有右结合性。 |E*E (2) 1. 优先级: [+] [*] [( ), -, id] |(E) (3) 2. 结合性: 左结合 [+, *] | -E (4) 右结合 [-] | id (5) 无结合 [id] E→E+T|T 3. 非终结符与运算: T→T*F|F E: + (左结合) T: * (左结合) F → (E) | -F | id 11 F: -, ( ), id (右结合)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
主要内容
<1> <2> <3> <4> 程序设计语言与文法 有关推导的基本概念 自上而下分析 自下而上分析
10
<1> 程序设计语言与文法
正规式与正规文法:正规式与正规文法用于描述线性结构, 如构成句子的记号(终结符);识别正规语言的自动机是有 限自动机,它们的特征是没有记忆能力; • 上下文无关文法(CFG=(N, T, S, P)):CFG用于描述层次结 构,如构成程序的句子;识别CFL的自动机是下推自动机, 它是在有限自动机的基础上增加了一个下推栈,从而有了 简单的记忆能力; • 文法的分类:0型、1型、2 型和3型文法 • 词法分析器与语法分析器: FA与PDA •
第三章 语法分析
语法分析是编译器中的重要阶段之一,可以认为是语法制 导翻译模式编译器的核心。语法分析也有双重含义:根据一定 的规则构成语言的各种结构,即语法规则;根据语法规则识别 输入序列(记号流)中的语言结构,即语法分析。 语法分析的分析对象是组成语言的句子,句子具有层次结 构的特征,表征该结构的最好方法是树,从而使得对语法的分 析就有了从根到叶子和从叶子到根两种分析方法。
13
<3> 自上而下分析(续) 4. 预测分析表方法: • 工作方式与过程:PDA(DPDA) • 格局:(栈内容,当前剩余输入,改变格局的动作) • 改变格局的动作:匹配终结符、展开非终结符、接 受、报错 • 驱动器(算法3.4) • 预测分析表和分析表的构造: 分析表的构成与意思:M[A, a] FIRST集合与FOLLOW集合(定义3.10、3.11) FIRST与FOLLOW的计算(算法3.5、3.6) 分析表的构造(算法3.7) • LL(1)文法及其判别:预测分析表中没有多重定义条目 (定义3.12、推论3.2)。
结 束(2010年5月25日)
试题与习题
• 认真复习,重点是掌握基本概念。基本概念掌握了,相当 一部分试题的解就有了。 • 习题与试题的目的区别:习题的目的是通过反复的练习理 解、掌握所学知识,会有不少繁、难、大量步骤的题;试 题的目的是考察对本课程综合掌握的情况,特点是短时间 内覆盖大量内容。太繁琐步骤或太难等需要耗费大量时间 的题是不可能出的,大部分应该是基本概念题,但也会有 一些综合性的题目。 • 自己要会辨别什么是主要的什么是次要的,抓什么丢什么。 “基本概念要严谨(清楚),基本方法要灵活”。 • 总之一句话,学习方法的掌握是个人努力的结果,单纯靠 别人教是学不会的。
关于考试
• 题目类型:填空题(30分)、简答题(20分)、计算题(50分) • 考试范围:1-4章讲过的内容 • 侧重考察:基本概念与基本方法的掌握
易犯的错误
1. 不认真审题(对题目的要求理解错误:意思理解错、难题 想容易、容易题想难。关键问题是基本概念不清楚) 2. 所答非所问(例如:没有要求LL分析却将文法改为LL的) 3. 画蛇添足(例如:仅问有无冲突却将分析表先构造出来) 4. 偷工减料(例如:有若干问,仅回答部分或问题仅答一半)
7
<3> 记号的识别-有限自动机(FA)
• NFA与DFA的定义:FA = (S, Σ, move, s0, F); • NFA与DFA的表示:定义表示、状态转换图、状态转换矩阵; • NFA与DFA的关键区别:NFA的不确定性: 有ε状态转移; 当前状态下,对同一字符有多于一个的下一状态转移; • 用NFA识别输入序列的弱点:尝试所有路径才能确定一个输 入不被接收、回溯带来的问题; • 模拟DFA的算法(算法2.1 ):用DFA识别记号。
6
<1> 记号、模式与单词
• • • • 模式(pattern):规定单词识别的规则 记号(token):按照某模式识别出的一类单词(记号种类) 单词(lexeme):被识别出的字符串本身 词法分析器的输出:记号=记号种类+记号属性
<2> 记号的说明-模式的形式化描述
1. 正规式与正规集 • 正规式与正规集的定义(基本正规式、三个运算) • 正规式的等价(描述相同的集合) • 利用正规式的等价对正规式进行化简(正规式的代数性质) 2. 用正规式形式化描述模式 • 如何用正规式描述程序设计语言中常见的记号,如标识 符、数字、运算符和分隔符等 • 正规式的简化形式以及辅助定义与规则
9. 拓广文法与子集法构造DFA • closure(I)、goto(I,X)(定义3.18、3.19 ) • 核心项目与非核心项目(定义3.20) • 构造算法(算法3.9)核心是:closure(goto(I,x))
<4> 自下而上分析(续2) 10.DFA如何分析输入序列 • 有效项目(定义3.21)、可移进项目、可规约项目 • 移进/归约冲突、归约/归约冲突; • 解决冲突的方法-SLR(1):简单向前看一个终结符(计 算归约项非终结符的FOLLOW,与可移进终结符比较);
<6> 可执行语句的翻译
1. 简单算术表达式和赋值句的翻译:语法制导翻译的设计, 类型转换; 2. 数组元素的引用: • 多维数组到一维存储空间的映射; • 数组元素地址计算的递推公式; • 数组元素地址计算的语法制导翻译; 3. 布尔表达式短路计算的翻译: • 为什么需要短路计算和短路计算的控制流; • 真出口与假出口; • 拉链/回填技术:真值链与假值链 4. 控制语句的翻译:控制语句的分类,转移与条件转移。
<3> 自上而下分析
1. 分析方法:推导,从上到下构造分析树,是一种预测的、 试探的方法; 2. 对文法的要求:没有公共左因子和左递归 • 左递归与直接左递归(定义3.9) • 消除直接左递归与左递归(算法3.1、3.2) • 提取公共左因子(类似于提取公因式) 3. 递归下降子程序方法:匹配终结符,展开非终结符(子 程序调用)
11
<2> 有关推导的基本概念
1. CFG产生语言的基本方法-推导:从文法的开始符号开始, 反复地用产生式的右部替换句型中的非终结符。 2. 推导的基本概念:句子、直接推导、最左推导、左句型(最 右推导、右句型);(定义3.2、3.3、3.4) 3. 分析树与语法树:分析树和语法树都反映了语言结构;分析 树还记录了分析的过程(含有非终结符);(定义3.5、3.6) 4. 文法的二义性:二义性的本质是在文法中缺少对文法符号优 先级和结合性的限制,从而使得一个句子可以推导出多于一 棵分析树。(定义3.7) 5. 二义性的消除: • 改写二义文法为非二义文法;(两个关键步骤) • 对文法符号施加优先级与结合性的限制,使得分析的每 一步有唯一选择。 12
《编译原理》复习
西安电子科技大学 软件工程研究所
刘 坚
课程内容
一、引言 二、词法分析 三、语法分析 四、语义分析—语法制导翻译生成中间代码
要求(希望)
1. 牢固掌握基本概念 2. 灵活使用基本方法 3. 归纳总结所学内容 学习不能走捷径,付出多少劳动就有多少收获 掌握正确的学习方法,提高自学能力
2
<3> 中间代码
1. 为什么生成中间代码:中间代码是编译器分析综合模式 前端与后端的分水岭; 2. 中间代码的特征:形式接近目标机器代码,但又与具体 机器无关,便于编译器的开发移植和代码的优化; 3. 常用的中间代码形式:后缀式、树(图)、三地址码; 4. 三地址码的实现:三元式、四元式 5. 中间代码之间的关系: • 树与后缀式的关系 • 树与三元式和四元式的关系
<4> 自下而上分析
1. 分析方法:归约(推导的逆过程),从叶子到根构造分析树; 2. 基本概念: • 短语、直接短语、句柄(定义3.13) • 最左归约(定义3.14)、归约、规范归约 3. 采用的方法: • 剪句柄 • 实现方法:移进-归约(格局中的两个关键动作) 4. 关键问题:是如何确定栈顶已经形成句柄,当句柄形成时, 如何判定采用哪个产生式进行规约; 5. 移进-归约分析器的工作模式(与预测分析表方法对着看) 移进(匹配终结符) 归约(展开非终结符) 驱动器(算法3.8) 15
<4> 符号表的组织
1. 符号表的作用:连接声明与引用的桥梁 2. 符号表的条目与信息的存储:直接存储与间接存储 3. 作用域信息的保存 • 静态作用域+最近嵌套原则 • 线性表:栈结构,表上的操作 • 散列表:每个子表是栈结构,提高表上操作的效率
<5> 声明语句的翻译
1. 定义与声明:类型定义与变量声明,过程定义与过程声明 2. 变量声明:符号表信息的填写(简单变量和数组变量); 3. 过程声明: • 左值与右值; • 参数传递:参数传递的不同形式,各种参数传递形式的 处理方式; • 名字的作用域:满足静态作用域与最近嵌套原则; • 声明中作用域信息的保存。
第一章 引言
<1> 语言的翻译
不同的翻译形式:汇编、编译、转换(预编译)、逆向翻译 翻译方法:
编译器 源程序 目标程序 输出
输入数据
目标程序
3
<2> 编译器的基本组成
4
<3> 编译器的分析-综合模式
编译器
分析(前端) 源程序 语法/语义分析 中间代码
综合(后端) 目标代码 代码生成/优化
<4> 编译器的扫描遍数与编译器的编写
<4> 自下而上分析(续1) 6. 移进-归约分析表:动作表(action)和转移表(goto) 7. LR(k)文法(定义3.15) 8. 核心:识别活前缀的DFA:活前缀与LR(0)项目(NFA状态) (定义3.16、3.17 )
• •
一个产生式是一个识别活前缀的NFA 一个LR(0)项目是NFA的一个状态
5
第二章 词法分析
词法分析器的作用: • 滤掉源程序中的无用成分; • 处理与具体操作系统或机器有关的输入; • 识别记号并交给语法分析器; • 调用符号表管理器和出错处理器进行相关处理。 构词规则与词法分析: 首先规定单词形成的规则,称为构词规则;然后根据 构词规则识别输入序列,称为词法分析。 主要内容: <1> 记号、模式与单词 <2> 记号的说明-模式的形式化描述(正规式与正规集) <3> 记号的识别-有限自动机 <4> 从正规式到词法分析器