程序设计语言 编译原理(第三版)第9章解析

程序设计语言 编译原理(第三版)第9章解析
程序设计语言 编译原理(第三版)第9章解析

编译原理

致谢: 2005级周朝丽、丛志环、张云华、周娇、陈亮、陶锌、张世强等同学不仅对讲义的进一步完善提出了宝贵的意见和建议,而且提出的许多富有探讨性的问题,不仅令我进一步思考,同时也令讲义的许多内容进一步丰富,在此,本人、现在已经看到、未来将会看到该讲义的人对各位的“答疑解惑”表示由衷的谢意! 参考书目: 1.编译原理,Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman著,李建中,姜守旭译。机械工 业出版社,2003 Compilers Principles, Techniques, and Tools(英文版名字) 2.编译原理及实践,(美)Kenneth C. Louden著,冯博琴等译。机械工业出版社,2000 Compiler Construction: Principles and Practice (英文版名字) 3.编译原理习题与解析(第2版)/伍春香编著-.--北京:清华大学出版社,2006 4.编译原理=Compiling Principle/周经野,张继福主编-.--武汉:武汉理工大学出版社,2003 5.程序设计语言编译方法. 肖军模编著. 大连理工大学出版社,2000。 6.程序设计语言编译原理/陈火旺等编.--北京:国防工业出版社,1984 7.编译方法/金成植编.--北京:高等教育出版社,1984 8.编译原理/蒋立源主编.--西安:西北工业大学出版社,1993.8 9.编译原理和技术/陈意云, 马万里编译.--安徽:中国科学技术大学出版社,1989.12 10.编译原理及其习题解答/何炎祥...[等]编著-.--武汉:武汉大学出版社,2004。 11.形式语言与自动机理论 12.FORTRAN语言程序设计,谭浩强、田淑清编著,高等教育出版社,1987年5月。 13.PASCAL程序设计,郗曼丽编著,陕西科学技术出版社。 14.讲义的一些部分来源于互联网上的多种资源,其链接难以一一提供,在此,谨向大家 致以真诚地敬意和诚挚的谢意,感谢大家通过互联网提供的极为有益的帮助和指导。 1

蒋立源 编译原理第三版第二章 习题与答案(修改后)

