编译原理面试总结

在这里插入图片描述


在这里插入图片描述

1、编译过程概述

(1)词法分析

即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。所以当单词不符合构词规则时词法分析会报错。
读入一个一个的字符(输入),对这些字符进行扫描和分解,从而识别出一个个单词(输出)。

(1)语法分析

语法分析是编译过程的一个逻辑阶段。语法分析的任务是在词法分析的基础上将单词序列组合成各类语法短语,如“程序”,“语句”,“表达式”等等.语法分析程序判断源程序在结构上是否正确.

  • 在词法分析的基础上,将单词序列(输出)分解成各类语法短语。(赋值语句等语句)
  • 语法分析依据语言的语法规则,确定整个输入串是否在语法上正确。

If else是否匹配,无论是LL(1)文法分析,自顶向下还是自底向上都是要按照给定的语法,判断词法分析的词语是不是满足语法要求(标识符定义是否正确,括号是否匹配,关键字是否正确,标识符,函数定义是否正确,使用的函数或者标识符是否定义等等)

(2)语义分析

审查源程序有无语义错误,为代码生成阶段收集类型信息(如类型转化,类型匹配,上下文相关性等)。
主要是类型相容检查,有以下几种:
各种条件表达式的类型是不是boolean型?
运算符的分量类型是否相容?
赋值语句的左右部的类型是否相容?
形参和实参的类型是否相容?
下标表达式的类型是否为所允许的类型?
函数说明中的函数类型和返回值的类型是否一致?
V[E]中的V是不是变量,而且是数组类型?
V.i中的V是不是变量,而且是记录类型?i是不是该记录的域名?
x+f(…)中的f是不是函数名?形参个数和实参个数是否一致?
每个使用性标识符是否都有声明?有无标识符的重复声明?
在语义分析同时产生中间代码,在这种模式下,语义分析的主要功能如下:
语义审查
在扫描声明部分时构造标识符的符号表
在扫描语句部分时产生中间代码

(3)中间代码生成

中间代码是一种结构简单,含义明确的记号系统。
将源程序生成一种内部表示形式,这种内部表示形式叫中间代码。(四元式就是一种中间代码形式)

(4)代码优化

对中间代码进行等价变换,以便生成更高效的目标代码

(5)目标代码生成

把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码,它的工作与硬件系统和指令含义有关.

(6)表格管理程序

编译过程中源程序的各种信息被保留在种种不同的表格里,编译各阶段的工作涉及到构造、查找或更新有关的表格,因此需要有表格管理工作。

(7)出错处理

出错处理:编译过程中,发现源程序有错误(词法错误、语法错误、语义错误),编译程序应报告错误的性质和出错的地点,并将错误所造成的影响限制在尽可能小的范围内,使得源程序的其余部分继续被编译下去。这些工作称为出错处理(error handling)。目的是使得编译程序能够继续向下进行分析和处理。

3.前端、后端, 分析与综合

(1)前端与后端
前端(依赖于源语言而与目标机无关):词法分析、语法分析、语义分析和中间代码的生成,中间代码优化;
后端(依赖于目标机而一般不依赖源语言):目标代码生成;

(2)分析与综合
分析阶段:词法分析、语法分析、语义分析,只对程序进行识别和检查,没作实质翻译
综合阶段:中间代码的生成,代码优化,目标代码生成,对源程序进行翻译,生成目标代码

2、文法和语言

在这里插入图片描述

(1).句型、句子、语言

(1)句型和句子
句型:若符号串x是从开始符推导出来的,即S =>*x,则称x是文法G的句型
如果此时x只由终结符组成那么也称x为句子。
(2)语言
定义:由文法G生成的语言记为L(G),它是文法G的一切句子的集合。
文法和语言的关系:文法G生成的每个串都在L(G)中且L(G)中的每个串确实能被G生成。
(3)等价文法
若L(G1)=L(G2),则称文法G1和G2是等价的。

(2)文法的四种类型:

① 0型文法:没什么特别约束,对任一产生式α→β,都有α∈(VN∪VT)且至少含有一个非终结符, β∈(VN∪VT)
② 1型文法(上下文有关):右侧式子的长度大于左侧的,S→ε除外,将上下文中间的一个非终结符替换为终结符。
③ 2型文法(上下文无关语法):与上下文语境无关,重点研究2型文法,常用来表示程序设计语言的文法。至于推出终结符还是非终结符则没有限制。
④ 三型文法(正规文法):常用来描述程序设计语言中单词的结构。是二型文法的特例,每一个非终结符都推出非终结符+终结符,或者直接推出终结符。

(3)文法的二义性:

