编译原理期末复习纲要
仅供自己观看
一、选判填
- 单选:
5*1=5'
- 判断:
5*1'=5'
- 填空:
5*2'=10'
合计:20'
二、简答题
12选4,4*5'=20'
-
什么是编译程序?
编译程序是现代计算机系统的基本组成部件之一。从功能上看,一个编译程序就是一个语言翻译程序,能够将一种高级语言翻译成目标语言,通目标语言常是汇编语言或者机器语言这样的低级语言。
-
编译有哪几个过程?
词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成共6个过程。
-
编译和解释的区别?
两者主要是工作模式上的区别。编译是将源程序代码转换成目标代码,通常目标代码是汇编代码,然后需要将目标代码进一步转换成计算机能够识别的二进制代码,机器才能运行;解释是直接对源程序一行一行的执行,能直接得到运行结果而不生成目标代码。其次就是两者的运行效率不同,一般而言,编译的程序要比解释的程序效率高。
-
什么是文法的二义性?
一个文法存在某个句子对应两个不同的语法树,或者说一个文法中存在某个句子,它有两个不同的最左(或最右)推导
-
什么是有限自动机?
有限自动机是一种识别装置,能准确地识别 正规集
-
简述词法分析器的作用
- 从字符流的源程序中识别单词
- 滤掉源程序中注释或空白
- 记录新读入的字符行的行号
-
常见的语法分析方法有哪些?
常见的有自顶向下分析和自底向上分析两种方法。
-
简述语法分析器的作用
确定是否可以以及如何从语法的起始符号推导出输入符号串
总结起来就是两点:
- 识别并检查来自词法分析器的单词符号串
- 构建由输入单词符号串组成的数据结构
-
什么是LL(1)文法分析器?
LL(1)文法分析器是
能够判断由词法分析给出的单词符号串是否符合LL(1)文法规则的程序。
常用的实现方法由:递归下降和表驱动。 -
什么是LR(0)文法分析器?
LR(0)文法分析器就是一个由总控程序、分析表(或分析函数)和分析栈组成,能够从词法分析器中取得词法单元序列,并且确认该序列是否可由LR(0)文法生成的程序。
简而言之:能用LR(0)分析表的 分析器 称为LR(0)分析器。
-
什么是语法制导翻译?
书上的说法:是编译程序实现的一种方法,即由语法分析程序的分析过程来主导语义分析以及翻译的过程。
-
常见的代码优化方法有哪些
- 窥孔优化
- 局部优化
- 循环优化
- 全局优化
二、大题
4*15'=60'
-
将NFA确定化和最小化
-
LL(1)文法相关问题
-
判断一个文法是否是LL(1)文法
-
构造预测分析表
Step1:计算出SELECT集合(SELECT集合求解可以参考文章:细讲如何判断文法是否是LL(1)文法)
Step2:画一张预测分析表,行为非终结符,列为终结符
Step3:通过SELECT集合将相应非终结符的产生式填入相应的终结符的那一列
例如:存在如下SLECT集合表
产生式 SELECT集合 E → TE’ ( , id E’ → +TE’ + E’ → ε #,) T → FT’ (,id T’ → *FT’ * T’ → ε #,),+ F → id id F → (E) ( 预测分析表如下所示:
id + * ( ) # E E’ T T’ F ① E → T E ’ E → TE’ E→TE’能够得到得到SELECT集合 { ( , i d } \{( , id\} {(,id},故在( 和id下面写入产生式 E → T E ’ E → TE’ E→TE’,通常为了简化表,产生式左部会省略
② E ’ → + T E ’ E’ → +TE’ E’→+TE’能够得到SELECT集合 + + +,故在+的那一列写入 → + T E ’ → +TE’ →+TE’,同时 S E L E C T ( E ’ → ε ) = { # , ) } SELECT(E’→ε)=\{\#,)\} SELECT(E’→ε)={#,)},所以要在#和ε这两列写入产生式 → + T E ’ → +TE’ →+TE’
③、④、⑤同理可得
填完后的预测分析表为:
id + * ( ) # E → T E ’ → TE’ →TE’ → T E ’ → TE’ →TE’ E’ → + T E ’ → +TE’ →+TE’ → ε → ε →ε → ε → ε →ε T → F T ′ → FT' →FT′ → F T ′ → FT' →FT′ T’ → ε → ε →ε → ∗ F T ′ → *FT' →∗FT′ → ε → ε →ε → ε → ε →ε F → i d → id →id → ( E ) → (E) →(E)
-
-
LR分析相关问题
-
判断一个文法是SLR(1)还是LR(0)文法
-
构造识别活前缀的DFA
-
构造文法分析表
-