第2章习题 2-1 设有字母表A1 ={a,b,c,…,z},A2 ={0,1,…,9},试回答下列问题: (1) 字母表A1上长度为2的符号串有多少个? (2) 集合A1A2含有多少个元素? (3) 列出集合A1(A1∪A2)*中的全部长度不大于3的符号串。 2-2 试分别构造产生下列语言的文法: (1){a n b n|n≥0}; (2){a n b m c p|n,m,p≥0}; (3){a n#b n|n≥0}∪{c n#d n|n≥0}; (4){w#w r# | w∈{0,1}*,w r是w的逆序排列 }; (5)任何不是以0打头的所有奇整数所组成的集合; (6)所有由偶数个0和偶数个1所组成的符号串的集合。 2-3 试描述由下列文法所产生的语言的特点: (1)S→10S0S→aA A→bA A→a (2)S→SS S→1A0A→1A0A→ε (3)S→1A S→B0A→1A A→C B→B0B→C C→1C0C→ε (4)S→aSS S→a 2-4 试证明文法 S→AB|DC A→aA|a B→bBc|bc C→cC|c D→aDb|ab 为二义性文法。 2-5 对于下列的文法 S→AB|c A→bA|a B→aSb|c 试给出句子bbaacb的最右推导,并指出各步直接推导所得句型的句柄;指出句子的全部短语。

2-6 化简下列各个文法 (1) S→aABS|bCACd A→bAB|cSA|cCC B→bAB|cSB C→cS|c (2) S→aAB|E A→dDA|e B→bE|f C→c AB|dSD|a D→eA E→fA|g (3) S→ac|bA A→c BC B→SA C→bC|d 2-7 消除下列文法中的ε-产生式 (1) S→aAS|b A→cS|ε (2) S→aAA A→bAc|dAe|ε 2-8 消除下列文法中的无用产生式和单产生式 (1) S→aB|BC A→aA|c|aDb B→DB|C C→b D→B (2) S→SA|SB|A A→B|(S)|( ) B→[S]|[ ] (3) E→E+T|T T→T*F|F F→P↑F|P P→(E)|i 第2章习题答案 2-1 答: (1) 26*26=676 (2) 26*10=260 (3) {a,b,c,...,z, a0,a1,...,a9, aa,...,az,...,zz, a00,a01,...,zzz},共有26+26*36+26*36*36=34658个 2-2 解: (1) 对应文法为G(S)=({S},{a,b},{ S→ε| aSb },S) (2) 对应文法为G(S)=({S,X,Y},{a,b,c},{S→aS|X,X→bX|Y,Y→cY|ε },S) (3)对应文法为G(S)=({S,X,Y},{a,b,c,d,#}, {S→X,S→Y,X→aXb|#, Y→cYd|# },S)

编译原理知识点汇总

编译原理的复习提纲 1.编译原理=形式语言+编译技术 2.汇编程序: 把汇编语言程序翻译成等价的机器语言程序 3.编译程序: 把高级语言程序翻译成等价的低级语言程序 4.解释执行方式: 解释程序,逐个语句地模拟执行 翻译执行方式: 翻译程序,把程序设计语言程序翻译成等价的目标程序 5.计算机程序的编译过程类似,一般分为五个阶段: 词法分析、语法分析、语义分析及中间代码生成、代码优化、目标代码生成 词法分析的任务: 扫描源程序的字符串,识别出的最小的语法单位(标识符或无正负号数等) 语法分析是: 在词法分析的基础上的,语法分析不考虑语义。语法分析读入词法分析程序识别出的符号,根据给定的语法规则,识别出各个语法结构。 语义分析的任务是检查程序语义的正确性,解释程序结构的含义,语义分析包括检查变量是否有定义,变量在使用前是否具有值,数值是否溢出等。

语法分析完成之后,编译程序通常就依据语言的语义规则,利用语法制导技术把源程序翻译成某种中间代码。所谓中间代码是一种定义明确、便于处理、独立于计算机硬件的记号系统,可以认为是一种抽象机的程序 代码优化的主要任务是对前一阶段产生的中间代码进行等价变换,以便产生速度快、空间小的目标代码 编译的最后一个阶段是目标代码生成,其主要任务是把中间代码翻译成特定的机器指令或汇编程序 编译程序结构包括五个基本功能模块和两个辅助模块 6.编译划分成前端和后端。 编译前端的工作包括词法分析、语法分析、语义分析。编译前端只依赖于源程序,独立于目标计算机。前端进行分析 编译后端的工作主要是目标代码的生成和优化后端进行综合。独立于源程序,完全依赖于目标机器和中间代码。 把编译程序分为前端和后端的优点是: 可以优化配置不同的编译程序组合,实现编译重用,保持语言与机器的独立性。 7.汇编器把汇编语言代码翻译成一个特定的机器指令序列 第二章 1.符号,字母表,符号串,符号串的长度计算P18,子符号串的含义,符号串的简单运算XY,Xn, 2.符号串集合的概念,符号串集合的乘积运算,方幂运算,闭包与正闭包的概念P19,P20A0 ={ε} 3.重写规则,简称规则。非xx(V

编译原理教程课西安电子科大出版社第三版后习题答案——第二章

第二章 词法分析 2.1 完成下列选择题: (1) 词法分析器的输出结果是 。 a. 单词的种别编码 b. 单词在符号表中的位置 c. 单词的种别编码和自身值 d. 单词自身值 (2) 正规式M1和M2等价是指 。 a. M1和M2的状态数相等 b. M1和M2的有向边条数相等 c. M1和M2所识别的语言集相等 d. M1和M2状态数和有向边条数相等 (3) DFA M(见图2-1)接受的字集为 。 a. 以0开头的二进制数组成的集合 b. 以0结尾的二进制数组成的集合 c. 含奇数个0的二进制数组成的集合 d. 含偶数个0的二进制数组成的集合 【解答】 (1) c (2) c (3) d 图2-1 习题2.1的DFA M 2.2 什么是扫描器?扫描器的功能是什么? 【解答】 扫描器就是词法分析器,它接受输入的源程序,对源程序进行词法分析并识别出一个个单词符号,其输出结果是单词符号,供语法分析器使用。通常是把词法分析器作为一个子程序,每当词法分析器需要一个单词符号时就调用这个子程序。每次调用时,词法分析器就从输入串中识别出一个单词符号交给语法分析器。 2.3 设M=({x,y}, {a,b}, f, x, {y})为一非确定的有限自动机,其中f 定义如下: f(x,a)={x,y} f{x,b}={y} f(y,a)=Φ f{y,b}={x,y} 试构造相应的确定有限自动机M ′。 【解答】 对照自动机的定义M=(S,Σ,f,So,Z),由f 的定义可知f(x,a)、f(y,b)均为多值函数,因此M 是一非确定有限自动机。 先画出NFA M 相应的状态图,如图2-2所示。 图2-2 习题2.3的NFA M 用子集法构造状态转换矩阵,如表 表2-1 状态转换矩阵 1b a

编译原理第二章-课后题答案

第二章 3.何谓“标志符”,何谓“名字”,两者的区别是什么? 答:标志符是一个没有意义的字符序列,而名字却有明确的意义和属性。 4.令+、*和↑代表加、乘和乘幂,按如下的非标准优先级和结合性质的约定,计算1+1*2↑2*1↑2的值。 (1)优先顺序(从高到低)为+、*和↑,同级优先采用左结合。 (2)优先顺序为↑、+、*,同级优先采用右结合。 答:(1)1+1*2↑2*1↑2=2*2↑2*1↑2=4↑2*1↑2=4↑2↑2=16↑2=256 (2)1+1*2↑2*1↑2=1+1*2↑2*1=1+1*4*1=2*4*1=2*4=8 6.令文法G6为 N-〉D|ND D-〉0|1|2|3|4|5|6|7|8|9 (1)G6的语言L(G6)是什么? (2)给出句子0127、34、568的最左推导和最右推导。 (1)由0到9的数字所组成的长度至少为1的字符串。即:L(G6)={d n|n≧1,d∈{0,1,…,9}} 答: (2)0127的最左推导:N=>ND=>NDD=>NDDD=>DDDD=>0DDD=>01DD=>012D=>0127 0127的最右推导:N=>ND=>N7=>ND7=>N27=>ND27=>N127=>D127=>0127 (其他略) 7.写一个文法,使其语言是奇数集,且每个奇数不以0开头。 答:G(S):S->+N|-N N->ABC|C C->1|3|5|7|9 A->C|2|4|6|8 B->BB|0|A|ε [注]:可以有其他答案。 [常见的错误]:N->2N+1 原因在于没有理解形式语言的表示法,而使用了数学表达式。 8.令文法为 E->T|E+T|E-T T->F|T*F|T/F F->(E)|i (1)给出i+i*i、i*(i+i)的最左推导和最右推导。 (2)给出i+i+i、i+i*i和i-i-i的语法树,并给出短语,简单短语和句柄。 答:(1) i*(i+i)的最左推导: E=>T=>T*F=>F*F=>i*F=>i*(E)=>i*(E+T)=>i*(T+T)=>i*(F+T)=>i*(i+T)=>i*(i+F)=> i*(i+i) i*(i+i)的最右推导: E=>T=>T*F=>T*(E) =>T*(E+T)=>T*(E+F)=>T*(E+i)=>T*(T+i)=>T*(F+i)=> T*(i+i)=> F*(i+i) => i*(i+i) (其他略) [注]:要牢记每一步都是对最左(右)的一个非终结符号进行一步推导。 (2) i+i+i的语法树:

编译原理教程课后习题答案——第六章

第六章运行时存储空间组织 6.1 完成下列选择题: (1) 过程的DISPLAY表中记录了。 a. 过程的连接数据 b. 过程的嵌套层次 c. 过程的返回地址 d. 过程的入口地址 (2) 过程P1调用P2时,连接数据不包含。 a. 嵌套层次显示表 b. 老SP c. 返回地址 d. 全局DISPLAY地址 (3) 堆式动态分配申请和释放存储空间遵守原则。 a. 先请先放 b. 先请后放 c. 后请先放 d. 任意 (4) 栈式动态分配与管理在过程返回时应做的工作有。 a. 保护SP b. 恢复SP c. 保护TOP d. 恢复TOP (5) 如果活动记录中没有DISPLAY表,则说明。 a. 程序中不允许有递归定义的过程 b. 程序中不允许有嵌套定义的过程 c. 程序中既不允许有嵌套定义的过程,也不允许有递归定义的过程 d. 程序中允许有递归定义的过程,也允许有嵌套定义的过程 【解答】 (1) b (2) a (3) d (4) b (5) b 6.2 何谓嵌套过程语言运行时的DISPLAY表?它的作用是什么? 【解答】当过程定义允许嵌套时,一个过程在运行中应能够引用在静态定义时包围它的任一外层过程所定义的变量或数组。也就是说,在栈式动态存储分配方式下的运行中,一个过程Q可能引用它的任一外层过程P的最新活动记录中的某些数据。因此,过程Q运行时必须知道它的所有(静态)外层过程的最新活动记录的地址。由于允许递归和可变数组,这些外层过程的活动记录的位置也往往是变迁的。因此,必须设法跟踪每个(静态)外层的最新活动记录的位置,而完成这一功能的就是DISPLAY嵌套层次显示表。 也即,每当进入一个过程后,在建立它的活动记录区的同时也建立一张DISPLAY表,它自顶而下每个单元依次存放着现行层、直接外层等,直至最外层(主程序层)等每一层过程的最新活动记录的起始地址。 6.3 (1) 写出实现一般递归过程的活动记录结构以及过程调用、过程进入与过程返回的指令; (2) 对以return(表达式)形式(这个表达式本身是一个递归调用)返回函数值的特殊函数过程,给出不增加时间开销但能节省存储空间的实现方法。假定语言中过程参数只有传值和传地址两种形式,为便于理解,举下例说明这种特殊的函数调用: int gcd (int p,int q) { if (p % q ==0) return q; else return gcd (q, p % q) } 【解答】(1) 一般递归过程的活动记录如图6-1所示。

编译原理 第二章习题答案

第2章习题解答 1.文法G[S]为: S->Ac|aB A->ab B->bc 写出L(G[S])的全部元素。 [答案] S=>Ac=>abc 或S=>aB=>abc 所以L(G[S])={abc} ============================================== 2. 文法G[N]为: N->D|ND D->0|1|2|3|4|5|6|7|8|9 G[N]的语言是什么? [答案] G[N]的语言是V+。V={0,1,2,3,4,5,6,7,8,9} N=>ND=>NDD.... =>NDDDD...D=>D......D =============================================== 3.已知文法G[S]: S→dAB A→aA|a B→ε|bB 问:相应的正规式是什么?G[S]能否改写成为等价的正规文法?[答案] 正规式是daa*b*;

相应的正规文法为(由自动机化简来): G[S]:S→dA A→a|aB B→aB|a|b|bC C→bC|b 也可为(观察得来):G[S]:S→dA A→a|aA|aB B→bB|ε ===================================================================== ========== 4.已知文法G[Z]: Z->aZb|ab 写出L(G[Z])的全部元素。 [答案] Z=>aZb=>aaZbb=>aaa..Z...bbb=> aaa..ab...bbb L(G[Z])={a n b n|n>=1} ===================================================================== ========= 5.给出语言{a n b n c m|n>=1,m>=0}的上下文无关文法。 [分析] 本题难度不大,主要是考上下文无关文法的基本概念。上下文无关文法的基本定义是:A->β,A∈Vn,β∈(Vn∪Vt)*,注意关键问题是保证a n b n的成立,即“a与b的个数要相等”,为此,可以用一条形如A->aAb|ab的产生式即可解决。 [答案] 构造上下文无关文法如下: S->AB|A A->aAb|ab B->Bc|c [扩展]

编译原理第三版课后答案

编译原理课后题答案 第二章 P36-6 (1) L G () 1是0~9组成的数字串 (2) 最左推导: 最右推导: P36-7 G(S) P36-8 文法: 最左推导: 最右推导: 语法树:/******************************** *****************/ P36-9 句子iiiei有两个语法树: P36-10 /************** ***************/ P36-11 /*************** L1: L2: L3: L4: ***************/ 第三章习题参考答案P64–7 (1)

最小化: P64–8 (1) (2) (3) P64–12 (a) a a,b a 0

给状态编号: a a a b b b 最小化: a a b b a b (b) 已经确定化了, 进行最小化 最小化: P64 –14 (1) 0 1 0 (2): (|)*010 1 εε 0 0 0 Y Y

最小化: 0 1 1 1 0 0 第四章 P81–1 (1) 按照T,S 的顺序消除左递归 递归子程序: procedure S; begin if sym='a' or sym='^' then abvance else if sym='(' then begin advance;T; if sym=')' then advance; else error; end else error end; procedure T; begin S; T end;

procedure 'T; begin if sym=',' then begin advance; S;'T end end; 其中: sym:是输入串指针IP所指的符号advance:是把IP调至下一个输入符号error:是出错诊察程序 (2) FIRST(S)={a,^,(} FIRST(T)={a,^,(} FIRST('T)={,,ε} FOLLOW(S)={),,,#} FOLLOW(T)={)} FOLLOW('T)={)} 预测分析表 是LL(1)文法 P81–2 文法: (1) FIRST(E)={(,a,b,^} FIRST(E')={+,ε} FIRST(T)={(,a,b,^} FIRST(T')={(,a,b,^,ε} FIRST(F)={(,a,b,^} FIRST(F')={*,ε} FIRST(P)={(,a,b,^} FOLLOW(E)={#,)} FOLLOW(E')={#,)} FOLLOW(T)={+,),#} FOLLOW(T')={+,),#} FOLLOW(F)={(,a,b,^,+,),#} FOLLOW(F')={(,a,b,^,+,),#} FOLLOW(P)={*,(,a,b,^,+,),#} (2)

编译原理论文

《编译原理》课程论文 编译程序是现代计算机系统的基本组成部分之一,而且多数计算机系统都配有不止一个高级语言的编译程序,对有些高级语言甚至配置了几个不同性能的编译程序。从功能上讲,一个编译程序就是一个语言翻译程序。语言翻译程序把一种源语言书写的程序翻译成另一种目标语言的等价程序,所以总的说编译程序是一种翻译程序,其源程序是高级语言,目标语言程序是低级语言。 编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。从概念上来讲,一个编译程序的整个工作过程是划分成几个阶段进行的,每个阶段将源程序的一种表示形式转换成另一种表示形式,各个阶段进行的操作在逻辑上是紧密连接在一起的。一般一个编译过程是词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成。 编写编译器的原理和技术具有十分普遍的意义,以至于在每个计算机工作者的职业生涯中,本书中的原理和技术都会反复用到。在这本书中,向我们介绍了文法的概念,在讲词法分析的章节中讲述了构造一个有穷自动机的方法,以及如何将一个不确定的有穷自动机转化成确定的有穷自动机和有穷自动机的最小化等方法。 词法分析相对来说比较简单。可能是词法分析程序本身实现起来很简单吧,很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。不过编译原理在讲解词法分析的时候,重点把正则表达式和自动机原理加了进来,然后以一种十分标准的方式来讲解词法分析程序的产生。这样的做法道理很明显,就是要让词法分析从程序上升到理论的地步。 词法分析中的重点是有穷自动机DFA的生成以及DFA和正规式与正规文法的关系。还要熟练掌握NFA转换为DFA的方法及DFA的化简。 词法分析的核心应该是构建DFA,最后维护一个状态转移表。通过转态转移的结果来识别词性。DFA的思想和字典树很像。NFA通过求每个状态的闭包后构造出的自动机与DFA等价。正则表达式闭包,连接,或三种操作都有相应的NFA与其等价。所以正则表达式==NFA==DFA。DFA状态最小化算法化简DFA。LL(1)文法主要就是根据FIRST集判断向哪条路径走,来避免回溯;LR(0)文法构造项

编译原理 龙书 第二版 第4章

第四章 习题4.2.1:考虑上下文无关文法: S->S S +|S S *|a 以及串aa + a* (1)给出这个串的一个最左推导 S -> S S * -> S S + S * -> a S + S * -> a a + S * -> aa + a* (3)给出这个串的一棵语法分析树 习题4.3.1:下面是一个只包含符号a和b的正则表达式的文法。它使用+替代表示并运算的符号|,以避免和文法中作为元符号使用的竖线相混淆: rexpr→ rexpr + rterm | rterm rterm→rterm rfactor | rfactor rfactor→ rfactor * | rprimary rprimary→a | b 1)对这个文法提取公因子 2)提取公因子的变换使这个文法适用于自顶向下的语法分析技术吗? 3)提取公因子之后,原文法中消除左递归 4)得到的文法适用于自顶向下的语法分析吗? 解 1)提取左公因子之后的文法变为 rexpr→ rexpr + rterm | rterm rterm→rterm rfactor | rfactor rfactor→ rfactor * | rprimary rprimary→a | b 2)不可以,文法中存在左递归,而自顶向下技术不适合左递归文法 3)消除左递归后的文法

rexpr -> rterm rexpr’ rexpr’-> + rterm rexpr’|ε rterm-> rfactor rterm’ rterm’-> rfactor rterm’|ε rfactor-> rprimay rfactor’ rfactor’-> *rfactor’|ε rprimary-> a | b 4)该文法无左递归,适合于自顶向下的语法分析 习题4.4.1:为下面的每一个文法设计一个预测分析器,并给出预测分析表。可能要先对文法进行提取左公因子或消除左递归 (3)S->S(S)S|ε (5)S->(L)|a L->L,S|S 解 (3) ①消除该文法的左递归后得到文法 S->S’ S’->(S)SS’|ε ②计算FIRST和FOLLOW集合 FIRST(S)={(,ε} FOLLOW(S)={),$} FIRST(S’)={(,ε} FOLLOW(S’)={),$} ③ (5) ①消除该文法的左递归得到文法 S->(L)|a

编译原理第二版课后习问题详解

《编译原理》课后习题答案第一章 第 1 章引论 第 1 题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2)源程序:源语言编写的程序称为源程序。 (3)目标程序:目标语言书写的程序称为目标程序。 (4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。

第 2 题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程 序的总体结构图。 答案: 一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。 中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式 的中间语言代码,如三元式或四元式。 中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。 目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。 表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的 各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序具有的表格管理功能。 错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源 程序中的错误时,错误处理程序负责报告出错的位置和错误性质等信息,同时对发现的错误

编译原理 第一、二章测验(答案)

编译原理 第一、二章单元测验(答案) 姓名 学号 班级 一.填空(40分) 1. 编译系统一般可以分为① 词法分析 ② 语法分析 ③语义分析及中间代码生成 ④ 优化处理 ⑤ 目标代码生成 等5大部分组成,其中① 词法分析 ② 语法分析 ⑤ 目标代码生成 是每个编译程序必不可少的,而③语义分析及中间代码生成 ④ 优化处理 则是可有可无的。这5个部分在工作过程中都会涉及到⑥ 表格处理 ⑦ 出错处理 2. 中间代码生成所依据的是语言的 语义 规则 3. 在使用高级语言编程时,首先可以通过编译程序发现源程序的全部 语法 错误和 语义 错误。 4. 由于受到具体机器主存容量限制,编译程序几个阶段的工作往往被组合成 遍 。 5. 编译程序绝大多数时间花在 管理表格/扫描 上。 6. 语法分析的依据是 语法/语义 规则。 7. 高级语言源程序执行有两种方式:即 编译 和 解释 。 8. 编译程序各阶段的工作往往是 穿插 进行的。 9. 文法G 产生的 句子 的全体构成该文法所描述的语言。 10. 乔姆斯基定义的4种形式的文法中,0型又称 短语结构文法 可由 图灵机 识别, 1型又称 前后文(或上下文)有关文法 可由 线性限界自动机 识别,2型又称 前后文(或上下文)无关文法 可由 非确定下推自动机 识别,3型包括 左线性文法 和 右线性文法 ,可由 有限自动机 识别。 11. 最左推导是指 对于一个推导序列中的每个直接推导,被替换的总是当前符号串中的最左非终结符号。 12. 产生式是用于定义 语法范畴 的一种书写规则。 13. 高级语言经过编译生成的语言一般是 机器语言 和 汇编语言 。 14. 句柄是指当前句型的 最左直接短语 。 15. 简单地说,文法中无用符号和无用产生式的删除必须满足:1.是否被用到过 2. 可否推出终结符号 。 16. 规范推导是指 最右推导 , 规范归约是指 最左归约 ,二者互为逆过程。 二.写一个语言,使其语言是奇数集,且每个奇数不以0开头。 (20分) 解法1: G = ({S,A},{0,1,2,3,4,5,6,7,8,9},P,S) P: S →d 1A ∣d 3 A →d 2A ∣d 3 d 1代表1-9的数字,d 2代表0-9的数字, d 3代表1,3,5,7,9中的任意一个。 解法2:G = ( {N,A,B,C,D},{0,1,2,3,4,5,6,7,8,9},P,S) P: N →AB ∣B A →AC ∣D B →1∣3∣5∣7∣9 D →2∣4∣6∣8∣B C →0∣D 三.证明下列文法是二义性文法: S →iSeS ∣iS ∣i (20分) 解:1. 不同最左(右)推导推导出相同的符号串 2. 对同一符号串有两颗不同语法树 (答案多样化) 四.写出下面语言的上下文无关文法: }0,1{1≥≥=i n c b a L i n n (20分) 解: 1. G1:N →S ∣SA S →aSb ∣ab A →c ∣Ac (或者A →c ∣cA ) 2. G1:N →S ∣SA S →aSb ∣ab A →Ac ∣ε(或者A →cA ∣ε) 再消除ε,得到 答案1

编译原理第二版作业答案_第2章

第二章 文法和语言 p48 4、6(6)、11、 12(2)(6)、18(2) 4 证明文法G=({E,O},{(,),+,*,v ,d},P ,E )是二义的,其中P 为 E → EOE | (E) | v | d O → + | * 证明: 因为E=〉 EOE =〉EOEOE =〉EOEOv =〉EOE+v =〉EOv+v =〉E*v+v =〉v*v+v , 句子v*v+v 有两棵不同的语法树 所以文法G 是二义的。 问题:1)只有文字说明,比如v*v+v 有两棵语法树,但没有画出语法树或者最左(最右)推导过程 2)给出的是不同句子(v*v+d v+v*d )的语法树 6、已知文法G : E E E E O O v * v + v E E E E O O v + v * v

