第6章 符号表管理和错误处理
编译原理习题答案
1、正规文法又称 DA、0型文法B、1型文法C、2型文法D、3型文法2、对于无二义性的文法,规范归约是 BA. 最左推导B. 最右推导的逆过程C.最左归约的逆过程D.最右归约的逆过程。
3、扫描器的任务是从源程序中识别出一个个单词符号。
4、程序所需的数据空间在程序运行前就可确定,称为 A 管理技术。
A 静态存储B 动态存储C 栈式存储D 堆式存储5、编译过程中,语法分析器的任务是(B)。
①分析单词是怎样构成的②分析单词串是如何构成语句和说明的③分析语句和说明是如何构成程序的④分析程序的结构A、②③B、②③④C、①②③D、①②③④6、文法G:E→E+T|T T→T*P|P P→ (E)| i则句型P+T+i的句柄和最左素短语分别为 B 。
A、P+T和iB、P和P+TC、i和P+T+iD、P和P7、四元式之间的联系是通过B实现的A.指示器B.临时变量C.符号表D.程序变量8、程序语言的单词符号一般可以分为保留字、标识符、常数、运算符、界符等等。
9、下列 B 优化方法是针对循环优化进行的。
A.删除多余运算B.删除归纳变量C.合并已知量D.复写传播10、若文法G 定义的语言是无限集,则文法必然是 AA、递归的B、前后文无关的C、二义性的D、无二义性的11、文法G 产生的D的全体是该文法描述的语言。
A、句型B、终结符集C、非终结符集D、句子12、Chomsky 定义的四种形式语言文法中,0 型文法又称为 A文法;1 型文法又称为 C 文法。
A.短语文法B.上下文无关文法C.上下文有关文法D.正规文法A.短语文法B.上下文无关文法C.上下文有关文法D.正规文法13、语法分析最常用的两类方法是自顶向下和自底向上分析法。
14、一个确定的有穷自动机DFA是一个 A 。
A 五元组(K,∑,f, S, Z)B 四元组(V N,V T,P,S)C 四元组(K,∑,f,S)D 三元组(V N,V T,P)A、语法B、语义C、代码D、运行15、 B不属于乔姆斯基观点分类的文法。
清华大学编译原理第二版课后习答案
Lw.《编译原理》课后习题答案第一章第1章引论第1题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)源程序:源语言编写的程序称为源程序。
(3)目标程序:目标语言书写的程序称为目标程序。
(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第2题一个典型的编译程序通常由哪些部分组成?各部分的主要功能是什么?并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
盛威网()专业的计算机学习网站1《编译原理》课后习题答案第一章目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和查找等一系列表格工作。
软件水平考试(中级)软件评测师综合(习题卷4)
软件水平考试(中级)软件评测师综合(习题卷4)说明:答案和解析在试卷最后第1部分:单项选择题,共73题,每题只有一个正确答案,多选或少选均不得分。
1.[单选题]黑盒法是根据程序的( )来设计测试用例的。
A)应用范围B)内部逻辑C)功能D)输入数据2.[单选题]以下不属于兼容性测试关注范畴的一项是()A)服务器端是否同时支持浏览器和专用客户端的访问B)软件是否同时支持数据库的不同版本C)软件是否支持以前的数据格式D)软件是否可以在不同的J2EE 应用服务器上动行3.[单选题]软件测试按照开发阶段划分:A)单元测试B)集成测试;系统测试C)确认测试;验收测试D)以上都是答案4.[单选题]采用插入排序算法对n个整数排序,其基本思想是:在插入第i个整数时,前i-1个整数已经排好序,将第i个整数依次和第i-1,i-2,…个整数进行比较,找到应该插入的位置。
现采用插入排序算法对6个整数{5,2,4,6,1,3}进行从小到大排序,则需要进行( )次整数之间的比较。
对于该排序算法,输入数据具有(请作答此空)特点时,对整数进行从小到大排序,所需的比较次数最多。
A)从小到大B)从大到小C)所有元素相同D)随机分布5.[单选题]若计算机存储数据采用的是双符号位(00表示正号、11表示负号),两个符号相同的数相加时,如果运算结果的两个符号位经( )运算得1,则可断定这两个数相加的结果产生了溢出。
A)逻辑与B)逻辑或C)逻辑同或D)逻辑异或6.[单选题]下图中,类Product和ConcreteProduct的关系是( ),类ConcreteCreator和ConcreteProduct的关系是(请作答此空)。
A)继承B)关联C)组合D)依赖7.[单选题]在代码检查中, 负责提供关于检查项目的资料并回答检查人员问题的角色是A)协调人B)开发人员C)检查人员D)讲解员8.[单选题]以下关于回归测试的说法中,错误的是()A)未通过软件单元测试的软件,在变更之后,应对其进行单元测试B)未通过配置项测试的软件, 在变更之后, 首先应对变更的软件单元进行测试, 然后再进行相关的集成测试和配置项测试C)未通过系统测试的软件, 在变更之后, 首先应对变更的软件配置项进行测试, 然后再进行系统测试D)因为其他原因进行变更之后的软件单元, 也首先应对变更的软件单元进行测试, 然后再进行相关的软件测试9.[单选题]若有关系R(A,B,C,D,E)和S(B,C,F,G),则R与S自然联接运算后的属性列有( )个?与表达式π1,3,6,7(σ3<6(R∞S))等价的SQL语句如下:SELECT( )FROM(请作答此空)WHERE( );A)RB)SC)RSD)R,S10.[单选题]1976 Diffie与Hellman首次公开提出( )的概念与结构,采用两个从此独立的密钥对数据分别行行加密或解密,且加密过程基本数学函数,从而带来了加密领域的革命性进步。
C语言编译原理编译过程和编译器的工作原理
C语言编译原理编译过程和编译器的工作原理C语言是一种广泛使用的计算机编程语言,它具有高效性和可移植性的特点。
在C语言程序的运行之前,需要通过编译器将源代码翻译成机器可以执行的目标代码。
编译器是一种专门用于将高级语言源代码转换为机器语言的程序。
编译过程分为四个主要阶段,包括词法分析、语法分析、语义分析和代码生成。
下面我们逐一介绍这些阶段的工作原理。
1. 词法分析词法分析是编译过程的第一步,它将源代码分解成一系列的词法单元,如标识符、常量、运算符等。
这些词法单元存储在符号表中,以便后续的分析和转换。
2. 语法分析语法分析的目标是将词法单元按照语法规则组织成一个语法树,以便进一步的分析和优化。
语法分析器使用文法规则来判断输入的字符串是否符合语法规范,并根据语法规则生成语法树。
3. 语义分析语义分析阶段对语法树进行分析并在合适的地方插入语义动作。
语义动作是一些与语义相关的处理操作,用于检查和修正代码的语义错误,并生成中间代码或目标代码。
4. 代码生成代码生成是编译过程的最后一个阶段,它将中间代码或语法树翻译为目标代码,使得计算机可以直接执行。
代码生成阶段涉及到指令的选择、寄存器分配、数据位置的确定等一系列的优化操作,以提高程序的性能和效率。
编译器是实现编译过程的工具。
它接收源代码作为输入,并将其转换为目标代码或可执行文件作为输出。
编译器工作原理可以简单概括为:读取源代码、进行词法分析和语法分析、生成中间代码、进行优化、生成目标代码。
编译器在编译过程中还涉及到符号表管理、错误处理、优化算法等方面的工作。
符号表用于管理程序中的标识符、常量、变量等信息;错误处理机制用于检测和纠正程序中的错误;优化算法用于提高程序的性能和效率,例如常量折叠、无用代码删除等。
总结起来,C语言编译过程涉及到词法分析、语法分析、语义分析和代码生成等阶段,每个阶段都有特定的工作原理和任务。
编译器作为实现编译过程的工具,负责将源代码转换为机器可以执行的目标代码。
(优选)符号表的组织和管理
– 例 C语言的变量声明
short int a;
float b = 0.0;
– 把标识符a声明为短整数型,把b声明为浮点类型, 而且初始化为0。那么,编译程序对每个变量要记 录它的类型,以便执行类型检查和分配存储,比如 短整型变量i占2个字节;要记录它在存储器中的位 置(相对位移或绝对地址),以便目标程序运行时 访问;若像b有初始值,则还需要记录这个初始值。
• (2) 查找符号的属性
– 符号表存放了源程序中的各种类型的信息,比如数 值、变量类型、参数传递的地址等,在分析和翻译 源程序的过程中会被不断地查询。
– 例如,对于上述的变量声明,如果源程序有代码 a + b时,就需要查找、计算表达式中运算数的类型 和值,以便计算出表达式。
– 又如,在源程序中如果出现了函数调用factory (6), 编译程序就需要查找到factory的声明,找到实参6 的地址并传给形参n,执行函数factory的体,并返 回值等。
• 区别符号存储类型地属性是编译过程中语义处理、检查和 存储分配的重要依据。
3. 又如,面向对象语言的继承性和多态性允许同一 个消息在不同的环境中调用不同的方法(函数), 即调用同名但在不同的类中实现的方法。这就需 要编译或者运行时在方法的符号表中查询在参数、 返回数以及方法方面名字一致的实现。
• (3) 作为目标代码生成阶段地址分配的依据
– 标识符由它定义的存储类型或它在程序中的位置来确定。
– (2)符号种属
• 由于语言中符号所拥有的属性可能不同,其组织就可以采用不 同的数据结构,可以用符号的种属来区别每个符号的基本划分。
• 根据不同的语言,符号的种属可以包括:简单变量、结构型变 量、数组、过程、类型、类等。
符号表与错误处理
第8章 符号表与错误处理
分程序表中的每一登记项由三个字段组成: OUTERN字段用来指明该分程序的直接外层分
程序的编号;COUNT字段用来记录该分程 序符号表登记项的个数;POINTER字段是一个 指示器,它指向该分程序符号表的起始位置。
第8章 符号表与错误处理
下面, 我们给出建造满足上述要求符号表的算法 。为了使各分程序的符号表登记项连续地排列在一 起, 并结合在扫描具有嵌套分程序结构的源程序时 总是按先进后出的顺序来扫描其中各个分程序的特 点, 可设置一个临时工作栈, 每当进入一层分程序时 , 就在这个栈的顶部预造该分程序的符号表, 而当遇 到该层分程序的结束符END时(此时该分程序的全 部登记项都出现在栈的顶部), 再将该分程序的全部 登记项移至正式符号表中。
加1且使POINTER指向新的栈顶。
第8章 符号表与错误处理
③ 当扫描到分程序的结束符END时, 将记入临 时工作栈的本层分程序全部登记项移至正式 的符 号表中, 且修改POINTER值使其指向本层 分程 序全部名字登记项在符号表中的起始位置。此外, 在退出此层分程序时, 还应使它的直接 外层分程 序成为当前的分程序。
第8章 符号表与错误处理
根据编译程序工作阶段的不同划分, 名字表中 的各种信息将在编译程序工作过程中的适当时候填
入。对于在词法分析阶段就建立符号表的编译 程序, 当扫描源程序识别出一个单词(名字)时, 就以 此名 字查找符号表;若表中无此名的登记项, 就将 此名 字填入符号表中;至于与此名相关的其它信 息, 可 视工作方便分别在语法分析、语义分析及中 间代码 生成等阶段陆续填入。
第8章 符号表与错误处理
例8.1 一示意性源程序如下: PROGRAM PP (input,output); COUNT norw=13;
编译原理语义动作的分类
编译原理语义动作的分类
在编译原理中,语义动作是指编译器在语义分析阶段执行的操作。
这些操作主要涉及源代码中符号和表达式的语义分析,以及生成相应的中间代码或目标代码。
根据其作用和功能,语义动作可以分为以下几类:
1. 类型检查:检查源代码中每个符号和表达式的类型,确保它们在语法上是正确的,并且符合语言规范。
例如,检查变量是否已声明、函数参数类型是否匹配等。
2. 语义分析:对源代码中的语义进行深入分析,包括确定符号的引用关系、处理复杂表达式、进行类型转换等。
这一步旨在确保源代码在语义上是正确的,并生成相应的中间代码。
3. 代码生成:根据语义分析的结果,生成相应的中间代码或目标代码。
这一步通常涉及将高级语言代码转换为低级语言代码,以便于计算机执行。
4. 错误处理:在语义分析过程中,如果编译器发现源代码中存在错误,则需要进行错误处理。
错误处理包括识别错误类型、提供错误消息、标注错误位置等,以便开发人员能够及时发现并修复错误。
5. 符号表管理:符号表是编译器用于存储源代码中符号信息的表格。
在语义分析过程中,编译器需要不断地在符号表中查找、添加和更新符号信息。
因此,符号表管理也是语义动作的一个重要组成部分。
通过以上分类,我们可以更好地理解编译原理中语义动作的作用和功能。
在实际的编译器设计中,根据具体的语言特性和需求,可以对这些语义动作进行适当的调整和扩展。
第6章 符号表管理和错误处理
2. 符号表、静态存储分配数据区溢出。 3. 动态存储分配数据区溢出。
2020/6/16 编 译 原 理
2020年6月16日
13
错误处理方法有两种: ➢错误校正法: 根据文法进行错误改正 ➢错误局部化法: 把错误的影响限制在一个局部的范围,避免 错误扩散和影响程序其他部分的分析
•发现错误立即跳到语句结尾
处(语句右界符 ; 或end),这
样处理较粗糙,将跳过太多; •上例中,缺then,就将跳过整个 条件语句,使得then后的语句 都被跳过而不分析,其中有错 误就发现不了
2020年6月16日
17
(3) 提高错误局部化程度的方法
设 S1: 合法后继符号集 (某语法成分的后继符号) S2: 停止符号集 (跳读必须停止的符号集)
为符号构造一个散列函数Hash(Ki),使得0≤ Hash(Ki) ≤M-1,i=1,2,…,n
这样查找Ki时,Hash(Ki)就决定了Ki在符号表中 的位置
2020/6/16 编 译 原 理
2020年6月16日
8
构造Hash函数的方法:
将标识符中的每个字符转换为一个非负整数
将得到的各个整数组合成一个整数(可以将第一 个、中间的和最后一个字符值加在一起,也可以将 所有字符的值加起来)
内容:名字栏+信息栏
2020/6/16 编 译 原 理
2020年6月16日
5
6.1.2 符号表的组织
操作: (1)向表中填入一个新标识符。 (2)对于给定一个标识符:
① 查找是否在表中; ② 访问它在表中的相关信息; ③ 在表中填写或更新它的某些信息。 (3)更新或删除一个或一组无用的项。
编译原理流程
编译原理流程
编译原理的流程可以概括为以下几个步骤:
1. 词法分析:将源代码按照语法规则划分为一个个的词法单元(Token),例如标识符、关键字、字符常量等。
2. 语法分析:将词法单元按照语法规则进行分析,构建相应的语法树(Parse Tree)。
常用的语法分析方法有递归下降分析、LL(1)分析、LR分析等。
3. 语义分析:对语法树进行处理,进行类型检查、生成中间代码等。
语义分析会解决一些语法上无法检测到的问题,例如类型不匹配、未声明的变量等。
4. 中间代码生成:将语法树转换为中间代码形式,例如三地址代码、虚拟机代码等。
中间代码是一个介于源代码和目标代码之间的抽象表示。
5. 代码优化:对中间代码进行优化处理,以提高程序的执行效率和运行速度。
常见的代码优化技术包括常量折叠、死代码删除、循环优化等。
6. 目标代码生成:根据目标机器的特性和要求,将优化后的中间代码转换为目标代码,例如汇编代码或者机器码。
7. 目标代码优化:对生成的目标代码进行优化,以进一步提高程序的执行效率和运行速度。
8. 符号表管理:在编译过程中维护一个符号表,用于存储变量、函数等的信息。
符号表可以用于语义分析、中间代码生成等阶段的处理。
9. 错误处理:在编译过程中会检测并处理词法、语法、语义等方面的错误,包括报错提示和恢复处理等。
10. 目标代码生成和链接:将优化后的目标代码生成可执行文件,并进行链接,包括解决外部引用、重定位等过程。
以上是编译原理的基本流程,不同编译器或编译器生成的目标代码可能会有不同的细节处理。
北京交通大学22春“计算机科学与技术”《编译原理》作业考核题库高频考点版(参考答案)试题号1
北京交通大学22春“计算机科学与技术”《编译原理》作业考核题库高频考点版(参考答案)一.综合考核(共50题)1.LR(1)文法都是()。
A.无二义性且无左递归B.可能有二义性但无左递归C.无二义性但可能是左递归D.可以既有二义性又有左递归参考答案:C2.表达式(a+b)*(c+d)的后缀式表示为()。
A.a+b*c+dB.+ab*+cdC.ab+cd+*D.无法表示参考答案:C3.最常用的中间代码形式是()A.二元式B.三元式C.四元式D.树型参考答案:C4.中间代码生成时所依据的是等价变换规则。
()A.错误B.正确参考答案:B下面哪个文法具有二义性()。
A.A→AA|(A)|B.E→E+T|TC.E→(E)D.E→a参考答案:A6.上下文无关文法也叫正规文法。
()A.错误B.正确参考答案:A7.逆波兰法表示的表达式亦称前缀式。
()A.错误B.正确参考答案:A8.每个文法的综合符合集和集成属性集的交应该为空。
()A.错误B.正确参考答案:B9.语义分析与中间代码产生所依循的是()。
A.正规式B.上下文无关文法C.语言的语义规则D.有限自动机10.常见的代码优化包括()。
A.常量合并B.公共子表达式删除C.复写传播D.死代码删除参考答案:ABCD11.编译器是将一种语言翻译为另一种语言的计算机程序。
()A.错误B.正确参考答案:B12.常用的中间代码表示形式有()。
A.三元式B.四元式C.间接三元式D.逆波兰记号参考答案:ABCD13.有限自动机可以有()个初始状态。
A.一个B.两个C.三个D.多个参考答案:AA.句子B.句型C.句柄D.素短语参考答案:B15.已知文法:S→aAa|aBb|bAb|bBaA→xB→x,则()A.LR(1)文法LR(1)文法C.都不是D.A和B参考答案:A16.优先关系表对应的优先函数,如果存在,一定唯一。
()A.错误B.正确参考答案:A17.按照语法分析树的建立方法,可以粗略地把语法分析办法分成两类()。
第六章(2)符号表的管理
}
} a = 1, b = 1 printf(“a = %d, b = %d\n”, a, b);
}
33
2.在语言程序的局部化单位中,标识符的出现分为定 义性出现和使用性出现。
⑴定义性出现的标识符:局部化单位的声明部分出现 的标识符,其作用是确定该标识符的属性信息,如 名字,类型,存储位置等。一个标识符在一个局部 化单位只能被声明一次。
28
❖对于散列表,新符号的登录是通号表的目的:
判断该符号的存在性; 获取该符号的语义属性. ❖符号表的查找算法:顺序查找、折半查找、杂凑查 找.
30
6.3.3 符号表的局部化处理
一、问题的引出
1.源语言程序的局部化单位 程序中允许有声明的 部分称为一个局部化单位,通常是一个子程序(函数、 过程)或分程序:
19
6.3.1 符号表的建立和查找
一.符号表的初始化 在编译过程中某个时刻,符号表的状态反
映了该时刻被编译的语言程序正被编译的位置 的状态.具体来说主要是反映了在该时刻被编译 的语言程序中可视标识符的状态. 符号表的初始化,在对语言程序开始编译的时刻, 定义建立符号表的初始状态.
20
1.符号表的表长是渐增变化的情况: ❖线性组织和二分法组织的符号表,其表的长度在编译开始时 通常为0,而随着符号的逐步登录,表长增长. ❖按这类方法组织的符号表,其初始化方法只需将表尾推向表
一、符号表的总体组织
符号表的每一项包含两部分:标识符的名字;该名字的信 息。
不同类别的标识符所包含的信息是不同的。 符号表的总体组织既可以采用多表结构,也可以采用单表
结构,也可以二者折中。究竟采用哪种结构并没有统一的规 定,编译程序可根据实际处理语言的需要进行选择。
简述符号表的主要功能
简述符号表的主要功能符号表(symbol table)是一个数据结构,用于保存程序中的标识符及其相关信息。
它是编程语言编译器的重要组成部分,其主要功能是为编译器提供符号的唯一定义和引用。
符号表在编译过程中起着关键作用,用于记录程序中出现的各种标识符,以便在后续的语义分析、中间代码生成和代码优化等过程中进行查找和处理。
符号表的主要功能包括:1. 保存符号的声明和定义信息:符号表用来存储程序中各个标识符的声明和定义信息,包括变量、函数、类、结构体等。
对于每个标识符,符号表会记录其名称、数据类型、作用域、存储位置等相关信息。
这些信息将在后续的语义分析过程中被引用,确保程序的正确性和一致性。
2. 校验符号的使用:符号表可以帮助编译器检查符号的正确使用,并进行相应的错误处理。
例如,它可以检查变量是否被声明和定义,函数是否被调用时参数数量和类型是否正确等。
符号表通过记录各个标识符的属性和关联信息,可以对程序进行静态和动态的语义检查。
3. 管理符号的作用域和可见性:符号表用于管理程序中的作用域和标识符的可见性。
通过识别和记录定义和引用的符号所在的作用域,符号表可以确定标识符在不同作用域中的可见性和生命周期。
它确保了变量名不会冲突,且在正确的作用域内被引用。
4. 符号的内存分配和地址计算:符号表用于记录变量和其他符号的内存分配和地址计算信息。
对于全局变量、局部变量、类成员等不同类型的符号,符号表可以确定其存储类型(静态、堆、栈等)和存储位置。
这些信息对于生成中间代码和进行代码优化非常重要。
5. 符号的类型检查和转换:符号表可以保存和检查符号的数据类型及其相关信息。
编译器可以根据符号表中的类型信息进行类型检查,确保表达式和操作的类型匹配。
符号表还可以记录类型转换的规则和方法,以便在需要时进行自动转换。
6. 支持符号的查询和引用:符号表可以支持编译器和解释器在后续过程中对符号的查找和引用。
通过符号表,编译器可以根据标识符的名称和上下文,找到对应的符号信息,并进行进一步的处理和分析。
编译原理第二版课后习答案
《编译原理》课后习题答案第一章第1章引论第1题解释下列术语:(1)编译程序(2)源程序(3)目标程序(4)编译程序的前端(5)后端(6)遍答案:(1)编译程序:如果源语言为高级语言,目标语言为某台计算机上的汇编语言或机器语言,则此翻译程序称为编译程序。
(2)源程序:源语言编写的程序称为源程序。
(3)目标程序:目标语言书写的程序称为目标程序。
(4)编译程序的前端:它由这样一些阶段组成:这些阶段的工作主要依赖于源语言而与目标机无关。
通常前端包括词法分析、语法分析、语义分析和中间代码生成这些阶段,某些优化工作也可在前端做,也包括与前端每个阶段相关的出错处理工作和符号表管理等工作。
(5)后端:指那些依赖于目标机而一般不依赖源语言,只与中间代码有关的那些阶段,即目标代码生成,以及相关出错处理和符号表操作。
(6)遍:是对源程序或其等价的中间语言程序从头到尾扫视并完成规定任务的过程。
第2题一个典型的编译程序通常由哪些部分组成各部分的主要功能是什么并画出编译程序的总体结构图。
答案:一个典型的编译程序通常包含8个组成部分,它们是词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、中间代码优化程序、目标代码生成程序、表格管理程序和错误处理程序。
其各部分的主要功能简述如下。
词法分析程序:输人源程序,拼单词、检查单词和分析单词,输出单词的机内表达形式。
语法分析程序:检查源程序中存在的形式语法错误,输出错误处理信息。
语义分析程序:进行语义检查和分析语义信息,并把分析的结果保存到各类语义信息表中。
中间代码生成程序:按照语义规则,将语法分析程序分析出的语法单位转换成一定形式的中间语言代码,如三元式或四元式。
中间代码优化程序:为了产生高质量的目标代码,对中间代码进行等价变换处理。
目标代码生成程序:将优化后的中间代码程序转换成目标代码程序。
表格管理程序:负责建立、填写和查找等一系列表格工作。
表格的作用是记录源程序的各类信息和编译各阶段的进展情况,编译的每个阶段所需信息多数都从表格中读取,产生的中间结果都记录在相应的表格中。
编译原理课后习题答案解析+清华大学出版社第二版
计算机执行用高级语言编写的程序有哪些途径它们之间的主要区别是什么
答案:计算机执行用高级语言编写的程序主要途径有两种,即解释与编译。 像 Basic 之类的语言,属于解释型的高级语言。它们的特点是计算机并不事先对高级语
言进行全盘翻译,将其变为机器代码,而是每读入一条高级语句,就用解释器将其翻译为一 条机器代码,予以执行,然后再读入下一条高级语句,翻译为机器代码,再执行,如此反 复。
第2题
若 PL/0 编译程序运行时的存储分配策略采用栈式动态分配,并用动态链和静态链的方式分 别解决递归调用和非局部变量的引用问题,试写出下列程序执行到赋值语句 b∶ =10 时运行 栈的布局示意图。 var x,y; procedure p; var a; procedure q; var b; begin (q) b∶ =10; end (q); procedure s; var c,d; procedure r; var e,f; begin (r) call q; end (r); begin (s) call r; end (s); begin (p) call s;
(2) 数组下标越界 (3) 使用的函数没有定义 (4) 在数中出现非数字字符
答案: (1) 语法分析 (2) 语义分析 (3) 语法分析 (4) 词法分析
第5题
编译程序大致有哪几种开发技术
答案:
(1) 自编译:用某一高级语言书写其本身的编译程序。 (2) 交叉编译:A 机器上的编译程序能产生 B 机器上的目标代码。 (3) 自展:首先确定一个非常简单的核心语言 L0,用机器语言或汇编语言书写出它的
第6题
给出对 PL/0 语言作如下功能扩充时的语法图和 EBNF 的语法描述。 (1) 扩充条件语句的功能使其为: if〈条件〉then〈语句〉[else〈语句〉] (2) 扩充 repeat 语句为: repeat〈语句〉{;〈语句〉}until〈条件〉
编译原理期末考试卷和答案
一. 填空题(每空2分,共20分)1. 不同的编译程序关于数据空间的存储分配策略可能不同,但大部分编译中采用的方案有两种:静态存储分配方案和动态存储分配方案,而后者又分为(1) 和 (2) 。
2. 规范规约是最(3)规约。
3. 编译程序的工作过程一般划分为5个阶段:词法分析、(4) 、语义分析与中间代码生成,代码优化及(5) 。
另外还有(6)和出错处理。
4.表达式x+y*z/(a+b)的后缀式为 (7) 。
5.文法符号的属性有综合属性和 (8)。
6.假设二位数组按行存放,而且每个元素占用一个存储单元,则数组a[1..15,1..20]某个元素a[i ,j]的地址计算公式为(9)。
7.局部优化是局限于一个(10)范围内的一种优化。
二. 选择题(1-6为单选题,7-8为多选题,每问2分,共20分)1. 一个上下文无关文法G 包括四个组成部分:一组终结符,一组非终结符,一个( ),以及一组( )。
A . 字符串B . 产生式C . 开始符号D . 文法 2.程序的基本块是指( )。
A . 一个子程序B . 一个仅有一个入口和一个出口的语句C . 一个没有嵌套的程序段D . 一组顺序执行的程序段,仅有一个入口和一个出口 3. 高级语言编译程序常用的语法分析方法中,递归下降分析法属于( )分析方法。
A . 自左向右 B . 自顶向下 C . 自底向上 D . 自右向左 4.在通常的语法分析方法中,( )特别适用于表达式的分析。
A . 算符优先分析法 B . LR 分析法 C . 递归下降分析法 D . LL (1)分析法 5.经过编译所得到的目标程序是( )。
A . 四元式序列B . 间接三元式序列C . 二元式序列D . 机器语言程序或汇编语言程序 6. 一个文法所描述的语言是( );描述一个语言的文法是( )。
A . 唯一的 B . 不唯一的 C . 可能唯一,也可能不唯一7.如果在文法G中存在一个句子,当其满足下列条件()之一时,则称该文法是二义文法。
符号表的组织和管理演示文稿
(优选)符号表的组织和管理
– 例 C语言的变量声明
short int a;
float b = 0.0;
– 把标识符a声明为短整数型,把b声明为浮点类型, 而且初始化为0。那么,编译程序对每个变量要记 录它的类型,以便执行类型检查和分配存储,比如 短整型变量i占2个字节;要记录它在存储器中的位 置(相对位移或绝对地址),以便目标程序运行时 访问;若像b有初始值,则还需要记录这个初始值。
• 例如,对应不同的参数类型,可以定义几个求和重载函数:
int sum ( int a, int b)
double sum ( double a, double b)
float sum(float a, float b, float c)
• 当某个函数中调用到重载函数时,于一个变量名要记录其类型(如整型、实型、布尔型等)、占用 的存储字节以及相对与某个基准位置的相对位置;
• 对一个过程名要记录的属性包括参数的个数及其类型,该过程是否 有返回值,过程中的变量声明,甚至过程声明(如果像Pascal语言 允许嵌套过程声明)等信息。
不同的程序语言规定了符号 的不同性质以及语法、语义和规 则,几种基本的符号属性。
– 首先是要确定变量存储的区域。例如,在Java语言中,整数 的类型(以及所占用的字节)有byte(1个字节)、short(2 个字节)、int(4个字节)以及long(8个字节),而float类 型占4个字节,double类型占8个字节。又如,对寄存器变量, 编译将尽可能地把它们保留在机器的寄存器当中,以提高运 行速度;而对在一个文件中定义的外部变量,它们要在不同 的源程序文件之间访问,需要编译程序把它们放在所有源程 序文件都可以方便寻找到的存储器的位置。
编译程序逻辑结构
编译程序逻辑结构编译程序逻辑结构是指编译程序的整体架构和运行流程。
它涉及到编译程序的各个组成部分之间的关系和交互,以及对源代码进行词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等一系列步骤的处理。
首先,编译程序的逻辑结构包括了前端和后端两个主要部分。
前端主要负责源代码的分析和语法检查,包括词法分析、语法分析和语义分析等。
词法分析阶段将源代码转换为标记流,即将源代码划分为具有特定含义的词法单元。
语法分析阶段通过语法规则对标记流进行分析,构建抽象语法树(AST),并检查代码的语法是否合法。
语义分析阶段进一步对抽象语法树进行分析,检查代码的语义是否正确,并生成中间代码表示。
后端主要负责中间代码的优化和目标代码的生成,包括中间代码生成、代码优化和目标代码生成等。
中间代码生成阶段将经过语义分析的抽象语法树转换为一种中间表示形式,以方便后续的优化和目标代码生成。
代码优化阶段对中间代码进行优化,以提高程序的执行效率和减少目标代码的大小。
目标代码生成阶段将优化后的中间代码转换为目标机器的机器代码。
此外,编译程序还包括符号表管理、错误处理和代码生成等辅助功能。
符号表管理用于记录变量、函数和类型等符号的信息,并进行符号的查找和更新。
错误处理用于检测和报告源代码中的错误,并提供相应的错误信息。
代码生成将优化后的中间代码转换为目标机器的机器代码,并生成可执行文件。
在编译程序的运行流程中,不同的阶段之间通过数据结构和接口进行数据传递和信息交互。
例如,词法分析阶段将源代码转换为标记流,并将结果传递给语法分析阶段。
语法分析阶段将标记流转换为抽象语法树,并将结果传递给语义分析阶段。
中间代码生成阶段将抽象语法树转换为中间代码,并将结果传递给代码优化阶段。
最后,目标代码生成阶段将优化后的中间代码转换为目标机器的机器代码。
综上所述,编译程序的逻辑结构涉及到源代码的分析和处理的各个组成部分之间的关系和交互,以及通过一系列的处理步骤将源代码转换为目标机器的机器代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京林业大学信息学院
2020年4月23日
7
Hash表的基本思想是:
为符号表设置一个足够大的空间M
为符号构造一个散列函数Hash(Ki),使得0≤ Hash(Ki) ≤M-1,i=1,2,…,n
这样查找Ki时,Hash(Ki)就决定了Ki在符号表中 的位置
北京林业大学信息学院
2020年4月23日
8
构造Hash函数的方法:
若两个标识符具有相同的函数值,则可用开放地址法或链地 址法解决冲突,有关内容可以参考《数据结构》的教材。
北京林业大学信息学院
2020年4月23日
10
6.2 错误处理
•词法错误 •语法错误 •语义错误 •违反了语言的环境限制
➢数组维数太大 ➢循环嵌套层数太多
北京林业大学信息学院
2020年4月23日
11
S.P
词法分析程序
符 号 表 管 理
语法分析程序 语义分析、生成中间代码
代码优化
错 误 处 理
生成目标程序
O.P
北京林业大学信息学院
2020年4月23日
1
第6章 符号表管理和错误处理
教学目标
1. 明确符号表的作用、内容、组织 2. 明确错误处理的两种方法:错误校正和局部化处理
北京林业大学信息学院
2020年4月23日
2020年4月23日
4
6.1.1 符号表的作用和内容
作用: (1)收集符号的各种信息 (2)语义检查的依据 (3)目标代码生成阶段地址分配的依据
内容:名字栏+信息栏
北京林业大学Biblioteka 息学院2020年4月23日
5
6.1.2 符号表的组织
操作: (1)向表中填入一个新标识符。 (2)对于给定一个标识符:
词法错误:不合法单词
例:mian( ){ 词法错误、语法错误和语义错误 int 3sum; …
语法错误:源程序在语法上不符合文法 例:A[x , y =B+*C
北京林业大学信息学院
2020年4月23日
12
语义错误主要包括:程序不符合语义规则或 超越具体计算机系统的限制
语义规则
1. 标识符先说明后引用 2. 标识符引用要符合作用域规定 3. 过程调用时实参与形参类型一致 4. 参与运算的操作数类型一致 5. 下标变量的下标不能越界
将标识符中的每个字符转换为一个非负整数
将得到的各个整数组合成一个整数(可以将第一 个、中间的和最后一个字符值加在一起,也可以将 所有字符的值加起来)
将结果数调整到0~M-1范围内,可以利用取模的方 法,Ki%M(M为素数)
北京林业大学信息学院
2020年4月23日
9
解决地址冲突的方法:
由于用户定义标识符的随机性,Hash函数值在0~M-1范围内 不一定唯一
if<C> then <statement>[else< statement >];
若<C>有错,则可跳到then 若statement有错,则可跳到else
北京林业大学信息学院
2020年4月23日
18
6.3 PL/0编译程序的错误处理
错误局部化处理遵循以下两条原则。 (1)镇定原则 (2)关键字原则
•发现错误立即跳到语句结尾
处(语句右界符 ; 或end),这
样处理较粗糙,将跳过太多
2020年4月23日
17
(3) 提高错误局部化程度的方法
设 S1: 合法后继符号集 (某语法成分的后继符号) S2: 停止符号集 (跳读必须停止的符号集)
error(S1,S2 ) {printf(linecnt, err); do getsym( ); while(sym not in S1 or not in S2 ) }
2
教学内容
• 6.1 符号表管理 • 6.2 错误处理 • 6.3 PL/0编译程序的错误处理
北京林业大学信息学院
2020年4月23日
3
6.1 符号表管理
编译程序中使用最多的数据结构是表 源程序中的各种信息,以便查询或修改, 在这些表中,尤以符号表最为重要
➢生存期最长 ➢使用最为频繁
北京林业大学信息学院
2020年4月23日
16
if<C> then <statement>[else< statement >];
if_ statement( ) {
getsym( ); /*读下个单词符号*/ C( ) ; /*表达式处理程序*/ if not sym=“then”
{err :=“缺then” ; error( ); /*出错处理程序*/
} else
{getsym( ); statement( ); }
if sym=“else” {getsym( ); statement( ); }
}
北京林业大学信息学院
error( ) {printf(linecnt, err);
do
getsym( );
while(sym!=“;” or sym!=“end” ) }
超越系统限制:(计算机系统和编译系统) 1. 数据溢出错误,常数太大,计算结果溢出。 2. 符号表、静态存储分配数据区溢出。 3. 动态存储分配数据区溢出。
北京林业大学信息学院
2020年4月23日
13
错误处理方法有两种: ➢错误校正法: 根据文法进行错误改正 ➢错误局部化法: 把错误的影响限制在一个局部的范围,避免 错误扩散和影响程序其他部分的分析
北京林业大学信息学院
2020年4月23日
14
错误局部化法
词法分析:发现不合法字符,显示错误,并跳 过该标识符(单词)继续往下分析。
语法语义分析:跳过所在的语法成分(短语或语 句),一般是跳到语句右界符, 然后从新语句继续往下分析。
北京林业大学信息学院
2020年4月23日
15
错误局部化处理的实现(递归下降分析法)
① 查找是否在表中; ② 访问它在表中的相关信息; ③ 在表中填写或更新它的某些信息。 (3)更新或删除一个或一组无用的项。
北京林业大学信息学院
2020年4月23日
6
6.1.2 符号表的组织
符号表的总体组织: (1)多张 (2) 一张 (3)前两种的折中
符号表项的组织: (1)线性组织 (2)排序组织 (3)散列组织:效率高,为多数编译程序采用
err: 全局变量,存放错误信息。
•用递归下降分析时,如果发现错误,便将有关 错误信息(字符串或者编号)送err,然后转错 误处理程序; • 出错程序先打印或显示出错位置以及出错信息, 然后跳出一段源程序,直到跳到语句的右界符或 正在分析的语法成分的合法后继符号为止,然后 再往下分析。
北京林业大学信息学院