川大编译原理复习要点Word格式文档下载.docx
《川大编译原理复习要点Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《川大编译原理复习要点Word格式文档下载.docx(6页珍藏版)》请在冰豆网上搜索。
![川大编译原理复习要点Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-10/11/65b802ab-65e8-4b95-9479-274219116d34/65b802ab-65e8-4b95-9479-274219116d341.gif)
2.编译器的前端(),后端(),遍()
扫描程序、分析程序和语义分析程序是前端,代码生成器是后端。
编译器发现,在生成代码之前多次处理整个源程序很方便。
这些重复就是遍(pass)
3.编译器,汇编器和解释器之间的区别
解释程序是如同编译器的一种语言翻译程序。
它与编译器的不同之处在于:
它立即执行源程序而不是生成在翻译完成之后才执行的目标代码。
汇编程序是用于特定计算机上的汇编语言的翻译程序。
有时,编译器会生成汇编语言以作为其目标语言,然后再由一个汇编程序将它翻译成目标代码。
4.扫描,分析(语法,词法)的任务
扫描的任务是将源程序读作字符文件并将其分为若干个记号
扫描程序的任务是从源代码中读取字符并形成由编译器的以后部分(通常是分析程序)处理的逻辑单元。
由扫描程序生成的逻辑单元称作记号(token)
分析的任务是确定程序的语法,或称作结构
分析程序的任务是从由扫描程序产生的记号中确定程序的语法结构,以及或隐式或显式地构造出表示该结构的分析树或语法树
5.上下文无关文法,最左推导,,,乔姆斯基文法层次
上下文无关文法说明程序设计语言的语法结构,利用了与正则表达式中极为类似的命名惯例和运算。
二者的主要区别在于上下文无关文法的规则是递归的()
最左推导()是指它的每一步中最左的非终结符都要被替换的推导
最右推导()则是指它的每一步中最右的非终结符都要被替换的推导。
最左推导和与其相关的分析树的内部节点的前序编号相对应;
而最右推导则和后序编号相对应
最右推导的一个例子:
文法规则:
→|(exp)|number
→+|-|*
相关题目:
3.3
中注意重复和可选的表示方法,语法图
6.句子,句型,文法所定义的语言,分析树,抽象语法树
7.自顶向下,自底向上语法分析
自顶向下(top-down)的分析算法通过在最左推导中描述出各个步骤来分析记号串输入。
之所以称这样的算法为自顶向下是由于分析树隐含的编号是一个前序编号,而且其顺序是由根到叶。
分为两类:
回溯分析程序()和预测分析程序()
自底向上的分析程序有两种可能的动作(除“接受”之外):
1)将终结符从输入的开头移进到栈的顶部。
2)假设有BNF选择A→a,将栈顶部的串a归约为非终结符A。
8.为什么要解决公因子,左递归
当有公因子存在时,不能立即区分出文法规则右边的选择
当有左递归时,将导致一个无限循环。
9.写正则表达式,构造,,最小化(按照算法做)
构造(使用结构):
1)基本正则表达式基本正则表达式格式a或ε,其中a表示字母表中单个字符的匹配,
ε表示空串的匹配。
与正则表达式a等同的N(即在其语言中准确接受)的是:
与ε等同的N是:
2)并置我们希望构造一个与正则表达式rs等同的N,其中r和s都是正则表达式。
可将与对应的N构造如下:
3)在各选项中选择我们希望在与前面相同的假设下构造一个与r|s相对应的N。
如下进行:
4)重复我们需要构造与r*相对应的机器,现假设已有一台与r相对应的机器。
那么就如下进行:
构造的一个例子:
例:
根据结构将正则表达式ab|a翻译为N。
首先为正则表达式a和b分别构造机器:
接着再为并置ab构造机器:
现在再为a构造另一个机器复件,并利用它们组成ab|a完整的N,如下图:
将转换成(最小子集法):
ε-闭包(ε-closure)是可由ε转换从某状态或某些状态达到的所有状态集合,它总是包含状态本身
子集构造:
参见
(2)
相关题目:
2.1,2.12,2.16
10.写最左推导,最右推导,画分析树和抽象语法树
11.写出给定程序的语法树,抽象语法树
12.说明文法有二义性
可生成带有两个不同分析树的串的文法称作二义性文法()
3.2
13.写出给定程序的递归下降分析程序(可能用伪代码,C程序),构造语法树
注意事项:
在处理产生式A→ε时,可以忽略,或者使用A的集合。
不要试图去匹配ε(不然要被拉去登记的)
4.2,4.3,4.4
14.给定文法:
消除左递归,提取公因子,求,,说明是否是
(1)文法,构造
(1)分析表,给出一个输入分析的动作
消左递归:
简单直接左递归
在这种情况下,左递归只出现在格式A→A|,为了消除左递归,将这个文法规则重写为两个规则:
一个是首先生成,另一个是生成的重复,它不用左递归却用右递归:
A→A和A→A|ε其它形式参见书本
提取左因子:
当两个或更多文法规则选择共享一个通用前缀串时,需要提取左因子。
如A→|,将左边的分解出来,并将该规则重写为两个规则A→A和A→
集合:
令X为一个文法符号(一个终结符或非终结符)或,则集合(X)由终结符组成,此外可能还有ε,它的定义如下:
1.若X是终结符或ε,则(X)={X}。
2.若X是非终结符,则对于每个产生式X→X1X2...,(X)都包含了First(X1)-{ε}。
若对于某个i<
n,所有的集合(X1),...,()都包括了ε,则(X)也包括了(+1)-{ε}。
若所有集合(X1),...,()包括了ε,则(X)也包括ε。
现在为任意串=X1X2...(终结符和非终结符的串)定义(),如下所示:
()包括(X1)-{ε}。
对于每个i=2,...,n,如果对于所有的k=1,...-1,()包括了ε,则()就包括了()-{ε}。
最后,如果对于所有的i=1,...,n,()包括了ε,则()也包括了ε。
集合:
给出一个非终结符A,那么集合Follow(A)则是由终结符组成,此外可能还有$。
集合Follow(A)的定义如下:
1.若A是开始符号,则$就在Follow(A)中。
2.若存在产生式B→A,则()-{ε}在Follow(A)中。
3.若存在产生式B→A,且ε在First()中,则Follow(A)包括(B)。
(1)文法:
如果文法G相关的LL
(1)分析表的每个项目中至多只有一个产生式,则该文法就是LL
(1)文法(
(1))。
(1)分析表M[N,T]的构造:
为每个非终结符A和产生式A→重复以下两个步骤:
1)对于()中的每个记号a,都将A→添加到项目M[A,a]中。
2)若ε在()中,则对于(A)的每个元素a(记号或是$),都将A→添加到M[A,a]中。
4.7,4.8,4.10
15.给定文法:
求(0)的,构造(0)和
(1)的分析表,说明是否是(0)或
(1)文法(描述冲突),给定一个输入,写出(0)
(1)的分析步骤
5.1,5.3
16.算法(写伪代码)
3种代码,
(1)算法,(0)算法,
(1)算法,消左递归,提公因子,构造,集合
代码(英文书P63,中文P42)
(1)算法(英文书P155,中文P115)
(0)算法(英文书P207,中文P158)
(1)算法(英文书P210,中文P160)
左递归(英文书P159,中文P119)
公因子(英文书P164,中文P122)
构造(英文书P168,中文P126)
构造(英文书P173,中文P130)
参见书本