〈表达式〉∷=〈项〉|〈表达式〉+〈项〉 〈项〉∷=〈因子〉|〈项〉*〈因子〉 〈因子〉∷=(〈表达式〉)| i 试给出下述表达式的推导及语法树 (6)i+i*i 推导过程: 〈表达式〉=〉〈表达式〉+〈项〉E=〉E+T =〉〈表达式〉+〈项〉*〈因子〉=〉E+ T*F =〉〈表达式〉+〈项〉* i =〉E+ T*i =〉〈表达式〉+ 〈因子〉* i =〉E+F*i =〉〈表达式〉+ i* i =〉E+i*i =〉〈项〉+ i* i =〉T +i*i =〉〈因子〉+ i* i =〉F +i*i =〉i +i*i =〉i +i*i 共8步推导 语法树: 〈表达式〉 + 〈因子〉〈项〉 i 〈因子〉 i 〈项〉 〈项〉 〈因子〉 i *

11、一个上下文无关文法生成句子abbaa的推导树如下: (1)给出该句子相应的最左推导和最右推导 (2)该文法的产生式集合P可能有哪些元素? (3)找出该句子的所有短语、简单短语、句柄。 (1)最左推导: S=〉ABS=〉aBS=〉aSBBS=〉aBBS =〉abBS=〉abbS =〉abbAa=〉abbaa 最右推导: S =〉ABS=〉ABAa=〉ABaa=〉ASBBaa =〉ASBbaa=〉ASbbaa=〉Abbaa=〉abbaa (2)该文法的产生式集合P可能有下列元素: S→ABS | Aa|εA→a B→SBB|b