如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的。二义性文法存在某个句子,它有两个不同的最左(右)推导,两个推导必须同时是最左或者最右。

3、词法分析

1.有穷自动机(有限自动机)

为什么是有穷?:状态和输入字母表有穷。
作用:是一种识别装置,识别正规文法所定义的语言和正规式所表示的集合。
分类:(i)确定的有穷自动机(DFA)(ii)不确定的有穷自动机(NFA)

(1)确定的有穷自动机,状态转化图,状态转化表

为什么称之为确定的?:表现在:转换函数f:K×Σ→K是一个单值函数,也就是说,对任何状态k∈K,和输入符号a∈Σ,f(k,a)唯一地确定了下一个状态。
DFA M所能接受的符号串的全体记为L(M).
结论:字符表上一个符号串集V是正规的,当且仅当存在一个该字符表上的确定有穷自动机M,使得 V=L(M)
在这里插入图片描述

(2)不确定的有穷自动机(NFA)

与DFA的不同之处在于:
一状态对同一个字的动作可以指向不同的状态。
初态可以有多个。
因为NFA的转换函数f为K×字符集* 到K的子集的一种映射,所以NFA中可以有空字转移,这在DFA中是不允许的。
DFA是NFA的特例,对每个NFA都存在一个与其等价的DFA M’。
在这里插入图片描述

4、自顶向下的语法分析方法

作用:识别由词法分析给出的单词序列是否是给定文法的正确句子
分类
在这里插入图片描述

自顶向下的基本思想:从文法的开始符出发企图推导出与输入的单词串完全相匹配的句子.

1:确定的自顶向下分析思想

(1)思想
主要思想:从文法的开始符号出发,考虑如何根据当前的输入符号唯一的确定选用哪个产生式替换相应的非终结符以往下推导,或如何构造一颗相应的语法树。
限制:要进行确定的自顶向下的分析,文法要满足一定的限制——即文法是LL(1)文法。

确定的自顶向下的分析方法有递归子程序法和预测分析法,两种方法都要求文法是LL(1)文法。

2:LL(1)文法

是该文法的充要条件:一个上下文无关文法是LL(1)文法的充分必要条件是, 对每个非终结符A的两个不同产生式A→α与A→β,满足SELECT(A→α)∩SELECT(A→β)=Φ。
含义
在这里插入图片描述
LL(1)文法的判别,第一步求所有能产生空字的非终结符集合是有用的。
在这里插入图片描述在这里插入图片描述

3:某些非LL(1)文法到LL(1)文法的等价变换

对非LL(1)文法进行等价变换,提取左公共因子,消除左递归。变换后的文法不一定是LL(1)文法,文法不含左递归和左公共因子只是LL(1)文法的必要条件。
(1)含有左公共因子的文法。
若文法中含有形如:A→αβ|αr 的产生式,称文法含有左公共因子(只有最左部重复才算)。因为alpha的存在,其显然不是LL(1)文法。
提取左公共因子:
用新的非终结符来代替公共因子。
在这里插入图片描述

(2)含有左递归的文法。
文法中只要含有下列形式的产生式(含有a或含有b或二者皆有)则称文法含有左递归:A→Aβ(直接左递归);A→Bβ B→Aα(间接左递归)。
消除左递归:
在这里插入图片描述在这里插入图片描述

4.不确定的自顶向下分析思想

不确定是指某个非终结符有多条产生式,而面临当前输入符无法唯一确定选用哪条产生式进行推导,只好逐个试探。当分析不成功时,则推翻分析退回到适当位置重新试探其余候选可能的推导(回溯,左递归就会引起回溯),直到把所有可能的推导序列都试完仍不成功,才能确认输入串不是该文法的句子。

5、自底向上优先分析法

1.自下而上的分析方法:

(1)基本思想:
从输入串开始,逐步进行归约,直到文法的开始符号
归约:根据文法的产生式规则,把产生式的右部替换成左部符号
从树末端开始,构造语法树
采用“移进-归约”思想进行自下而上分析
基本思想
① 一步规约
用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。
核心问题:识别可归约串
(2)算符优先分析法:
按照算符的优先关系和结合性质进行语法分析
适合分析表达式
(3)LR分析法:
规范规约

2.算符优先分析法:

归约即计算表达式的值。归约顺序不同,则计算的顺序也不同,结果也不一样。
如果规定算符的优先次序,并按这种规定进行归约,则归约过程是唯一的。
所谓算符优先分析法就是定义算符(终结符)之间的某种优先关系,借助于这种关系寻找“可归约串”和进行归约
不是规范规约
适用于表达式分析,分析速度快。因为表达式的规约顺序与运算顺序一致。

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

