第1章编译原理概述

第1章编译原理概述
第1章编译原理概述

第1章编译原理概述

【教学目的】了解编译程序的概念、编译的过程、编译程序的结构、编译程序的生成过程和构造工具。

【教学内容】正确了解什么是编译程序,了解编译程序工作的基本过程及各阶段的基本任务,熟悉编译程序总体框架结构。

【教学重点】编译程序的概念,编译程序工作的基本过程及各阶段的基本任务,熟悉编译程序总体框架结构。

【教学难点】编译过程和编译程序的结构。

【教学方法与手段】板书

【课时分配】2学时

【教学过程】

编译原理第一章习题解答(可编辑修改word版)

第一章习题解答 2.编译程序有哪些主要构成成分?各自的主要功能是什么? 编译程序的主要构成成分有:词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、表格管理程序及出错处理程序。 (1)词法分析程序:从左到右扫描源程序,识别单词及其有关属性; (2)语法分析程序:分析源程序的结构, 判别它是否为相应程序设计语言中的一个合法程序; (3)语义分析程序:审查源程序有无语义错误,为代码生成阶段收集类型信息; (4)中间代码生成程序:将源程序变成一种内部表示形式; (5)代码优化程序:对前阶段产生的中间代码进行变换或进行改造,使生成的目标代码更为高效; (6)目标代码生成程序:把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码; (7)表格管理程序:保存编译过程中的各种信息; (8)出错处理程序:若编译过程中发现源程序存在错误,则报告错误的性质和错误发生的地点,有些还可以自动校正错误。 3.什么是解释程序?它与编译程序的主要不同是什么? 解释程序接受某个语言的程序并立即运行这个源程序。它的工作模式是一个个的获取、分析并执行源程序语句,一旦第一个语句分析结束,源程序便开始运行并且生成结果,它特别适合程序员交互方式的工作情况。 而编译程序是一个语言处理程序,它把一个高级语言程序翻译成某个机器的汇编或二进制代码程序,这个二进制代码程序再机器上运行以生成结果。 它们的主要不同在于:解释程序是边解释边执行,解释程序运行结束即可得到该程序的运行结果,而编译程序只是把源程序翻译成汇编或者二进制程序,这个程序再执行才能得到程序的运行结果。(当然还有其他不同,比如存储组织方式不同)

编译原理第1章

第一章编译概述 2.典型的编译程序可划分为几部分?各部分的主要功能是什么?每部分都是必不可少的吗? 答:编译程序主要由词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、信息表管理程序、错误检查处理程序组成。 各部分的主要功能如下: 词法分析程序又称扫描器。进行词法分析时,依次读入源程序中的每个字符,依据语言的构词规则,识别出一个个具有独立意义的最小语法单元,即“单词”,并用某个单词符号来表示每个单词的词性是标识符、分界符还是数; 语法分析程序的功能是:对词法分析的结果,根据语言规则,将一个个单词符号组成语言的各种语法类; 语义分析的功能是确定源程序的语义是否正确; 中间代码生成程序的功能是将源程序生成一种更易于产生、易于翻译成目标程序的中间代码; 代码优化程序的功能是将中间代码中重复和冗余部分进行优化,提高目标程序的执行效率; 目标代码生成程序的功能是将中间代码生成特定机器上的机器语言代码; 符号表管理程序的功能是记录源程序中出现的标识符,并收集每个标识符的各种属性信息; 错误处理程序的功能是应对在编译各个阶段中出现的错误做适当的处理,从而使编译能够继续进行。 编译程序的每部分都是必不可少的。 3.解释方式和编译方式的区别是什么? 答:解释方式最终并不生成目标程序,这是编译方式与解释方式的根本区别。解释方式很适合于程序调试,易于查错,在程序执行中可以修改程序,但与编译方式相比,执行效率太低。 4.论述多遍扫描编译程序的优缺点? 答:优点:(1)可以减少内存容量的需求,分遍后,以遍为单位分别调用编译的各个子程序,各遍程序可以相互覆盖;(2)可使各遍的编译程序相互独立,结构清晰;(3)能够进行充分的优化,产生高质量的目标程序;(4)可将编译程序分为“前端”和“后端”,有利于编译程序的移植。 缺点是每遍都要读符号、送符号,增加了许多重复性工作,降低了编译效率。