编译原理 形式语言题+答案

第2章形式语言 1.试分别构造产生下列语言的文法: (1){a n#b n|n≥0}∪{c n#d n|n≥0}; (2)任何不是以0打头的所有奇整数所组成的集合。 答:(1) 对应文法为G(S)=({S,X,Y},{a,b,c,d,#}, {S→X, S→Y, X→aXb|#, Y→cYd|# },S) (2) G(S)=({S,A,B,I,J},{0,1,2,3,4,5,6,7,8,9}, {S→J|IBJ, B→0B|IB|ε, I→J|2|4|6|8, J→1|3|5|7|9},S) 2.对于下列的文法 S→AB|c A→bA|a B→aSb|c 试给出句子bbaacb的最右推导。 答:S=>AB=>AaSb=> Aacb=>bAacb=>bbAacb=>bbaacb 3.已知文法G[S]: S->(AS)|(b) A->(SaA)|(a) 请找出符号串(a)和(A((SaA)(b)))的短语、简单短语和句柄。 答: 因为S 不能? (a), 所以(a)不是文法的句型。没有短语、直接短语和句柄。 因为S ?(AS) ?(A(AS)) ?(A((SaA)S)) ?(A((SaA)(b))),所以(A((SaA)(b)))是文法的句型。

短语:(A((SaA)(b))),((SaA)(b)),(SaA),(b) 直接短语:(SaA),(b) 句柄:(SaA) S ( A S ) ( A S ) ( S a A ) ( b ) 4.试描述由下列文法所产生的语言的特点: (1)S→10S0 S→aA A→bA A→a (2)S→aSS S→a 答:(1) 本文法构成的语言集为:L(G)={(10)n ab m a0n|n,m≥0}。 (2)由L(G)={a2n-1|n≥1}可知,该语言特点是:产生的句子是奇数个a。 附加题:试证明文法 S→AB|DC A→aA|a B→bBc|bc C→cC|c D→aDb|ab 为二义性文法。 答:因为存在句子:abc,它对应两个最右推导: S ? AB ? Abc ? abc S ? DC ? Dc ? abc 所以,本文法具有二义性。

《编译原理》单元测试第三章试题

编译原理 2014—2015学年第二学期第三单元测试试卷 (闭卷考试)时间:45分钟。 姓名班级出题人刘兵班级(满分100分) 一、选择题(5*2分)(每题1分,共10分) 1.下述正规表达式中_____与(a*+b)*(c+d)等价。 A.a*(c+d)+b(c+d) B.a*(c+d)*+b(c+d)* C.a*(c+d)b*(c+d) D.(a+b)*c+(a+b)*d 2.词法分析器的输出结果是() A.单词的种别编码 B.单词在符号表中的位置 C.单词的种别编码和自身值 D.单词自身值 3.正规式M1和M2等价是指() A.M1和M2状态数相等 B.M1和M2有向边条数相等 C.M1和M2所识别的语言集相等 D. M1和M2状态数和有向边条数相等 4. DFA M(见图1)接受的字集为。 a. 以0开头的二进制数组成的集合 b. 以0结尾的二进制数组成的集合 c. 含奇数个0的二进制数组成的集合 d. 含偶数个0的二进制数组成的集合 图1 5.在下列正规表达式中,_______描述了字母表{a,b}上长度不为3的符号串 A.ε|0|1|00|01|10|11|(0|1)(0|1)+ B.ε|0|1(00|01|10|11)+(0|1)* C.ε|0|1(00|01|10|11)* D.没有一个

二、简答题(2*10分)(每题10分,共20分) 1.什么是扫描器?扫描器的功能是什么? 2. 给定如图2所示的有穷自动机,试用正规表达式给出它能接受的语言集合。 三、分析题(4题共70分) 1.化简下面文法: G[S] :S->Bab|cC B->b|bS C->Da D->Cb|CDa

编译原理所有名词解释

编译程序是一种程序,它把高级语言编写的源程序翻译成与之在逻辑上等价的机器语言或汇 编语言的目标程序。 一个高级语言程序的执行通常分为两个阶段,即编译阶段和运行阶段。如果编译生成的目标 程序是汇编语言形式,那么在编译与运行阶段之间还要添加一个汇编阶段。 解释程序也是一种翻译程序,它将源程序作为输入,一条语句一条语句地读入并解释执行。 解释程序与编译程序的主要区别是:编译程序是将源程序翻译成目标程序后再执行该目标程 序,而解释程序则是逐条读出源程序中的语句并解释执行,即在解释程序的执行过程中并不 源程序 产生目标程序。 析阶段、语义分析和中间代码生成阶段、优化阶段和目 标代码生成阶段。词法分析的任务是对构成源程序的字 符串进行扫描和分解,根据语言的词法规则识别出一个 个具有独立意义的单词;语法分析的任务是在词法分析 的基础上,根据语言的语法规则(文法规则)从单词符 号串中识别出各种语法单位并进行语法检查;语义分析 和中间代码生成阶段的任务是首先对每种语法单位进行 静态语义检查,然后分析其含义,并用另一种语言形式 来描述这种语义即生成中间代码;优化的任务是对前阶 段产生的中间代码进行等价变换或改造,以期获得更为 高效(节省时间和空间)的目标代码; 的任务是把中间代码(或经优化处、理之后)变换成特编译程序结构示意图 定机器上的机器语言程序或汇编语言程序,实现最终的翻译工作。 形式化的方法:用一整套带有严格规定的符号体系来描述问题的方法。 标识符:以字母打头的字母数字串 字母表:是元素的非空有穷集合。 字符:字母表中的元素称为符号,或称为字符。可以是字母、数字和其他符号。 符号串的运算:符号串的连接、集合的乘积、符号串的幂运算、集合的幂运算、集合A的 正闭包A+与闭包A* 形式语言:字母表上所有的字符按照某种规则所组成的集合。 句子:均对应与字母表中的符号串。 文法:是规则的非空有穷集合(描述语言的文法不唯一) 文法四元组:G[S]=(V N,V T,P,S) V N :非终结符集V T:终结符集(V N ^ V T=空集) P:产生式集S:文法的开始符号 直接推导:在推导过程中只使用了一个产生式。 推导:经一步到多步推导出结果。(推导:用产生式的右部取代其左部的过程规约:用产 生式的左部取代其右部的过程) 广义推导:经0步到多步推导出结果。 句型:S经0步到多步推导出x且x属于V*(V是V N V T的并集),则x是该文法的一个句型。句子:S经0步到多步推导出x且x属于V T*,则x是该文法的一个句子。句子是一种句型语言:文法G[S]产生的所有句子的集合称为文法G所定义的语言,记为L(G[S]):L(G[S])={x|S经一步到多步推导出x且x属于V T*} (文法给定,则语言确定) 最左(右)推导:每步推导都坚持替换当前句型最左(右)边的非终结符。(最右推导也称 规范推导。用规范推导推导出的句型称为规范句型。其逆过程是最左规约,也成为规范规约) 递归规则(产生式递归):是指在规则的左部和右部具有相同非终结符的规则。

编译原理 第二版 第三章课后答案

第三章作业 第三章作业答案P47 练习 1、文法G=({A,B,S},{a,b,c},P,S),其中P为: S->Ac|aB A->ab B->bc 写出L(G [S])的全部元素。 S=>Ac=>abc 或S=>aB=>abc 所以L(G[S])={abc} 2、文法G[N]为: N->D|ND D->0|1|2|3|4|5|6|7|8|9 G[N]的语言是什么? 【解】 N=>ND=>NDD.... =>NDDDD...D=>D......D G[N]的语言是V+。V={0,1,2,3,4,5,6,7,8,9} 或: 解: N ND n-1 D n {0,1,3,4,5,6,7,8,9}+ ∴L(G[N])= {0,1,3,4,5,6,7,8,9}+ 5.写一文法,使其语言是偶正数的集合。 要求: (1)允许0打头 (2)不允许0打头 【解】 (1)允许0开头的偶正整数集合的文法 E->NT|G|SFM T->NT|G N->D|1|3|5|7|9 D->0|G G->2|4|6|8 S->NS|ε F->1|3|5|7|9|G M->M0|0 (2)不允许0开头的偶正整数集合的文法 E->NT|D

T->FT|G N->D|1|3|5|7|9 D->2|4|6|8 F->N|0 G->D|0 9.考虑下面上下文无关文法: S→SS*|SS+|a (1) 表明通过此文法如何生成串aa+a*,并为该串构造推导树。 (2) 该文法生成的语言是什么? 【解】 (1) S=>SS* =>SS+S* aa+a* 该串的推导树如下: (2) 该文法生成的语言是只含+、*的算术表达式的逆波兰表示。 11.令文法G[E]为: E→T|E+T|E-T T→F|T*F|T/F F→(E)|i 证明E+T*F是它的一个句型,指出这个句型的所有短语、直接短语和句柄。【解】∵E=>E+T=>E+T*F ∴E+T*F是文法G[E]的一个句型

第11章 功课及习题参考答案

编译原理作业参考答案 - 1 - 第11章 (8分)将下面程序划分为基本块,并画出其基本块程序流图。(1) if a

- 2 - :编译原理作业参考答案 (4) 找出每个循环中的归纳变量,并且在可能的地方删除它们 图11.22 void quicksort(m,n) int m,n; { int i,j; int v,x; if (n<=m) return; /* fragment begins here */ i = m-1; j = n; v = a[n]; while(1) { do i = i+1;while (a[i]v); if (i>=j) break; x = a[i]; a[i] = a[j]; a[j] = x; } x = a[i]; a[i] = a[n]; a[n] = x; /* fragment ends here */ quicksort (m,j); quicksort(i+1,n); } 图11.23 (1) i:=m-1 (2) j:=n (3) t1:=4*n (4) v:=a[t1] (5) i:=i+1 (6) t2:=4*i (7) t3:=a[t2] (8) if t3< v goto (5) (9) j:=j-1 (10) t4:=4*j (11) t5:=a[t4](16) t7:=4*i (17) t8:=4*j (18) t9:=a[t8] (19) a[t7]:=t9 (20) t10:=4*j (21) a[t10]:=x (22) goto (5) (23) t11:=4*i (24) x:=a[t11] (25) t12:=4*i (26) t13:=4*n

相关文档
最新文档