(2)算符文法
一个文法的右部不含两个并列的非终结符,则该文法为算符文法。也就是说在算符文法中任何句型都不包含两个相连的非终结符。

(3)算符优先文法
设有一不含ε产生式的算符文法G,如果对任意两个终结符对a,b之间至多只有一种优先关系成立,则称G是一个算符优先文法(Operater Precedence Grammar),即OPG文法。
说明:两个终结符之间的优先关系是有序的,算符优先文法允许a>b,b>a同时存在,而不允许有a>b,a<b,a=b三种情况中的任两种同时存在。例如:算符优先文法允许 + > ) ,) > +同时存 在,不允许 + > ) 和 + < ) 同时存在
在这里插入图片描述

3.LR分析法

(1)特点
规范规约,因此关键问题还是在于寻找句柄。
适用范围广,适用于大多数上下文无关文法描述的语言
基本思想:LR分析方法:把"历史"及"展望"综合抽象成状态;由栈顶的状态和现行的输入符号唯一确定每一步工作
LR分析器的组成:(i)总控程序(ii)分析表:ACTION表(动作表)和GOTO表(状态转换表)(iii)分析栈:状态栈S和文法符号栈X。其中分析表是LR分析器的核心。
对于一个文法,如果能够构造一张分析表,使得它的每个入口均是唯一确定的,则这个文法就称为LR文法。
一个文法,如果能用一个每步顶多向前检查k个输入符号的LR分析器进行分析,则这个文法就称为LR(k)文法.
LR分析法通过活前缀来帮助确定句柄。
在这里插入图片描述
在这里插入图片描述

4.小结,各种方法的比较

LR(0)、SLR(1)、LR(1)、LALR(1)方法比较


(1)归约的判定方法上(LR方法的主要区别):
1.LR(0)是不看展望符判定归约;
2.SLR(1)是看展望符,但把所有B→x·的展望符集均定义为Follow(B)。即把符号栈顶上的句柄x归约为B的条件是:展望符为Follow(B)中的元素。换句话说,归约任何位置上的B,都用统一的展望符集;
3.LR(1)也是看展望符,但归约不同位置上的B时,采用不同的展望符集。每个项由心与向前搜索符组成,搜索符长度为1。由于LR(1)方法对于归约条件的判定比SLR(1)更精确,可大大减少移入/归约冲突;
4.LALR(1): 对LR(1)项目集规范族合并同心集


(2)分析表比较:LR(0)、SLR(1)、LR(1)、LALR(1)
1.LR(0)分析表局限性大,但其构造方法是其他构造方法的基础;
2.SLR分析表虽然不是对所有文法都存在,但这种分析表较易实现又极有使用价值;
3.LR分析表的分析能力最强,能适用于一大类文法,但是,实现代价过高(表过大);
4.LALR分析表的能力介于SLR和LR之间,实现效率较高。

6、中间代码生成

1:中间代码的形式

① 逆波兰表达式
对于 a + b ∗ c a b c ∗ + a+b*c abc*+ a+bcabc+表示 b c bc bc用的符号是 ∗ , a *,a a b c bc bc之间的符号是 + + +
有点:最大优点是易于计算机处理
最大优点是易于计算机处理
逆波兰表达式的扩充(右下)

② 三元式和树形表示
在这里插入图片描述在这里插入图片描述

③ 四元式
四元式是一种比较普遍采用的中间代码形式(算符op,ARG1,ARG2,运算结果RESULT)
在这里插入图片描述
四元式的优点:
四元式比三元式更便于优化。优化要求改变运算顺序或删除某些运算,引起编号的变化。三元式通过编号引用间结果,编号的变化引起麻烦;四元式通过临时变量引用中间结果,编号变化无影响。
四元式对生成目标代码有利。四元式表示很类似于三地址指令,很容易转换成机器代码。

7、代码优化

什么是优化:对程序进行各种等价变换,使得从变换后的程序出发,能生成更有效的目标代码
优化所要遵循的原则

在这里插入图片描述

1.特点

中间代码优化不依赖于计算机
对比目标代码优化(这是依赖于具体的计算机的)
优化所需要的基础是在中间代码生成之后或者目标代码生成(不只是中间代码可以优化唔)之后。

2.优化的种类

在这里插入图片描述

3.局部优化

程序中一个顺序执行的语句序列,只有一个入口语句和一个出口语句。
求法:要注意第二个条件,能转移到的语句也算是入口语句
在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述

4.循环优化

在这里插入图片描述

5.全局优化

过程内的全局优化是在一个程序过程(C语言内称为函数)范围内进行的优化,前面提到的所有方法也都可用到全局优化当中。

  • 37
    点赞
  • 198
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值