编译原理 第一章 习题解答

第一章习题解答 2.编译程序有哪些主要构成成分?各自的主要功能是什么? 编译程序的主要构成成分有:词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序、表格管理程序及出错处理程序。 (1)词法分析程序:从左到右扫描源程序,识别单词及其有关属性; (2)语法分析程序:分析源程序的结构, 判别它是否为相应程序设计语言中的一个合法程序; (3)语义分析程序:审查源程序有无语义错误,为代码生成阶段收集类型信息; (4)中间代码生成程序:将源程序变成一种内部表示形式; (5)代码优化程序:对前阶段产生的中间代码进行变换或进行改造,使生成的目标代码更为高效; (6)目标代码生成程序:把中间代码变换成特定机器上的绝对指令代码或可重定位的指令代码或汇编指令代码; (7)表格管理程序:保存编译过程中的各种信息; (8)出错处理程序:若编译过程中发现源程序存在错误,则报告错误的性质和错误发生的地点,有些还可以自动校正错误。 3.什么是解释程序?它与编译程序的主要不同是什么? 解释程序接受某个语言的程序并立即运行这个源程序。它的工作模式是一个个的获取、分析并执行源程序语句,一旦第一个语句分析结束,源程序便开始运行并且生成结果,它特别适合程序员交互方式的工作情况。 而编译程序是一个语言处理程序,它把一个高级语言程序翻译成某个机器的汇编或二进制代码程序,这个二进制代码程序再机器上运行以生成结果。 它们的主要不同在于:解释程序是边解释边执行,解释程序运行结束即可得到该程序的运行结果,而编译程序只是把源程序翻译成汇编或者二进制程序,这个程序再执行才能得到程序的运行结果。(当然还有其他不同,比如存储组织方式不同)

编译原理习题及答案(整理后)

第一章 1、将编译程序分成若干个“遍”是为了。 b.使程序的结构更加清晰 2、构造编译程序应掌握。 a.源程序b.目标语言 c.编译方法 3、变量应当。 c.既持有左值又持有右值 4、编译程序绝大多数时间花在上。 d.管理表格 5、不可能是目标代码。 d.中间代码 6、使用可以定义一个程序的意义。 a.语义规则 7、词法分析器的输入是。 b.源程序 8、中间代码生成时所遵循的是- 。 c.语义规则 9、编译程序是对。 d.高级语言的翻译 10、语法分析应遵循。 c.构词规则 二、多项选择题 1、编译程序各阶段的工作都涉及到。 b.表格管理c.出错处理 2、编译程序工作时,通常有阶段。 a.词法分析b.语法分析c.中间代码生成e.目标代码生成 三、填空题 1、解释程序和编译程序的区别在于是否生成目标程序。 2、编译过程通常可分为5个阶段,分别是词法分析、语法分析中间代码生成、代码优化和目标代码生成。 3、编译程序工作过程中,第一段输入是源程序,最后阶段的输出为标代码生成程序。 4、编译程序是指将源程序程序翻译成目标语言程序的程序。

一、单项选择题 1、文法G:S→xSx|y所识别的语言是。 a. xyx b. (xyx)* c. x n yx n(n≥0) d. x*yx* 2、文法G描述的语言L(G)是指。 a. L(G)={α|S+?α , α∈V T*} b. L(G)={α|S*?α, α∈V T*} c. L(G)={α|S*?α,α∈(V T∪V N*)} d. L(G)={α|S+?α, α∈(V T∪V N*)} 3、有限状态自动机能识别。 a. 上下文无关文法 b. 上下文有关文法 c.正规文法 d. 短语文法 4、设G为算符优先文法,G的任意终结符对a、b有以下关系成立。 a. 若f(a)>g(b),则a>b b.若f(a)

