编译原理 清疚 2023-10-29 07:49 261阅读 0赞 **第一章:** **编译过程的六个阶段:**词法分析,语法分析,语义分析,中间代码生成, 代000码优化,目标代码生成 **解释程序:**把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序。**解释方式是**接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。 **编译程序:**就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序)。 解释程序和编译程序的**根本区别**:是否生成目标代码 **第三章:** **Chomsky****对文法中的规则施加不同限制,将文法和语言分为四大类:** **0****型文法(****PSG****)** à 0型语言或短语结构语言 文法 G的每个产生式α→β中:若α∈V\*VNV\*, β∈(VN∪VT)\* , 则 G是0型文法,即短语结构文法。 **1****型文法(****CSG****)** à 1型语言或上下文有关语言 在0型文法的基础上:若产生式集合中所有|888 α|≤|β|,除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或 e, 右线性文法:若产生式为A→aB或A→a 左线性文法:若产生式为 A→Ba或A→a 都是3型文法(即:正规文法) **最左(最右)推导** 在推导的任何一步αÞ β,其中α、β是句型,都是对α中的最左(右)非终结符 进行替换 **规范推导:**即最右推导。 **规范句型:**由规范推导所得的句型。 **句子的二义性(这里的二义性是指语法结构上的。)** 文法G\[S\]的一个句子如果能找到两种不同的最左推导(或最右推导),或者存在两棵不同的语法树,则称这个句子是二义性的。 **文法的二义性** 一个文法如果包含二义性的句子,则这个文法是二义文法,否则是无二义文法。 **短语** 若SÞ\* αAδ且 A Þ +β,则称β是句型αβδ相对于非终结符A的短语。 **简单短语(直接短语)** 若SÞ \* αAδ且AÞβ,则称β是句型αβδ相对于非终结符A 的简单短语。 **句柄** 一个句型的最左简单短语。(产生式的右部) **子树与短语的关系** (1) 短语:子树的末端结点(即树叶)组成的符号串; (2) 直接短语:简单子树的末端结点组成的符号串; (3) 句柄:最左简单子树的末端结点组成的符号串; **左图所示的关于句型****E+E\*i****的语法树来说:** * * **它有****3****棵子树,即****3****个短语** * **分别为****i****、****E\*i****和****E+E\*i****;** * **直接短语、句柄均为****i****。** 从语法树中可以看出, 所有树叶的组合就是其相对应的父结点的短语。 **句型****i+i\*i****的语法树** **有****8****棵子树,短语和直接短语如下:** **直接短语:**i1, i2 , i3 **短语:**i1,i2,i3,i1\*i2,i1\*i2+i3 **句柄:**i1 **注意:****i2+i3****不是短语不是某棵子树的结果** **第四章:** **单词符号的输出形式** 二元组:(单词种别,单词自身的值) **单词符号的分类** 关键字,标识符 ,常数,运算符,界符等(**这种分类不是唯一的)** **【例4.2】****令****S****=\{a****,****b\}****,** **S****上的正规式和相应的正规集的例子有****:** **正规式** **正规集** a \{a\} a½b \{a, b\} ab \{ab\} (a½b)(a½b) \{aa, ab, ba, bb\} a \* \{e, a, aa, …任意个a的串\} (a½b)\* \{e,a,b,aa,ab …所有由a和b组成的串\} (a½b)\*(aa½bb)(a½b)\* \{S\*上所有至少含有两个相继的a或两个相继的b组成的串\} **DFA****定义**:**一个确定的有穷自动机****M****d****是一个五元组:****M****d****=****(****K,Σ, f, S, Z****),其中:** (1) K:有穷状态集;(2) Σ:有穷输入字母表; (3) f :转换函数,K×Σ è K的单值映射; 即 **f** **(k****i** **, a)=k****j** **,其中** **k****i****、****k****j****∈K****,****a∈Σ**; (4) S : S∈K,惟一初态; (5) Z:ZÍK,是一个终态集,也称可接受状态或结束状态。 **【例】****DFA M=(\{S,U,V,Q\}****,****\{a,b\}****,****f****,****S****,****\{Q\})****,** **其中****f****定义为:****f****(****S****,****a****)****=U****,****f****(****V****,****a****)****=U** **f****(****S****,****b****)****=V****,****f****(****V****,****b****)****=Q** **f****(****U****,****a****)****=Q****,****f****(****Q****,****a****)****=Q** **f****(****U****,****b****)****=V****,****f****(****Q****,****b****)****=Q** **DFA****的表示****(****1****)用转换函数;****(****2****)状态转换矩阵;****(****3****)状态转换图** **转换函数****:DFA M=(\{0, 1, 2, 3\}, \{a, b \}, f, 0, \{ 3 \} )** **f:** **f(0,a)=1 f(0,b)=2 f(1,a)****=****3 f(1,b)****=****2** **f(2,a)=1 f(2,b)=3 f(3,a)****=****3 f(3,b)****=****3** **转换矩阵 状态转换图** **NFA M****的定义:一个非确定有穷自动机****M****n****是一个五元组****M****n****=(K, Σ, f, S, Z )****,其中:** (1) K、Σ、Z的意义与DFA相同; (2) f:从K×Σ\* è K的子集映射; (3) S Ì K,是一个非空初态集。 **与****DFA****的主要区别** 允许有多个初始状态。 允许状态在其输出边上有相同的符号(多值映射)。 允许输出边上有空串符号e 。 **特点:**在给定状态和符号的情况下,不能唯一的确定下一个状态。 **NFA的确定化基本方法** **基本方法:****e****边合并****,****符号合并** **(NFA转化成的DFA不是唯一的)** **【 例 】** **NFA M****如右图所示,试将其确定化为****DFA M'****。** **【解答】** (1)用子集法将图所示的NFA M确定化为表1。 (2)对表1中的所有子集重新命名 得到表2的状态转换矩阵 **确定有穷自动机的化简:** **第五章:** **语法分析是编译程序的核心部分**:在词法分析的基础上,识别单词符号序列是否是给定文法的正确句子(程序)。 **自上而下分析的前提:** 消除左递规和 消除回溯。 **自顶向下分析法就是** 从文法的开始符号 出发,试图推导出与 输入的单词串完全 匹配的句子。 **如果能够推导出,则该输入串是给定文法的句子。** **如果不能推导出,则该输入串不是给定文法的句子。** **自顶向下分析法分两种** **不确定性分析法:**是带有回溯的分析方法,效率低,代 价高,极少使用。 **确定性分析法:**对文法有一定的限制,但实现简单直观,便于手工或自动构造。 **LL(1)****文法的定义** **一个上下文无关文法是****LL(1)****文法的充分必要条件是**:对每个非终结符A的任两个不同产生式 A®a,A®β,满足:Select(A®a)∩Select(A®β)=Æ,其中:a、β不同时推导出e **注:对****LL(1)****文法进行语法分析时不会产生回溯。** **LL(1)****的含义:(****LL(1)****文法是无二义的;** **LL(1)****文法不含左递归)** 第1个L:从左到右扫描输入串 第2个L:生成的是最左推导 1 :向右看1个输入符号便可决定选择哪个产生式 **某些非****LL(1)****文法到****LL(1)****文法的等价变换:****1.** **提取公因子****2.** **消除左递归** **1.** **提取左公因子** 形如: A→aβ1|aβ2|...|aβn|γ 提取左公因子: A →a(β1|β2|...|βn)|γ 改写为: A →a A'|γ A'→β1|β2|...|βn **2.** **消除左递归 (如果一个 文法是左递归时,则不能采用自顶向下分析法。)** **(1)****左递归的定义 (含有左递归的文法绝对不是****LL****(****1****)文法)** 一个文法含有下列形式的产生式时, * A®AbAÎVN, bÎV\* 直接左递归 ②A®BbB®AaA, BÎVN, a,bÎV\* 间接左递归 **(2)****直接左递归的消除 (改为右递归)** 形如: A → A a|β(a非e,β不以A打头) 改写为:A →βA¢ A¢ →aA¢ | e 形如:*A*→*A*a1| *A*a2| . . . | *A*a*n*| b1 | b2| . . . | b*m* 其中,每个a都不等于e,b1 , . . . , b*m* 均不以*A*开头。 改写为: *A* →b1 *A*¢ | b2 *A*¢ | . . . | b*m**A*¢ *A*¢ →a1 *A*¢ | a2 *A*¢ | . . . | a*n**A*¢ | e **预测分析法(又称LL(1)分析法,属于确定的自顶向下分析方法)** **基本思想****:从左到右扫描源程序,直接根据:** (1) 当前(需推导)的语法变量; (2) 输入串的当前输入符号; 确定进行分析所需的候选式:使其第一个符号与当前输入符号相同,或该候选式可推导出的第一个符号与当前符号相同。 **预测分析器构成:预测分析程序,先进后出栈,预测分析表****——****与文法有关** **第七章** **对输入串的分析过程(已知文法的分析表)** **LR分析法:是一种规范规约过程** **LR(k)****含义** **L** **:从左到右扫描输入符号** **R** **:最右推导对应的最左归约****(****反序完成最右推导****)** **k** **:超前读入****k****个符号,以便确定归约用的产生式** **LR(0)****项目分类** **移进项目,**形如A→a• ab,a是终结符,a,b ÎV\* 以下同 【例】S→ • bBB **待约项目,**形如 A →a• Bb【例】 S→b • BB S→bB • B **归约项目,**形如 A →a• 【例】 S→bBB • **接受项目,**形如S’ →S • **第八章:** **一个属性文法包含一个上下文无关文法和一系列语义规则,** **这些语义规则附在每个产生式上。** **文法符号的属性:**单词的含义,即与文法符号相关的一些信息。如,类型、值、存储地址等。 **一个属性文法****(attribute grammar)****是一个三元组****A=(G, V, F)** **G****:**上下文无关文法。 **V****:**属性的有穷集。每个属性与文法的一个终结符或非终结符相连。属性与变量一样,可以进行计算和传递。 **F****:**关于属性的断言或谓词(一组属性的计算规则)的有穷集。断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。 **综合属性:**若产生式左部的单非终结符A的属性值由右部各非终结符的属性值决定, 则A的属性称为**综合属性。** **继承属性:**若产生式右部符号B的属性值是根据左部非终结符的属性值或者右部其它符号的属性值决定的,则B的属性为**继承属性。** **在两种情况下,都说属性****b****依赖于属性****c****1****,c****2****,…,c****k** **(1)****非终结符既可有综合属性也可有继承属性,但文法开始符** **号没有继承属性。** **(2)** **终结符只有综合属性,没有继承属性,它们由词法程序提供。** **在计算时:** 综合属性沿属性语法树向上传递;继承属性沿属性语法树向下传递。 **语法制导翻译:**是指在语法分析过程中,完成附加在所使用的产生式上的语义规则描述的动作。 **语法制导翻译实现:**对单词符号串进行语法分析,构造语法分析树,然后根据需要构造属性依赖图,遍历语法树并在语法树的各结点处按语义规则进行计算。 **中间代码(中间语言)** **1、**是复杂性介于源程序语言和机器语言的一种表示形式。/ **2**、一般,快速编译程序直接生成目标代码。 **3、**为了使编译程序结构在逻辑上更为简单明确,常采用中间代码,这样可以将与机器相关的某些实现细节置于代码生成阶段仔细处理,并且可以在中间代码一级进行优化工作,使得代码优化比较容易实现。 **何谓中间代码**:源程序的一种内部表示,不依赖目标机的结构,易于代码的机械生成。 **为何要转换成中间代码** 逻辑结构清楚;利于不同目标机上实现同一种语言。 便于移植,便于修改,便于进行与机器无关的优化。 **中间代码的几种形式:**逆波兰记号 ,三元式和树形表示 ,四元式 **逆波兰记号**:把运算分量(操作数)写在前面,把运算符写在后面的表示法,又称后缀表示法。 **中缀表达式向逆波兰表达式转换** **postfix(x)=x postfix(c)=c** **postfix(E****1****op E****2****)= postfix(E****1****) postfix(E****2****) op** **postfix((E))= postfix(E)** **第九章:** **符号表的一般形式:**一张符号表的的组成包括两项,即名字栏和信息栏。 信息栏包含许多子栏和标志位,用来记录相应名字和种种不同属性,名字栏也称主栏。主栏的内容称为关键字(key word)。 **符号表的功能:** **(****1****)收集符号属性** 在分析语言程序中标识符说明部分时,编译程序根据说明信息收集有关标识符的属性,并在符号表中建立符号的相应属性信息。 **(2)** **上下文语义的合法性检查的依据**:检查标识符属性在上下文中的一致性和合法性。 **(3)****作为目标代码生成阶段地址分配的依据** **符号的主要属性及作用:** **1.** **符号名** **2.** **符号的类型** (整型、实型、字符串型等)) **3.** **符号的存储类别**(公共、私有) **4.** **符号的作用域及可视性** (全局、局部) **5.** **符号变量的存储分配信息** (静态存储区、动态存储区) **6.** **符号的其它属性** 数组内情向量(类型、维数、各维的上下界、首地址等) 记录结构型的成员信息 函数及过程的形参 **第十章:** **运行时的存储区** 为了使目标程序能够运行,编译程序要从操作系统中得到一块存储区,以使目标程序能够在其上运行。 **运行时的存储区划分** 目标区:存放目标代码。 静态数据区:编译时能确定所占用空间的数据。 栈区和堆区:可变数据及管理过程活动的控制信息。 **存储分配方案策略**:**静态存储分配**;**动态存储分配:栈式、****堆式****。** **静态存储分配** **1、基本策略** 在编译时就安排好目标程序运行时的全部数据空间,并能确定每个数据项的单元地址。 **2、适用的分配对象**:子程序的目标代码段;全局数据目标(全局变量) **3、静态存储分配的要求**:不允许递归调用,不含有可变数组。 **FORTRAN程序是段结构,不允许递归,****数据名大小、性质固定。** **是典型的静态分配** **动态存储分配** **1、**如果一个程序设计语言允许递归过程、可变数组或允许用户自由申请和释放空间,那么,就需要采用动态存储管理技术。 **2、两种动态存储分配方式****:**栈式,堆式 **栈式动态存储分配** **分配策略:**将整个程序的数据空间设计为一个栈。 【例】在具有递归结构的语言程序中,每当调用一个过程时,它所需的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间**。** **过程所需的数据空间包括两部分** 一部分是生存期在本过程这次活动中的数据对象。如局部变量、参数单元、临时变量等; 另一部分则是用以管理过程活动的记录信息(连接数据)。 **活动记录(AR)** 一个过程的一次执行所需要的信息使用一个连续的存储区来管理,这个区 (块)叫做一个活动记录。 **构成** **1、临时工作单元;2、局部变量;3、机器状态信息;4、存取链;** **5、控制链;6、实参;7、返回地址** **第十一章:** **什么是代码优化** 所谓优化,就是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加快或占用存储空间减少。 **优化原则:**等价原则:经过优化后不应改变程序运行的结果。 有效原则:使优化后所产生的目标代码运行时间较短,占用的存储空间较小。 合算原则:以尽可能低的代价取得较好的优化效果。 **常见的优化技术** **(1)** **删除多余运算****(****删除公共子表达式****)** **(2)** **代码外提:是针对循环的** **(3)****强度削弱;**把执行时间较长的运算替换为执行时间较短的运算 **(4)****变换循环控制条件** **(5)****合并已知量与复写传播** **(6)****删除无用赋值** **基本块定义** 程序中只有一个入口和一个出口的一段顺序执行的语句序列,称为程序的一个基本块。 **对四元式序列,各个基本块的入口语句是:** (1)代码序列的第一个语句。 (2)转移语句的目标语句。 (3)转移语句的下一条语句。 **例子:** **(****1****)*****read (C)*** **(2) A:= 0** **(3) B:= 1** **(4)*****L1: A:=A + B*** **(5) if B>= C goto L2** **(6)** ***B:=B+1*** **(7) goto L1** **(8)*****L2: write (A)*** **(9) halt** **必经结点** 在程序流图中,对任意结点m和n,如果从流图的首结点出发,到达n的任一通路都要经过m,则称m是n的必经结点,记为m DOM n。 **必经结点集:**流图中结点n的所有必经结点的集合称为结点n的必经结点集,记为D(n)。 **回边**:假设*a→ b*是流图中一条有向边,如果b DOM a,则称*a→b*是流图中的一条回边。 **循环****(****依据回边判断****)** **1、给出一个回边** ***n*****®*****d*****,定义这个边的(自然)循环是*****d*****加上所有不经过*****d*****能到达*****n*****的结点;** **2、*****d*****是这个循环的首结点。** **【 例 】 求出左图的所有回边。** **【解答】****(1) 6→6****,因为****D(6)=\{1,2,4,6\}****,** **所以6 DOM 6****,故****6→6****是回边;** **(2) 7→4****,因为****D(7)=\{1,2,4,7\}****,** **所以4 DOM 7****,故****7→4****是回边;** **(3) 4→2****,因为****D(4)=\{1,2,4\}****,** **所以2 DOM 4****,故****4→2****是回边。** **容易看出,其它有向边都不是回边。** **例二:求回边和循环** **回边****4 → 3****(****3 DOM 4****)** **循环:\{3,4,5,6,7,8,10\}** **回边****7 → 4****(** **4 DOM 7** **)** **循环:\{4,5,6,7,8,10\}** **回边****10→7** **(** **7 DOM 10** **)** **循环: \{7****,****8****,****10\}** **回边****8 → 3** **(****3 DOM 8****)** **循环:\{3,4,5,6,7,8,10\}**
相关 编译原理 第一章: 编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成, 代000码优化,目标代码生成 解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语 清疚/ 2023年10月29日 07:49/ 0 赞/ 262 阅读
相关 编译原理(三) 编译原理(三) 词法分析 算法 词法分析 1. 正则式 正则式也称正规式,下面是正则式及其所表示的正则集的递归定义: 设字母 矫情吗;*/ 2023年10月10日 10:06/ 0 赞/ 51 阅读
相关 编译原理(四) 编译原理(四) 语法分析 语法分析 1. FIRST集合 F I R S T ( α ) = \{ a ∣ α ⇒ ∗ a … , a ∈ 一时失言乱红尘/ 2023年10月09日 12:31/ 0 赞/ 12 阅读
相关 编译原理 第一章 编译系统概论 单元测验1 1、 问题:编译过程中,语法分析器的任务不包括( ) 选项: A:分析单词是怎样构成的 B:分析单词串是如何构成语句和说明的 妖狐艹你老母/ 2022年10月22日 10:58/ 0 赞/ 294 阅读
相关 Javac编译原理 Javac编译原理 转载来源:http://www.cnblogs.com/wade-luffy/p/5925728.html 1概述 忘是亡心i/ 2022年07月10日 04:30/ 0 赞/ 337 阅读
相关 【编译原理】编译原理简单介绍 编译原理简单介绍 -------------------- 编译原理简单介绍 什么叫编译程序 翻译 柔光的暖阳◎/ 2022年06月16日 05:17/ 0 赞/ 722 阅读
相关 javac编译原理 [Javac编译原理][Javac] java源代码(符合语言规范)-->javac-->.class(二进制文件)-->jvm-->机器语言(不同平台不同种类) 如何 客官°小女子只卖身不卖艺/ 2022年06月13日 10:10/ 0 赞/ 282 阅读
相关 编译原理总结 学了一学期的编译原理,一开始上课的时候,感觉老师嘴里的概念明明说的那么顺溜,可是到自己这就卡壳了,让我想起了一个梗:要考试了,在复习的时候,打开书,马冬梅,恩记住了,合上书 我不是女神ヾ/ 2022年05月22日 01:13/ 0 赞/ 223 阅读
相关 编译原理1 本学期学习编译原理,挺难的,但只要搞懂了会发现挺有意思的,分享一下自己学习整理的笔记。 编译原理是程序员的基础课之一,希望大家也要努力学好,加油加油!!! 建议放大看![w 淡淡的烟草味﹌/ 2022年04月24日 11:28/ 0 赞/ 238 阅读
还没有评论,来说两句吧...