当前位置:网站首页>2021-2022学年编译原理考试重点[华侨大学]
2021-2022学年编译原理考试重点[华侨大学]
2022-07-02 11:56:00 【Sylvan Ding】
2021-2022学年编译原理考试重点
注:计算部分请参考 编译原理实验报告
名词解释
编译器:编译阶段,用户输入源程序,经编译器翻译生成目标程序,目标程序在运行时接受输入数据,得到数据输出
解释器:将源程序的翻译和目标程序的运行结合起来,翻译一段源程序,紧接着就执行它,这种方式称为解释
记忆:编译器和解释器的功能都是翻译和运行目标程序,编译器将二者分开进行,而解释器同时进行翻译和运行工作。
词法分析:根据词法规则,识别源程序中的各个记号(token),每个token代表一类单词(lexeme)
语法分析:根据语法规则,识别记号流中的语法结构,并构造反应该结构的语法分析树
语义分析:根据语义规则,对语法树进行静态语义检查,确保结构正确的语句在语义上也正确
中间代码生成:根据语义分析的结果生成与具体机器无关的中间代码,之后根据具体的机器对中间代码进行解释和执行
中间代码优化:中间代码的生成是机械且固定的,对中间代码进行等价变换,提高代码的时间和空间效率
目标代码生成:将中间代码变换成特定机器上运行的指令代码
符号表:记录源程序中符号的相关信息,合理组织后,在编译器的各个阶段进行快速、准确的增删改查等操作
出错处理:遇到一个错误就使编译器停止工作的做法是不负责的,所以编译器应具有广泛的查错能力,准确报告错误种类和出错位置
语言:语言 L L L是有限字母表 Σ \Sigma Σ上有限长度符号串的集合
正规式:有限字母表 Σ \Sigma Σ上的正规式及正规集 L L L的定义为
- ϵ \epsilon ϵ是正规式, L ( ϵ ) = { ϵ } L(\epsilon)=\{\epsilon\} L(ϵ)={ ϵ}
- a ∈ Σ a\in \Sigma a∈Σ, a a a是正规式, L ( a ) = { a } L(a)=\{a\} L(a)={ a}
- r , s r,s r,s是正规式,对应正规集 L ( r ) , L ( s ) L(r),L(s) L(r),L(s),则
- r ∣ s r|s r∣s是正规式, L ( r ∣ s ) = L ( r ) ∪ L ( s ) L(r|s)=L(r)\cup L(s) L(r∣s)=L(r)∪L(s)
- r s rs rs是正规式, L ( r s ) = L ( r ) L ( s ) L(rs)=L(r)L(s) L(rs)=L(r)L(s)
- r ∗ r^* r∗是正规式, L ( r ∗ ) = ( L ( r ) ) ∗ L(r^*)=(L(r))^* L(r∗)=(L(r))∗
- ( r ) (r) (r)是正规式, L ( ( r ) ) = L ( r ) L((r))=L(r) L((r))=L(r)
记忆:定义有限字母表上的正规式和其对应的正规集,首先 ϵ \epsilon ϵ是正规式,其正规集为 { ϵ } \{\epsilon\} { ϵ}. 其次,字母表中的每个字母构成正规式,对应正规集为该字母的集合。接着定义正规式的基本操作:或运算、连接运算、闭包运算、括号规定优先级。
模式:产生和识别单词的规则
记号:根据某种规则(模式)识别出的元素
NFA:Nondeterministic Finite Automata(不确定有限状态机)是一个五元组 ( Q , Σ , δ , S , F ) (Q,\Sigma,\delta,S,F) (Q,Σ,δ,S,F),其中
- Q Q Q是有限状态的集合
- Σ \Sigma Σ是有限字母表,包括 ϵ \epsilon ϵ
- δ \delta δ是状态转移函数, δ \delta δ是多值函数,定义如下:
δ : Q × Σ → 2 Q \delta:Q\times \Sigma \to 2^Q δ:Q×Σ→2Q
其中, 2 Q 2^Q 2Q是 Q Q Q的幂集。 - S S S是初态集, S ⊆ Q S\subseteq Q S⊆Q
- F F F是终态集, F ⊆ Q F\subseteq Q F⊆Q
DFA:Deterministic Finite Automata(确定有限状态机)是一个五元组 ( Q , Σ , δ , S , F ) (Q,\Sigma,\delta,S,F) (Q,Σ,δ,S,F),其中
- Q Q Q是有限状态的集合
- Σ \Sigma Σ是有限字母表
- δ \delta δ是状态转移函数, δ \delta δ是单值函数,定义如下:
δ : Q × Σ → Q \delta:Q\times \Sigma \to Q δ:Q×Σ→Q - S S S是唯一初态, S ∈ Q S\in Q S∈Q
- F F F是终态集, F ⊆ Q F\subseteq Q F⊆Q
记忆:与NFA相比,DFA具有确定性,因此DFA的 Σ \Sigma Σ不包含 ϵ \epsilon ϵ、 δ \delta δ是单值映射函数、 S S S是唯一初态。
上下文无关文法:四元组 ( V N , V T , P , S ) (V_N,V_T,P,S) (VN,VT,P,S),其中
- V N V_N VN是非终结符的有限集合
- V T V_T VT是终结符的有限集合
- P P P是产生式的有限集合,每条产生式型如 A → α A\to \alpha A→α, α ∈ ( V N ∪ V T ) ∗ \alpha \in (V_N\cup V_T)^* α∈(VN∪VT)∗
- S S S是文法的开始符号
终结符:组成一个语言的不可再分的基本符号
非终结符:产生式左部可以派生出符号或符号串的符号
文法产生式:递归描述终结符与非终结符构成的句型。一般形式为: α → β \alpha \to \beta α→β. 其中, α , β ∈ ( V N ∪ V T ) ∗ \alpha, \beta \in (V_N\cup V_T)^* α,β∈(VN∪VT)∗,且 α \alpha α至少含有一个非终结符
推导:从文法开始符号 S S S开始,反复使用产生式,将产生式左部非终结符替换为右部文法符号序列,直至得到一个终结符序列
归约:是推导的逆过程,反复用产生式左部替换右部,直至输入串分析完毕
句型和句子:设文法 G [ S ] G[S] G[S],若 S ⇒ ∗ x , x ∈ ( V N ∪ V T ) ∗ S\stackrel{*}{\Rightarrow}x,x \in (V_N\cup V_T)^* S⇒∗x,x∈(VN∪VT)∗,则 x x x称为该文法的句型。若 S ⇒ ∗ x , x ∈ V T ∗ S\stackrel{*}{\Rightarrow}x,x \in V_T^* S⇒∗x,x∈VT∗,则 x x x称为该文法的句子
二义性:如果一个文法存在某个句子对应两棵不同的语法树,即具有不同的最左(最右)推导,这个文法就是二义性的
下推自动机:扩展DFA使之可以存取一个栈,称为下推栈。输入一串记号流,下推自动机将根据“有限状态转移控制”,决定是否接受该记号流
First集: F i r s t ( α ) = { a ∣ α ⇒ ∗ a … a n d a ∈ V T } First(\alpha)=\{a|\alpha\stackrel{*}{\Rightarrow} a\dots\ and\ a\in V_T \} First(α)={ a∣α⇒∗a… and a∈VT},若 α ⇒ ∗ ϵ \alpha \stackrel{*}{\Rightarrow} \epsilon α⇒∗ϵ,则 ϵ ∈ F i r s t ( α ) \epsilon \in First(\alpha) ϵ∈First(α)
Follow集: F o l l o w ( A ) = { a ∣ S ⇒ ∗ … A a … , a ∈ V T } Follow(A)=\{a|S\stackrel{*}{\Rightarrow}\dots Aa\dots,a\in V_T \} Follow(A)={ a∣S⇒∗…Aa…,a∈VT},若 S ⇒ ∗ … A S\stackrel{*}{\Rightarrow}\dots A S⇒∗…A,则 # ∈ F o l l o w ( A ) \#\in Follow(A) #∈Follow(A)
活前缀:规范句型前缀,不含句柄之后的任何符号。若 S ⇒ ∗ δ A ω S\stackrel{*}{\Rightarrow}\delta A\omega S⇒∗δAω,且可继续规范推导出 S ⇒ ∗ δ α β ω S\stackrel{*}{\Rightarrow}\delta \alpha \beta \omega S⇒∗δαβω,其中, δ ∈ V ∗ , A ∈ V N , ω ∈ V N ∗ , α ∈ V + \delta \in V^*,A\in V_N,\omega\in V_N^*,\alpha\in V^+ δ∈V∗,A∈VN,ω∈VN∗,α∈V+,则 α β \alpha\beta αβ是 δ α β ω \delta\alpha\beta\omega δαβω的句柄, δ α β \delta\alpha\beta δαβ的任意前缀都是 δ α β ω \delta\alpha\beta\omega δαβω的活前缀
移进规约冲突:一个项目集中,既有移进项目,又有规约项目,则此时不能决定产生移进动作还是规约动作
语法制导翻译:为每一个产生式配上相应的语义规则,在推导或规约的过程中根据产生式的语义规则执行对应的语义动作
综合属性:若 A → α , b : = f ( c 1 , c 2 , … , c k ) A\to \alpha,b:=f(c_1,c_2,\dots,c_k) A→α,b:=f(c1,c2,…,ck),其中, b b b是 A A A的属性, c 1 , c 2 , … , c k c_1,c_2,\dots,c_k c1,c2,…,ck是 α \alpha α中某些文法符号的属性或 A A A的其他属性,则 b b b是综合属性
继承属性:若 A → α , b : = f ( c 1 , c 2 , … , c k ) A\to \alpha,b:=f(c_1,c_2,\dots,c_k) A→α,b:=f(c1,c2,…,ck),其中, b b b是 α \alpha α中某文法符号的属性, c 1 , c 2 , … , c k c_1,c_2,\dots,c_k c1,c2,…,ck是 A A A的属性或 α \alpha α中其他文法符号的属性,则 b b b是继承属性
记忆:综合属性“自下而上,包含自身”;继承属性“自上而下,包含兄弟”。
三地址代码:每条代码包含一个运算和三个地址,例如 x = y o p z x=y\ op\ z x=y op z,运算op,两个地址 y , z y,z y,z用于存放运算对象,地址 x x x用于存放运算结果
四元式: ( o p , a r g 1 , a r g 2 , r e s u l t ) (op,arg1,arg2,result) (op,arg1,arg2,result),四元式是具有四个域的记录结构,其含义是arg1和arg2进行op指定的操作,结果存放到result中
拉链与回填:当三地址码中的转向不确定时,将所有转向同一地址的三地址码拉成一个链,一旦转向地址确定,沿此链回填转向地址
简答题
编译器和解释器的比较:
编译器和解释器的功能都是翻译和运行目标程序,从翻译的角度来说,二者相类似,但编译器将源程序的翻译和目标代码的运行分开进行,而解释器同时进行翻译和运行工作。
解释器的优点:- 具有较好的动态特性。目标程序运行时,控制权在解释器,用户可动态修改源程序;
- 具有较好的可移植性。对解释器进行重新编译,就可以使其运行在不同环境中。
解释器的缺点:
- 时间损失大。解释器需要边翻译、边运行,运行时需要时间检查源程序;
- 空间损失大。解释器的运行也需要占据内存空间。
记忆:(相同)翻译过程类似。(区别)编译器分别进行翻译和运行工作,解释器则同时进行。(解释器的优缺点)“移动时空”——(优)可移植性、动态特性,(缺)时空损失大、运行效率低。
编译的一般过程:
- 输入:源程序
- 输出:目标程序
- 过程——词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成
- 依赖——符号表管理、出错处理
多遍扫描与一遍扫描的比较:
- 定义——逻辑上,编译器工作的每个阶段,都要对程序进行完整扫描和分析,称为多遍扫描。但实际上,编译器往往把若干阶段的工作结合起来,进行一遍扫描。原则上,希望扫描的遍数越少越好。
- 一遍扫描的优点——避免重复扫描,提高编译速度;
- 一遍扫描的缺点——算法逻辑不清晰、不便于代码优化、发生语法语义错误时前期工作作废
记忆:(定义)多遍扫描是编译器编译过程中对源程序进行多遍完整的扫描和分析,一遍扫描指的是编译器将若干阶段的工作结合起来,只进行一遍扫描和分析工作。(一遍扫描的优缺点)——优:效率高,减少重复工作;缺点:(算法、代码优化、错误处理)算法逻辑不清晰、不利于代码优化、语法语义分析过程中出现错误导致前面分析过程的结果作废。
语言的运算:
记忆:交、并、差、连接、闭包、正闭包
- X = L ∩ M , X = { s ∣ s ∈ L a n d s ∈ M } X=L\cap M,X=\{s|s\in L\ and\ s\in M \} X=L∩M,X={ s∣s∈L and s∈M}
- X = L ∪ M , X = { s ∣ s ∈ L o r s ∈ M } X=L\cup M,X=\{s|s\in L\ or\ s\in M \} X=L∪M,X={ s∣s∈L or s∈M}
- X = L − M , X = { s ∣ s ∈ L a n d s ∉ M } X=L- M,X=\{s|s\in L\ and\ s\notin M \} X=L−M,X={ s∣s∈L and s∈/M}
- X = L M , X = { s t ∣ s ∈ L a n d t ∈ M } X=LM,X=\{st|s\in L\ and\ t\in M \} X=LM,X={ st∣s∈L and t∈M}
- X = L ∗ , X = { s ∣ s ∈ L 0 ∪ L 1 ∪ … } X=L^*,X=\{s|s\in L^0\cup L^1\cup\dots \} X=L∗,X={ s∣s∈L0∪L1∪…}
- X = L + , X = { s ∣ s ∈ L 1 ∪ L 2 ∪ … } X=L^+,X=\{s|s\in L^1\cup L^2\cup\dots \} X=L+,X={ s∣s∈L1∪L2∪…}
构造正规式:
- 标识符的构造:
d i g i t → [ 0 − 9 ] digit\to [0-9] digit→[0−9]
l e t t e r → [ a − z A − Z _ ] letter\to [a-zA-Z\_] letter→[a−zA−Z_]
i d → l e t t e r ( l e t t e r ∣ d i g i t ) ∗ id\to letter(letter|digit)^* id→letter(letter∣digit)∗ - 浮点数的构造:
z e r o → 0 zero\to 0 zero→0
n o n z e r o → [ 1 − 9 ] nonzero\to [1-9] nonzero→[1−9]
d i g i t → z e r o ∣ n o n z e r o digit\to zero|nonzero digit→zero∣nonzero
d i g i t s → d i g i t d i g i t ∗ digits\to digit\ digit^* digits→digit digit∗
i n t e g e r P a r t → z e r o ∣ n o n z e r o d i g i t ∗ integerPart\to zero|nonzero\ digit^* integerPart→zero∣nonzero digit∗
o p t i o n a l F r a c t i o n → . d i g i t s ∣ ϵ optionalFraction\to .digits|\epsilon optionalFraction→.digits∣ϵ
F l o a t N u m = i n t e g e r P a r t o p t i n a l F r a c t i o n FloatNum=integerPart\ optinalFraction FloatNum=integerPart optinalFraction
- 标识符的构造:
正规式等价证明:
若正规式P、Q表示同一个正规集,则称P、Q等价,记为P=Q. 可以利用正规式的恒等运算的代数性质,化简复杂正规式,从而判断正规式是否等价。记忆:“或”运算具有交换律、结合律,连接运算具有结合律,正闭包运算 r + = r r ∗ = r ∗ r r^+=rr^*=r^*r r+=rr∗=r∗r,闭包运算 r ∗ = r + ∣ ϵ r^*=r^+|\epsilon r∗=r+∣ϵ,可缺省运算 r ? = r ∣ ϵ r?=r|\epsilon r?=r∣ϵ.
DFA三种形式的转换:
- 状态转换函数 s j = δ ( s i , a ) s_j=\delta(s_i,a) sj=δ(si,a)
- 状态转换图(注:开始状态用双箭头指向,终结状态用双圈标记)
- 状态转换表(注:每个表元素表示某状态在某个输入符号时的转移状态)
汤普森算法:
作用——构造识别正规式的NFA.
形式—— r 1 r 2 , r 1 ∣ r 2 , r 1 ∗ r_1r_2,r_1|r_2,r_1^* r1r2,r1∣r2,r1∗记忆:Thompson算法构造的NFA中,不存在“自回路”且某状态至多只能引出一个非 ϵ \epsilon ϵ转移。
改进:在根据正规式构造NFA的实际操作中,常采用“改进的Thompson算法”,以简化NFA的状态。
消除二义性:
- 引入新的非终结符,增加一个子结构并提高一级优先级
- 递归非终结符在产生式中的位置可以反映文法符号的结合性
else悬空问题:
S → i f b t h e n S S\to if\ b\ then\ S S→if b then S
∣ i f b t h e n S e l s e S | if\ b\ then\ S\ else\ S ∣if b then S else S
∣ A |A ∣Aif b then if b then A else A
具有二义性。产生该二义性的原因是else和then数目不同,不能确定else和第一个then对应还是和第二个then对应。因此,将S分为完全匹配(MS)和不完全匹配(UMS),完全匹配中else-then数目相同,每个else都能找到then与之对应,而UMS中else-then数目不同。MS和UMS中都要体现else的右结合性,即与最靠近else左边的then匹配。消除二义性后的结果:
S → M S ∣ U M S S\to MS|UMS S→MS∣UMS
M S → i f b t h e n M S e l s e M S MS\to if\ b\ then\ MS\ else\ MS MS→if b then MS else MS
U M S → i f b t h e n S ∣ i f b t h e n M S e l s e U M S UMS\to if\ b\ then\ S\ |\ if\ b\ then\ MS\ else\ UMS UMS→if b then S ∣ if b then MS else UMS预测分析器:
由驱动器、符号栈和预测分析表组成。输入缓冲区存放待分析的串,以#标记输入串的结束,最终输出语法分析的结果。驱动器控制读入记号,根据栈顶符号和当前读入符号,由预测分析表决定对符号栈进行何种操作。移进规约分析器:
由驱动器、符号状态栈和移进归约分析表组成,其工作模式与预测分析器完全相同。输入缓冲区存放待分析的串,以#标记输入串的结束,最终输出语法分析的结果。驱动器控制读入记号,根据栈顶状态和当前读入符号,由移进归约分析表决定对符号状态栈进行何种操作。中缀式与后缀式的转换:
- 中缀式转后缀式:后缀式中操作数的顺序与中缀式一致,运算符按运算的先后顺序放入相应的操作数之后;
- 后缀式转中缀式:顺序遍历后缀式,若当前输入是操作数,则进栈;若当前输入是运算符,则从栈中弹出操作数进行运算,将结果压回栈中。
记忆:后缀式的引入消除了括号,方便计算。
参考文献
- 刘坚. 编译原理基础. 西安:西安电子科技大学出版社,2008.
- 刘铭. 编译原理[M]. 北京:电子工业出版社,2018.
- 黄贤英. 编译原理及实践教程[M]. 北京:清华大学出版社,2019.
- Keith Cooper. 编译器设计[M]. 北京:人民邮电出版社,2012.
- 黄贤英. 编译原理:重难点分析·习题解析·实验指导[M]. 北京:机械工业出版社,2008.
边栏推荐
- Actual combat sharing of shutter screen acquisition
- LeetCode 2320. 统计放置房子的方式数
- C语言习题---(数组)
- C RichTextBox controls the maximum number of lines displayed
- STM32标准固件库函数名记忆(二)
- 华为面试题: 没有回文串
- Database connection pool and data source
- 1. Editing weapon VIM
- info [email protected] : The platform “win32“ is incompatible with this module.
- Onnx+tensorrt: write preprocessing operations to onnx and complete TRT deployment
猜你喜欢
fatal: unsafe repository is owned by someone else 的解决方法
实现一个多进程并发的服务器
c语言入门--数组
mathML转latex
Tujia muniao meituan has a discount match in summer. Will it be fragrant if the threshold is low?
[development environment] install the visual studio community 2013 development environment (download the installation package of visual studio community 2013 with update 5 version)
Fabric. JS free draw circle
YoloV6训练:训练自己数据集遇到的各种问题
Wechat applet uses towxml to display formula
解决el-radio-group 回显后不能编辑问题
随机推荐
String matching problem
About text selection in web pages and counting the length of selected text
Record an error report, solve the experience, rely on repetition
ONNX+TensorRT:将预处理操作写入ONNX并完成TRT部署
JMeter script parameterization
taobao. trade. Get (get some information of a single transaction), Taobao store order interface, Taobao oauth2.0 interface, Taobao R2 interface code docking and sharing
info [email protected] : The platform “win32“ is incompatible with this module.
【C语音】详解指针进阶和注意点(2)
数据库连接池和数据源
【C语言】详解指针的初阶和进阶以及注意点(1)
PTA题库 ===>复数四则运算,一帮一,考试座位号(7-73)
记一次报错解决经历依赖重复
蜻蜓低代码安全工具平台开发之路
LeetCode 209. 长度最小的子数组
871. 最低加油次数 : 简单优先队列(堆)贪心题
threejs的控制器 立方体空间 基本控制器+惯性控制+飞行控制
Have you learned the wrong usage of foreach
C#代码审计实战+前置知识
Fabric. JS free draw circle
SQL 后计算的利器 SPL