编译原理第二版课后习答案

《编译原理》课后习题答案第一章 第 1 章引论 第 1 题 解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 答案: (1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。 (2)源程序:源语言编写的程序称为源程序。 (3)目标程序:目标语言书写的程序称为目标程序。 (4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶 段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符 号表管理等工作。 (5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。 (6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。 第 2 题 一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程 序的总体结构图。 答案: 一个典型的编译程序通常包含 8 个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。其各部分的主要功能简述如下。 词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机表达形式。 语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。 语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。 中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式 的中间语言代码,如三元式或四元式。 中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。 目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。 表格管理程序:负责建立、填写和查找等一系列表格工作。表格的作用是记录源程序的 各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。可以说整个编译过程就是造表、查表的工作过程。需要指出的是,这里的“表格管理程序”并不意味着它就是一个独立的表格管理模块,而是指编译程序具有的表格管理功能。 错误处理程序:处理和校正源程序中存在的词法、语法和语义错误。当编译程序发现源

编译原理第一章练习和答案

例1设有文法G[S]: S →a|(T )| T →T,S|S (1) 试给出句子(a,a,a)的最左推导。 (2) 试给出句子(a,a,a)的分析树 (3) 试给出句子(a,a,a)的最右推导和最右推导的逆过程(即最左规约)的每一步的句柄。 【解】(1) (a,a,a)的最左推导 S=>(T) =>(T,S) =>( T,S,S) =>( S,S,S) =>(a,S,S) =>(a,a,S) =>(a,a,a) (2)(a,a,a)的分析树 S ( T ) T , S S a T , S a (3) (a,a,a)最右推导 最左规约每一步的句柄 S=>(T) 句柄为:(T) =>(T,S) 句柄为:T,S =>(T,a) 句柄为:a =>(T,S,a) 句柄为:T,S =>(T,a,a) 句柄为:第一个a =>(S,a,a) 句柄为:S =>(a,a,a) 句柄为:第一个a 例2已知文法G[Z]: Z →0U|1V U →1Z|1 V →0Z|0 (1) 请写出此文法描述的只含有4个符号的全部句子。 (2) G [Z]产生的语言是什么? (3) 该文法在Chomsky 文法分类中属于几型文法? 【解】(1)0101,0110,1010, 1001 (2)分析G[Z]所推导出的句子的特点:由Z 开始的推导不外乎图1所示的四种情形。 图 1文法G[Z]可能的几种推导 Z 1 U Z U Z 1 Z 1 V Z 1 V 由Z 推导出10或01后就终止或进入递归,而Z 的每次递归将推导出相同的符号串:10或

01。所以

G[Z]产生的语言L(G[Z])={x|x∈(10|01)+ } (3)该文法属于3型文法。 例3 已知文法G=({A,B,C},{a,b,c},P,A), P由以下产生式组成: A→abc A→aBbc Bb→bB Bc→Cbcc bC→Cb aC→aaB aC→aa 此文法所表示的语言是什么? 【解】 分析文法的规则: 每使用一次Bc→Cbcc,b、c的个数各增加一个; 每使用一次aC→aaB或aC→aa, a的个数就增加一个; 产生式Bb→bB、 bC→Cb起连接转换作用。 由于A是开始符号,由产生式A→abc推导得到终结符号串abc;由产生式A→aBbc推导得到B后,每当使用产生式Bb→bB、Bc→Cbcc、bC→Cb、aC→aaB就会递归调用B一次,所产生的a、b、c的个数分别增加一个,因此推导所得的终结符号串为abc、aabbcc、aaabbbccc、…所以文法描述的语言为{ a n b n c n|n>0}. 例4 构造描述语言L(G[S])={(n)n|n≥0} 的文法。 【解】(1)找出语言的一些典型句子: n=0 ε n=1 ( ) n=2 (()) … 所以, L(G[S])={ ε、( ) (())、((()))、…} (2)分析句子的特点: 只含有(和),(和)的个数相同且对称, 句子中所含的符号数可无限, 句子的个数可无限。 (3)凑规则:由 S→ε|() 得到ε|(),由 A→ (S) 得到 (()),(()) 是在()的两边再加上一对()得到,((()))是在(())的两边再加上一对()得到,…所以将上述产生式合并为S→(S) |ε。 (4)得到文法 G[S]: S→(S) |ε (5)检验:语言所有的句子均可由文法G[S]推导出来, 文法G[S]推导出来的所有终结符号串均为语言的句子. 例5 构造描述语言L(G[S])={a m b n |n>m>0} 的文法。 【解】找出语言的一些典型句子:abb、abbb、…、aabbb、aabbbb、…,语言的句子的特点是仅含有a、b, a在b的左边,b的个数大于a的个数,a的个数至少是1。 单独生成c k, k>1 可用产生式 C→c |Cc 句子中要求b的个数大于a的个数,所以得到文法:

编译原理作业集第一章修订版

第一章引论 本章要点: 1. 正确理解什么是编译程序; 2. 了解编译程序工作的基本过程及各阶段的基本任务; 3. 熟悉编译程序的总体结构框图; 4. 了解编译程序的构造过程和构造工具。 本章目标: 1. 掌握本章的“编译程序”、“交叉编译程序”、“编译前端与编译后端”等基本概念,并能在以后的学习熟练运用; 2. 掌握T形图表示。 本章重点: 1. 概念比较: ①编译程序、解释程序; ②诊断编译程序、优化编译程序; ③交叉编译程序、可变目标编译程序; ④编译前端与编译后端; 2. 编译工作过程的五个阶段; 3. 编译程序总框; 4. 编译程序“移植”。 本章难点 1. 编译程序“移植”; 作业题及参考答案 一、单项选择题:

(按照组卷方案,至少8道小题) 1. 如果一个编译程序能产生不同于其宿主机的机器代码,则称它为:。 a. 诊断编译程序 b. 优化编译程序 c. 交叉编译程序 d. 可变目标编译程序 2. 编译程序将高级语言程序翻译成。 a. 机器语言程序或高级语言程序 b. 汇编语言或机器语言程序 c. 汇编语言程序或高级语言程序 d. 中间语言程序或高级语言程序 3. 下面的四个选项中,__________不是编译程序的组成部分。 a. 词法分析程序 b. 代码生成程序 c. 设备管理程序 d. 语法分析程序 4. 现代多数实用编译程序所产生的目标代码都是一种可重定位的指令代码,在运行前必须借助于一个把各个目标模块,包括系统提供的库模块连接在一起,确定程序变量或常数在主存中的位置,装入内存中制定的起始地址,使之成为一个可运行的绝对指令代码的程序。 a. 重定位程序; b. 解释程序; c. 连接装配程序; d. 诊断程序; 5. 从编译程序的角度说,源程序中的错误通常分为两大类。 a. 词法错误和语法错误; b. 语法错误和语义错误; c. 编辑错误和诊断错误; d. 词法错误和语义错误; 6. 下面对编译原理的有关概念正确描述的是:。 a. 目标语言只能是机器语言 b. 编译程序处理的对象是源语言。 c. Lex是语法分析自动生成器 d. 解释程序属于编译程序 7. 目标代码生成阶段所生成的目标代码的形式不可能是。 a. 绝对指令代码 b. 可充定位的指令代码。 c. 汇编指令代码 d. 三地址代码 8. 语义错误是指源程序中不符合语义规则的错误,不包括: a. 非法字符错误 b. 类型不一致错误。 c. 作用域错误 d. 说明错误 一.答案:1. c; 2. b;3. c; 4. c;5. b;6. d;7. d;8.a; 二、填空题: (按照组卷方案,至少8道小题) 1.我们有时把编译程序划分为编译前端和编译后端。前端主要由与有关但与

编译原理第一章作业完整答案版

01-普通作业一(第一章) 一、选择题(从备选项中选出一个或多个正确答案)。 1. 编译程序的源程序是高级语言编写的程序,目标程序是编写的程序。 A. 高级语言 B. 汇编语言 C. 机器语言 D. 汇编语言或机器语言 2. 编译程序是对进行翻译。 A. 高级语言 B. 汇编语言 C. 机器语言 D. 自然语言 3. 如果编译程序生成的目标程序是机器代码程序,则源程序的执行分为两个阶段。 A. 编译 B. 汇编 C. 运行 D. 预处理 4. 编译的工作过程一般划分为词法分析、、语义分析、中间代码生成、代码优化和目标代码生成若干阶段。 A. 表格管理 B. 出错处理 C. 语法分析 D. 预处理 5. 词法分析阶段的主要任务是识别。 A. 表达式 B. 单词 C. 语句 D. 词组 二、判断题(对于下列陈述中正确的说法选择回答“对”,否则选择回答“错”)。 1. 编译程序是一种常见的应用软件。 2. C语言的编译程序可以用C语言编写。 3. 编译方式与解释方式的区别之一在于是否生成目标程序。 4. 中间代码生成是编译程序不可或缺的部分。 5. 含有优化的编译程序执行效率高。 三、解释下列术语: (1)编译程序 (2)源程序 (3)目标程序 (4)编译程序的前端 (5)后端 (6)遍 四、一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。 五、何谓翻译程序、编译程序和解释程序?它们三者之间有何种关系? 参考答案: 一、选择题 1. D 2. A 3. AC 4. C 5. B 二、判断题 1.错 2.对 3.对 4.错 5.错 三、 (1)把用高级程序设计语言书写的源程序,翻译成等价的计算机汇编语言或机器语言书写的目标程序的翻译程序。

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

第一章绪论 1.1 完成下列选择题: (1) 构造编译程序应掌握。 a. 源程序 b. 目标语言 c. 编译方法 d. 以上三项都是 (2) 编译程序绝大多数时间花在上。 a. 出错处理 b. 词法分析 c. 目标代码生成 d. 表格管理 (3) 编译程序是对。 a. 汇编程序的翻译 b. 高级语言程序的解释执行 c. 机器语言的执行 d. 高级语言的翻译 【解答】 (1) d (2) d (3) d 1.2 计算机执行用高级语言编写的程序有哪些途径?它们之间的主要区别是什么? 【解答】计算机执行用高级语言编写的程序主要有两种途径:解释和编译。 在解释方式下,翻译程序事先并不采用将高级语言程序全部翻译成机器代码程序,然后执行这个机器代码程序的方法,而是每读入一条源程序的语句,就将其解释(翻译)成对应其功能的机器代码语句串并执行,而所翻译的机器代码语句串在该语句执行后并不保留,最后再读入下一条源程序语句,并解释执行。这种方法是按源程序中语句的动态执行顺序逐句解释(翻译)执行的,如果一语句处于一循环体中,则每次循环执行到该语句时,都要将其翻译成机器代码后再执行。 在编译方式下,高级语言程序的执行是分两步进行的:第一步首先将高级语言程序全部翻译成机器代码程序,第二步才是执行这个机器代码程序。因此,编译对源程序的处理是先翻译,后执行。 从执行速度上看,编译型的高级语言比解释型的高级语言要快,但解释方式下的人机界面比编译型好,便于程序调试。 这两种途径的主要区别在于:解释方式下不生成目标代码程序,而编译方式下生成目标代码程序。 1.3 请画出编译程序的总框图。如果你是一个编译程序的总设计师,设计编译程序时应当考虑哪些问题? 【解答】编译程序总框图如图1-1所示。 作为一个编译程序的总设计师,首先要深刻理解被编译的源语言其语法及语义;其次,要充分掌握目标指令的功能及特点,如果目标语言是机器指令,还要搞清楚机器的硬件结构以及操作系统的功能;第三,对编译的方法及使用的软件工具也必须准确化。总之,总设计师在设计编译程序时必须估量系统功能要求、硬件设备及软件工具等诸因素对编译程序构造的影响等。

编译原理文档第一章

编译原理 第一章编译程序概论 使用过计算机的人都知道,多数用户是应用高级语言来实现他们所需要的计算的。在计算机上执行高级语言程序一般分为两步:第一步,用一个编译程序把高级语言翻译成机器语言程序;第二步,运行所得的机器语言程序求得计算结果。计算机语言由单一的机器语言发展到现今内容迥异的数千种高级语言,就是因为有了编译技术。因此,对于计算机专业的学生来说,理解编译程序的工作原理显得尤其重要。 本章重点:编译程序概念、编译过程概述、编译程序的结构。 第一节什么是编译程序 通常所说的翻译程序是指这样的一个程序,它能够把某一种语言(称为源语言)改造为另一种语言(称为目标语言),而后者与前者在逻辑上是等价的。如果源语言是诸如FORTRAN、PASCAL、ALGOL或COBOL这样的“高级语言”,而目标语言是诸如汇编语言或机器语言之类的“低级语言”,这样的一个翻译程序就称为编译程序。

第二节编译过程概述 编译程序完成从源程序到目标程序的翻译工作,是一个复杂的整体的过程。从概念上来说,一 个编译程序的整个工作过程是划分成阶段进行的,每个阶段将源程序的一种表示形式转换成另一种 表示形式,各个阶段进行的操作在逻辑上是紧密连接在一起的,图1-2-1给出了一个编译过程的各个 阶段,这是一种典型的划分方法。事实上,某些阶段可能组合在一起,这些阶段间的源程序的中间 表示形式就没必要构造出来了。图1-2-1中将编译过程划分成了词法分析、语法分析、中间代码生成, 代码优化和目标代码生成六个阶段,我们将分别介绍各阶段的任务。另外两个重要的工作:表格管 理和出错处理与上述六个阶段都有联系。编译过程中源程序的各种信息被保留在种种不同的表格里, 编译各阶段的工作都涉及到构造、查找或更新有关的表格,因此需要有表格管理的工作。如果编译 过程中发现源程序有错误,编译程Array序应报告错误的性质和错误发生的 地点,并且将错误所造成的影响限 制在尽可有小的范围内,使得源程 序的其余部分能继续被编译下去, 有些编译程序还能自动校正错误, 这些工作称之为出错处理。 我们从源程序在不同阶段所被 转换成的表示形式的不同来介绍各 个阶段的任务。 词法分析阶段:是编译过程 的第一个阶段。这个阶段的任务是 从左到右一个字符一个字符地读入 源程序,对构成源程序的字符流进 行扫描和分解,从而识别出一个个 单词(也称单词符号或符号)。这里 所谓的单词是指逻辑上紧密相连的 一组字符,这些字符具有具体含义。 比如标识符是由字母字符开头,后 跟字母、数字字符的字符序列组成 的一种单词。保留字(关键字或基本字)是一种单词,此外还有算符,界符等等。例如某源程序片 断如下: begin var sum, first, count: real; sum :=first + count * 10 end. 词法分析阶段将构成这段程序的字符组成了如下单词序列: 1. 保留字begin 2. 保留字var 19. 界符· 3. 标识符sum 4. 逗号, 5. 标识符first 6. 逗号, 7. 标识符count 8. 冒号: 9. 保留字real 10. 分号; 11. 标识符sum 12. 赋值号:= 13. 标识符first 14. 加号+ 15. 标识符fount 16. 乘号* 17. 整数10 18. 保留字end

相关主题
相关文档
最新文档