1、第一章: 1.编译程序的步骤和任务: 1) 词法分析:从左到右一个字符一个字符地读入源程序,对构成源程序的字符流进行扫描和分解,从而识别出一个个单词。 2) 语法分析:是在词法分析基础上将单词序列分解成各类语法短语 (比如程序、语句、表达式等),通过语法分析确定整个输入串是否构成一个语法上正确的程序。 3) 语义分析:是审查源程序有无语义错误,为代码生成阶段收集类型信息。 4) 中间代码产生:将源程序变成一种易于翻译成目标代码的内部表示形式。 5) 代码优化: 对前阶段生成的中间代码进行变换或改造,使生成的目标代码更为高效 6) 目标代码生成: 把 中间代码变换成特定机器上的绝对指令代码或可重
2、定位的指令代码或汇编指令代码。 2. 前端和后端的概念,试问前端通常包括那些阶段,后端包括那些阶段? 答: 前端只依赖于源语言,与目标机无关 。编译程序的前端通常包括词法分析程序、语法 分析程序、语义分析程序、中间代码生成程序及相关的 表格管理程序和出错处理程序 。后端 是指编译器中 依赖于目标机器的部分 ,只与中间代码有关 。通常包括目标代码生成程序、代 码优化程序以及相关的表格管理程序和出错处理程序。 遍( PASS):对输入文件(源程序或其等价的中间语言程序)从头到尾扫视,完成 预定处理 的过程。 一个多遍的编译程序较之一遍的编译程序可能少占内存,逻辑结构可能清晰些,但效率相 对可能差点
3、 3.程序的正确与否 :结构上的语法规则,语义上的语义规则。 翻译程序:汇编,解释,编译。 4.解释程序及其与编译程序的比较 解释程序功能: 源程序 +初始数据 =计算结果 解释与编译的区别: 工作模式:这是根本区别,编译把源程序翻译成目标代码,而解释直接得到计算结果,不生成目标代码。 存储 区内容: 编译方式翻译和执行分开,解释方式翻译和执行同时并允许修改源程序,因此二者存储组织不同。 效率: 解释慢于编译,很多语言两种方式都有 。 标识符: =表达式 第三章:文法和语言 1.文法的直观概念: 一组判定规则。 在实践中,文法不包含多余产生式。 2.文法 G定义为四元组( VT, VN ,S,
4、 P ),其中: VT 是一个非空有穷终结符号集合; VN 是一个非空有穷的非终结符号集合, 且 VT VN; P 是一个产生式的非空有穷集合(注意:产生式左部至少含有一个非终结符); S VN ,称为开始 符号,且 S 至少必须在某个产生式的左部出现一次 。 通常用 V 表示 VN VT,V 称为文法 G 的字母表或字汇表 . 3.句型、句子: 设文法 G,如果符号串 x 是从识别符号推导出来的,即 S x,x V*,则称 x是一个句型。仅含终结符号的句型是一个句子。 4.语语 言言 : 语言 L(G)是由文法 G 产生的所有句子所组成的集合。 5 文法的类型:逐渐对产生式施加限制 四种类型
5、: 0型, 1型, 2 型, 3 型 0 型: G=(VT,VN,S,P),规则形式 : , (VTVN)*, 中至少有一个非终结符 1 型(上下文有 关) : ,仅 S- 除外 规则形式 : A A VN, , , (VTVN)*, 2 型(上下文无关):规则形式 : A A VN, (VTVN)* 3 型正规文法(右线性): A aB 或 A a A,B VN (左线性) A Ba 或 A a a VT 6.最左(最右)推导 在推导的任何一步 ,其中、是句型,都是对中的最左(右)非终 结符 进行替换 规范推导: 即最右推导。 规范句型: 由规范推导所得的句型。 7.文法的二义性 如果一个文
6、法存在某个句子对应两棵不同的语法树 ,或者说 ,若一个文法中存在某个句子 ,它有两个不同的最左 (最右 )推导 ,则说这个文法是二义的 . 如果产生上下文无关语言的每一个文法都是二义的,则说此语言是先天二义的。 8.自上而下的分析方法: 自上而下分析法 ,是从 文法开始符号 出发 ,反复使用各种 产生式 ,逐步进行 推导 ,直至推导出输入符号串。 过程: 自上而下方法是从文法识别符号开始,将它作为语法树的根,向下逐步建立语法树,使 语法树的末 端结点符号串正好是输入符号串。 关键问题: 假定要被代换的最左非终结符号是 A,且有 n 条产生式 :A a1|a2|an, 那么如何确定用哪个产生式右
7、部去替代 A? 9.自下而上的分析方法: 自下而上分析法,是从 输入符号串 开始,逐步进行 归约 ,直至归约到文法的开始符号。 过程: 自下而上方法是从输入符号串开始,以它作为语法树的末端结点,自底向上地构造语法树,使 语法树的根结点正好是文法的开始符号 。 关键问题: 因为分析工作的每一步都是从当前串中选择一个子串 ,将它归约到某个非终结符 ,暂且把这个子串称为可归约串 ,问题是 ,每一步 如何确定这个可归约串 ? 10.短语: 若 S* A且 A +,则称是句型相对于非终结符 A 的短语。 直接短语: 若 S * A且 A,则称是句型相对于非终结符 A 的直接短语。 句柄: 一个句型的最左
8、直接短语。(产生式的右部) 11.子树: 一棵语法树中一个特有的结点连同它的全部后裔,连接这些后裔的边以及这些结点的标记,称为子树。 子树与短语的关系 (1) 短语:子树的末端结点 (即树叶 )组成的符号串; (2) 直接短语:简单子树的末端结点组成的符号串; (3) 句柄:最左简单子树的末端结点组成的符号串; 左图所示的关于句型 E+E*i 的语法树来说: 它有 3棵子树,即 3个短语分别为 i、 E*i和 E+E*i; 直接短语、句柄均为 i。 从语法树中可以看出, 所有树叶的组合就是其相对应的父结点的短语。 342 51X 6 ababab ab2Y句型 i+i*i的语法树 有 5 棵子
9、树,短语和直接短语如下: 直接短语: i1, i2 , i3 短语: i1, i2, i3, i1*i2, i1*i2+i3 句柄: i1 注意: i2+i3 不是短语不是某棵子树的结果 12.有关文法的实用限制: 有害规则 是指形为 U-U的产生式。会引起文法二义性。 多余规则 是指文法中那些任何句子推导都用不到的规则 ,包括两种规则 ,即不可到达的和不可终止的。 不可达到的: 不在文法的任何规则右部出现的非终结符。 不可终止的: 文法中那些不能从其推出终结符号串的非终结符。 第四章:词法分析 1.任务: 从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用以语法分析 2、接口方式:
10、( 1)词法分析工作可以组织成独立的一遍 ,把字符流的源程序变为单词序列,输出在一个中间文件上,这个文件作为语法分析程序的输入而继续编译过程。 ( 2)将词法分析程序设计成一个子程序,当语法分析程序需要一个单词时,则调用该子程序,从源程序中读入一些字符,直到识别出一个单词,或说直到下一个单词的第一个字符为止,这种设计方案是把词法分析和语法分析程序放在同一遍,省掉了中间文件。 单词符号的输出形式: 二元组:(单词种别,单词 自身的值) 单词符号的分类: 关键字,标识符 ,常数,运算符,界符等( 这种分类不是唯一的) 3. 正 规文法与正规式的转换 (若两个正规式 x 和 y 所表示的正规集相同,
11、则说 x 和 y等价,写作 x=y。) 4.NFA 转换为 DFA: DFA的表示 ( 1)用转换函数; ( 2)状态转换矩阵; ( 3)状态转换图 NFA 与 DFA 的主要区别: 允许有多个初始状态。允许状态在其输出边上有相同的符号 (多值映射 )。允许输出边上有空串符号 。 NFA 特点 :在给定状态和符号的情况下,不能唯一的确定下一个状态。 NFA 的确定化基本方法 基本方法 : 边合并 ,符号合并 (NFA 转化成的 DFA 不是唯一的 ) 【 例 】 NFA M 如右图所示,试将其确定化为 DFA M。 【解答】 ( 1)用子集法将图所示的 NFA M 确定化为表 1。 ( 2)对
12、表 1 中的所有子集重新命名 得到表 2 的状态转换矩阵 _closure(S0) 5.DFA 化简:通过消除多余状态和合并等价状态将一个 DFA M 转换成一个最小的与之等价的DFA M 多余状态是指,从该自动机的开始状态出发,任何输入串都不能到达的那个状态。 在有穷自动机中,两个状态 s 和 t 等价的条件是: 1)一致性条件: 即 s 和 t 必须同为终态或同为非终态 2)蔓延性条件: 即对所有输入符号, s 和 t必须转换到等价的状态里。 有穷自动机的状态 s 和 t 不等价,则称这两个状态是可区别的。 6.正规式转换为有穷自动机: r=s|t r=s* 第五章:自顶向下语法分析方法
13、求 FIRST集, FOLLOW集 LL( 1)文法判定 1、语法分析是编译程序的核心部分 :在词法分析的基础上, 识别单词符号序列是否是给定文法的正确句子(程 序)。 自上而下分析的前提: 消除左递规和 消除回溯。 自顶向下分析法就是 从文法的开始符号 x y N(s) x y N(t) N(s) 出发,试图推导出与 输入的单词串完全 匹配的句子。 如果能够推导出,则该输入串是给定文法的句子。 如果不能推导出,则该输入串不是给定文法的句子。 2.自顶向下分析法分两种: 不确定的自顶向下分析法: 是带有回溯的分析方法,效率低,代价高,极少使用。 确定的自顶向下分析法: 对文法有一定的限制,但实
14、现简单直观,便于手工或自动构造。 3.确定的自顶向下分析思想:判定是否为 LL( 1)文法 首符号 FIRST 集: 设设 G=( VT , VN, S, P) 是是 上上 下下 文文 无无 关关 文文 法法 FIRST()=a| a ,a VT, , V* 若若 , 则则 规规 定定 FIRST(). 后跟符号 FOLLOW 集: FOLLOW(A)=aS Aa ,a VT, A VN 若若 S .A, 则则 规规 定定 # Follow(A). 选选 择择 集集 合合 SELECT 集集 : 给给 定定 上上 下下 文文 无无 关关 文文 法法 的的 产产 生生 式式 A- ,A VN,
15、V*, 若若 ,则则 SELECT( A- ) =FIRST( ) 如如 果果 , 则则 SELECT(A- )=(FIRST( )- )FOLLOW(A) 4.LL(1)的含义: LL(1)文法是无二义的、 LL(1)文法不含左递归 第 1 个 L:从左到右扫描输入串 第 2 个 L:生成的是最左推导 1 :向右看 1 个输入符号便可决定选择哪个产生式 一个上下文无关文法是 LL(1)文法的充分必要条件是 :对每个非终结符 A 的任两个不同产生式 A, A ,满足: Select(A)Select(A )= ,其中: 、 不同时推导出 注:对 LL(1)文法进行语法分析时不会产生回溯。 5.
16、某些非 LL(1)文法到 LL(1)文法的等价变换 : 1. 提取左公因子 2. 消除左递归(如果一个文法是左递归时,则不能采用自顶向下分析法。) (1)左递归的定义 (含有左递归的文法绝对不是 LL( 1)文法) 一个文法含有下列形式的产生式时, AA AVN , V* 直接左递归 AB B A A, BVN , , V* 间接左递归 (2)直接左递归的消除 (改为右递归) 形如: A A a|( a 非 ,不以 A 打头) 改写为: A A A aA | 形如: A Aa1 | Aa2 | . . . | Aan | b1 | b2 | . . . | bm 其中,每个 a 都不等于 ,
17、b1 , . . . , bm 均不以 A 开头。 改写为: A b1 A | b2 A | . . . | bm A A a1 A | a2 A | . . . | an A | SSa Sb SbS SaS| E E + T T T T * F F F ( E ) i E T E E + T E T F T T * F T F ( E ) i 6不确定性分析思想: ( 1)由于相同左部的产生式的右部 FIRST集交集不为空而引起回塑。 S-xAy A-ab|a ( 2)由于相同左部产生式的右部存在能的,且非终结符 FOLLOW 集中含有其他产生式右部 FIRST集的元素。 1)S-aAS
18、2)S-b 3) A-bAS 4)A- FOLLOW( A) =a,b ( 3)由于文法含有左递归而引起回溯 7.确定的自顶向下分析方法:递归子程序法、预测分析法。 8.预测分析法 基本思想 :从左到右扫描源程序,直接根据: 预测分析器构成: 预测分析程序, 先进后出栈,预测分析表 与文法有关 第七章 :LR 分析 LR(0)分析 表 识别活前缀的 DFA 分析过程 对输入串的分析过程(已知文法的分析表) LR 分析法:是一种规范规约过程 LR(k)含义 L :从左到右扫描输入符号 R :最右推导对应的最左归约 (反序完成最右推导 ) k :超前读入 k 个符号,以便确定归约用的产生式 LR(
19、0)项目分类 移进项目, 形如 A a, a 是终结符 , , V* 以下同 【例】 S bBB 待约项目, 形如 A B 【 例】 Sb BB SbB B 归约项目, 形如 A 【 例 】 SbBB 接受项目, 形如 S S 第八章: 1.语义处理的两个功能: ( 1) 审查每个语法结构的静态语义,即验证语法结构合法的程序是否真正有意义。 ( 2) 执行真正的翻译,生成中间代码或目标代码。 2.属性文法: 一个属性文法包含一个上下文无关文法和一系列语义规则 ,这些语义规则附在每个产生式上。 文法符号的属性 :单词的含义,即与文法符号相关的一些信息。 如, 类型、值、存储地址等。 一个属性文法
20、是一个三元组 A=(G, V, F) G: 上下文无关文法。 V: 属性的有穷集。每个属性与文法的一个终结符或 非终结符相连。属性与变量一样,可以进行计算和传递。 F: 关于属性的断言或谓词 (一组属性的计算规则 )的有穷集。断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。 综合属性 :若产生式左部的单非终结符 A 的属性值由右部各非终结符的属性值决定 , 则 A的属性称为 综合属性。 继承属性 :若产生式右部符号 B 的属性值是根据左部非终结符的属性值或者右部其它符号的属性值决定的 ,则 B 的属性为 继承属性。 在两种情况下,都说属性 b 依赖于属性
21、c1,c2,c k (1)非终结符既可有综 合属性也可有继承属性,但文法开始符号没有继承属性。 (2) 终结符只有综合属性,没有继承属性,它们由词法程序提供。 在计算时: 综合属性沿属性语法树向上传递;继承属性沿属性语法树向下传递。 3.语法制导翻译: 是指在语法分析过程中,完成附加在所使用的产生式上的语义规则描述的动作。 语法制导翻译实现: 对单词符号串进行语法分析,构造语法分析树,然后根据需要构造属性依赖图,遍历语法树并在语法树的各结点处按语义规则进行计算。 4.中间代码: 1、 是复杂性介于源程序语言和机器语言的一种表示形式。 2、一般,快速编译 程序直接生成目标代码。 3、 为了使编译
22、程序结构在逻辑上更为简单明确,常采用中间代码,这样可以将与机器相关的某些实现细节置于代码生成阶段仔细处理,并且可以在中间代码一级进行优化工作,使得代码优化比较容易实现。 何谓中间代码 :源程序的一种内部表示,不依赖目标机的结构,易于代码的机械生成。 为何要转换成中间代码 逻辑结构清楚;利于不同目标机上实现同一种语言。 便于移植,便于修改,便于进行与机器无关的优化。 中间代码的几种形式: 逆波兰记号 ,三元式和树形表示 ,四元式 逆波兰记号 :把运算分量 (操作数 )写在前面,把 运算符写在后面的表示法,又称后缀表示法。 中缀表达式向逆波兰表达式转换 第十章: 运行时的存储区 为了使目标程序能够
23、运行,编译程序要从操作系统中得到一块存储区,以使目标程序能够在其上运行。 运行时的存储区划分 目标区:存放目标代码。代码区( code) 静态数据区( static data):编译时能确定所占用空间的数据。 栈区和堆区( stack and heap):可变数据及管理过程活动的控制信息。 存储分配方案策略 : 静态存储分配 ; 动态存储分配:栈式、 堆式 。 静态存储分配 1、基本策略 在编译时就安排好目 标程序运行时的全部数据空间,并能确定每个数据项的单元地址。 2、适用的分配对象 :子程序的目标代码段;全局数据目标(全局变量) 3、静态存储分配的要求 :不允许递归调用,不含有可变数组。
24、FORTRAN 程序是段结构,不允许递归, 数据名大小、性质固定。 是典型的静态分配 动态存储分配 1、 如果一个程序设计语言允许递归过程、可变数组或允许用户自由申请和释放空间,那么,就需要采用动态存储管理技术。 2、两种动态存储分配方式 : 栈式,堆式 栈式动态存储分配 分配策略: 将整个程序的数据空间设计为一个栈。 【例】在具有 递归结构的语言程序中,每当调用一个过程时,它所需的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间 。 过程所需的数据空间包括两部分 一部分是生存期在本过程这次活动中的数据对象。如局部变量、参数单元、临时变量等; 另一部分则是用以管理过程活动的记录信息 (
25、连接数据 )。 活动记录( AR) 一个过程的一次执行所需要的信息使用一个连续的存储区来管理,这个区 (块 )叫做一个活动记录。 构成 1、临时工作单元; 2、局部变量; 3、机器状态信息; 4、存取链; 5、控制链; 6、实参; 7、返回地址 第十一章: 什么 是代码优化 所谓优化,就是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加快或占用存储空间减少。 优化原则: 等价原则:经过优化后不应改变程序运行的结果。 有效原则:使优化后所产生的目标代码运行时间较短,占用的存储空间较小。 合算原则:以尽可能低的代价取得较好的优化效果。 优化分类:局部优化,循环优化
26、,全局优化 常见的优化技术 (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 go
27、to 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,则称 ab 是流图中的一条回边。 循环 (依据回边判断 ) 1、给出一个回边 nd,定义这个边 的 (自然 )循环是 d 加上所有不经过 d 能到达 n 的结点; 2、
28、 d 是这个循环的首结点。 【 例 】 求出左图的所有回边。 【解答】 (1) 66 ,因为 D(6)=1,2,4,6, 所以 6 DOM 6,故 66 是回边; (2) 74 ,因为 D(7)=1,2,4,7, 所以 4 DOM 7,故 74 是回边; (3) 42 ,因为 D(4)=1,2,4, 所以 2 DOM 4,故 42 是回边。 容易看出,其它有向边都不是回边。 例二:求回边和循环 回 边 4 3 ( 3 DOM 4) 循环: 3,4,5,6,7,8,10 回边 7 4 ( 4 DOM 7 ) 循环: 4,5,6,7,8,10 回边 107 ( 7 DOM 10 ) 循环: 7,
29、8, 10 回边 8 3 ( 3 DOM 8) 循环: 3,4,5,6,7,8,10 1243576一、填空题(每空 2 分,共 20 分) 1编译程序首先要识别出源程序中每个 单词 ,然后再分析每个 句子 并翻译其意义。 2编译器常用的语法分析 方法 有 自底向上 和 自顶向下 两种。 3通常把编译过程分为分析前端与综合后端两大阶段。词法、语法和语义分析是对源程序的 分析 ,中间代码生成、代码优化与目标代码的生成则是对源程序的 综合 。 4 程序设计语言的发展带来了日渐多变的运行时存储管理方案,主要分为两大类,即 静态存储分配 方案和 动态存储分配 方案。 5对编译程序而言,输入数据是 源程
30、序 ,输出结果是 目标程序 。 1 计算机执行用高级语言编写的程序主要有两种途径: 解释 和 编译 。 2 扫描器是 词法 分析器 ,它接受输入的 源程序 ,对源程序进行 词法分析 并识别出一个个单词符号,其输 出结果是单词符号,供语法分析器使用。 3 自下而上分析法采用 移进 、归约、错误处理、 接受 等四种操作。 4 一个 LL( 1) 分析 程序需要用到 一张分析表 和 符号栈 。 5 后缀式 abc-/所代表的表达式是 a/(b-c)。 二、单项选择题(每小题 2分,共 20分) 1 词法分析器的输出结果是 _C。 A 单词的种别编码 B 单词在符号表中的位置 C 单词的种别编码和自身
31、值 D 单词自身值 2 正规式 M 1 和 M 2 等价是指 _C_。 A M1 和 M2 的状态数相等 B M1 和 M2 的有向边条数相等 C M1 和 M2 所识别的语言集相等 D M1 和 M2 状态数和有向边条数相等 3 文法 G: SxSx|y 所识别的语言是 _C_。 A xyx B (xyx)* C xnyxn(n0) D x*yx* 4 如果文法 G 是无二义的,则它的任何句子 _A_。 A最左推导和最右推导对应的语法树必定相同 B最左推导和最右推导对应的语法树可能不同 C最左推导和最右推导必定相同 D可能存 在两个不同的最左推导,但它们对应的语法树相同 5 构造编译程序应掌握 _D_。 A源程序 B目标语言 C 编译方法 D以上三项都是 6四元式之间的联系是通过 _B_实现的 。 A指示器 B临时变量 C符号表 D程序变量 7 表达式 (A B) (C D)的逆波兰表示为 _B_。 A AB CD B AB CD C AB CD D AB CD 8. 优化可生成 _D_的目标代码。 A运行时间较短 B占用存储空间较小 C运行时间短但占用内存空间大 D运行时间短且占用存储空间小 9 下列 _C_优化方法不是针对循环优化进行的。 A. 强度削弱 B删除归纳变量 C删除多余运算 D代码外提 10 编译程序使用 _B_区别标识符的作用域。