编译原理知识点总结 哈工程
- 格式:docx
- 大小:753.69 KB
- 文档页数:11
编译原理知识点总结哈工程第一章概论1.什么是编译器?输入输出?编译器是将一种语言翻译为另一种语言的计算机程序。
输入:源语言( source language) 编写的程序输出:目标语言( target language ) 编写的程序。
2.汇编语言的优缺点优点:汇编语言大大提高了编程的速度和准确度缺点:编写起来也不容易,阅读和理解很难;而且汇编语言的编写严格依赖于特定的机器,所以为一台计算机编写的代码在应用于另一台计算机时必须完全重写。
3.什么是解释器?与编译器的区别?解释程序是如同编译器的一种语言翻译程序。
与编译器的区别:它立即执行源程序而不是生成在翻译完成之后才执行的目标代码。
4.乔姆斯基分类结构有几种文法?名称?相互关系?4种名称:0型无限制文法1型上下文相关文法2型上下文无关文法3型正则文法相互关系:其中的每一个都是其前者的专门化。
5.什么是扫描器?扫描器的功能是什么?扫描器就是语法分析程序。
功能:依据词法规则,分析由字符组成的源程序,把它分割为一个一个具有独立意义的最小语法单位,即单词。
6.什么是编辑器?IDE中编辑器的新功能编译器通常接受由任何生成标准文件(例如ASCII 文件)的编辑器编写的源程序。
IDE 中编辑器的新功能:尽管编辑器仍然生成标准文件,但会转向正被讨论的程序设计语言的格式或结构。
这样的编辑器称为基于结构的,且它早已包括了编译器的某些操作;因此,程序员就会在程序的编写时而不是在编译时就得知错误了。
从编辑器中也可调用编译器以及与它共用的程序,这样程序员无需离开编辑器就可执行程序。
7.什么是调试器,与编译器的关系调试程序是可在被编译了的程序中判定执行错误的程序。
运行一个带有调试程序的程序与直接执行不同,这是因为调试程序保存着所有的或大多数源代码信息(诸如行数、变量名和过程)。
它还可以在预先指定的位置(称为断点)暂停执行,并提供有关已调用的函数以及变量的当前值的信息。
为了执行这些函数,编译器必须为调试程序提供恰当的符号信息。
哈工大编译原理基本原理1. 什么是编译原理?编译原理(Compiler Design)是计算机科学中的一个重要分支,研究的是将高级语言程序翻译成机器语言程序的过程和方法。
编译原理包括语法分析、语义分析、中间代码生成、代码优化和目标代码生成等阶段。
2. 编译器的基本工作流程编译器通常由以下几个阶段组成:2.1 词法分析词法分析阶段将源代码划分为一个个的单词(Token),并进行分类。
例如,对于C语言而言,单词可以是关键字(如if、for)、标识符(如变量名)、常量(如整数、字符)等。
2.2 语法分析语法分析阶段根据程序的上下文无关文法规则,将单词序列转换为抽象语法树(Abstract Syntax Tree,AST),以便进一步进行语义分析和中间代码生成。
常用的方法有自顶向下的递归下降分析和自底向上的LR(1)分析。
2.3 语义分析语义分析阶段主要检查源程序是否符合给定的语义规则,并对其进行语义翻译。
例如,检查变量是否被声明、函数调用是否正确等。
语义分析通常会生成符号表,用于记录程序中的变量、函数等信息。
2.4 中间代码生成中间代码是一种介于源代码和目标代码之间的抽象表示形式,通常使用三地址码或四元式表示。
中间代码生成阶段将抽象语法树转换为中间代码,以便进行后续的优化和目标代码生成。
2.5 代码优化代码优化阶段对中间代码进行优化,以提高程序的执行效率和资源利用率。
常见的优化技术包括常量传播、公共子表达式消除、循环展开等。
2.6 目标代码生成目标代码生成阶段将优化后的中间代码转换为特定机器上可执行的目标代码。
目标代码可以是汇编语言或机器语言,并且通常需要考虑底层硬件架构的特性和限制。
3. 哈工大编译原理相关的基本原理哈尔滨工业大学(Harbin Institute of Technology)在编译原理领域做出了很多重要贡献,以下列举了几个与哈工大相关的基本原理:3.1 LL(1)文法LL(1)文法是一种上下文无关文法,其中L表示从左到右扫描输入,第一个L表示从左侧推导,1表示每个非终结符的每个输入串只有一个产生式可以应用。
编译原理知识点总结编译原理是计算机科学中的一个重要领域,它研究的是将高级程序语言转化为可执行目标代码的原理和方法。
在软件开发过程中,编译器起着至关重要的作用,因此了解编译原理的知识点对于理解和优化程序的性能至关重要。
1. 词法分析:词法分析是编译器的第一步,它将源代码划分为一个个的词法单元,如关键字、标识符、运算符等。
词法分析器通过正则表达式和有限自动机来实现,可以有效地将源代码转化为词法单元流。
2. 语法分析:语法分析是编译器的第二步,它通过语法规则将词法单元流转化为抽象语法树(AST)。
语法分析器使用上下文无关文法来描述语言的语法结构,并通过LL(1)分析、LR(1)分析等算法来构建抽象语法树。
3. 语义分析:语义分析是编译器的第三步,它对抽象语法树进行语义检查和类型推断。
语义分析器会检查变量的作用域、类型是否匹配等语义错误,并生成中间代码或目标代码。
4. 中间代码生成:中间代码生成是编译器的一项重要任务,它将抽象语法树转化为中间表示形式,如三地址码、四地址码等。
中间代码是一种抽象的低级语言,便于后续的优化和目标代码生成。
5. 代码优化:代码优化是编译器的关键环节,它通过对中间代码进行分析和优化,提高程序的执行效率和资源利用率。
常见的代码优化技术包括常量折叠、循环优化、函数内联等。
6. 目标代码生成:目标代码生成是编译器的最后一步,它将中间代码转化为目标机器代码。
目标代码生成器根据目标机器的特性和指令集,生成可执行的目标代码。
7. 符号表管理:符号表是编译器中用于管理变量、函数等符号信息的数据结构。
符号表包含了符号的名称、类型、作用域等信息,编译器在词法分析、语法分析和语义分析阶段使用符号表进行符号的查找和管理。
8. 错误处理:错误处理是编译器中一个重要的组成部分,它负责检测和报告源代码中的错误。
编译器需要能够准确地定位错误的位置,并给出有意义的错误信息,帮助程序员快速定位和修复错误。
编译原理涉及的知识点非常广泛,上述仅是其中的一部分。
编译原理第一版 (龙式著) 哈尔滨工业大学总结,,, 7.ppt 3.ppt , Chapt10.pptChapt10.ppt, 17-18,,, 30% 70% ,掌握1、编译方式、解释方式及其区别;2、编译程序的构成,工作流程及各部分的功能;3、编译程序中一遍扫描的概念。
了解1、实现编译程序的自展技术;2、编译程序的伙伴程序及构造编译程序的工具;熟练掌握1、程序语言的形式描述,上下文无关文法和语言的形式定义,推导,句型,句子的概念;2、对程序语言来说,已知语言,能写出其文法;反之,根据文法,能描述出文法定义的语言;3、分析树,二义性,短语,直接短语,句柄,用分析树图示对符号串的推导,并解释上述概念。
4、通过对中缀表达式向后缀表达式的翻译掌握编译的基本过程。
掌握1、符号串及其运算;2、2型和3型文法描述在程序语言中的对象。
了解1、文法和语言的分类。
1、已知一个上下文无关语言,写出它的上下文无关文法;反之,已知一个上下文无关文法,描述出它定义的语言。
熟练掌握1、正规表达式与正则集合的定义,正规表达式的等价性;2、 DFA,NFA以及它们之间的转换方法,DFA的化简;3、正规表达式转换成FA;4、词法分析器的功能及词法分析器模型;5、词法分析器的手工构造:对于给定的程序语言,设计出它的词法分析器的输出,画出识别单词的DFA M ,并用某种程序语言实现它。
掌握1、词法分析器的自动生成原理,对于给定的程序语言,用正规表达式描述出它的单词。
了解1、词法分析器自动生成工具LEX和使用方法。
1、已知一个正规集,写出它的正规表达式;2、已知一个正规表达式,写出它的正规集;3、正规表达式和有限自动机的等价变换。
熟练掌握1、语法分析分自顶向下分析和自底向上分析。
自顶向下分析为输入串构造一个最左推导;自底向上分析为输入串构造一个最右推导;2、为构造预测的自顶向下分析文法应满足的条件;3、消除文法中的直接左递归和提取左公因子;4、求FIRST和FOLLOW集合;5、对于给定文法,构造预测的递归分析器和LL(1)分析表;6、句柄的概念和一般自底向上分析过程;7、算符优先分析表(表达式)的构造和算符优先分析算法;8、构造识别文法活前缀的DFA M;9、构造LR(0), SLR(1), LR(1), LALR分析表。
编译原理要点整理//红色字体标注的是重点中的重点,大题的归宿第一章引论1.翻译器,编译器的定义2.编译器工作步骤和流程3.编译器前端后端的概念,理解为什么要有前端后端4.“遍”的概念第二章词法分析1.词法分析器的定义2.词法分析器所要完成的任务3.记号,模式,词法单元概念区分4.串的运算(和,连接,指数,闭包,正闭包)5.正规定义6.转换图(注意开始状态和结束状态以及需要将指针回退的状态)7.不确定的有限自动机(NFA)定义8.确定的有限自动机(DFA)定义9.从正规式到NFA(明确通过正规式如何构造连接运算,和运算,闭包运算的NFA)10.此方法产生的NFA的性质11.从NFA到DFA(子集构造法)12.DFA的化简(合并不可区别状态)13.从语言描述直接到DFA14.了解Lex学完本章:能语言描述改写成正规定义,能将正规定义转化为语言描述,给出一个正规式,能转换成相应的NFA,DFA并化简。
第三章语法分析1.上下文无关文法定义2.区分句子和句型3.最左推导&& 最右推导4.分析树5.文法二义性6.消除左递归&& 提左因子7.了解语言鸟瞰(0型文法:短语文法;1型文法:上下文有关文法;2型文法:上下文无关文法;3型文法:正规式)8.FIRST集合&& FOLLOW集合定义及计算方法9.LL(1)文法定义10.了解自上而下的递归下降的预测分析11.自上而下非递归的预测分析(详细明确预测分析器接受某一输入串时的具体过程,明确栈如何变化,输入输出如何变化)12.预测分析表的构造13.句柄的概念14.自下而上的分析方法:用栈实现移近-归约分析(详细明确预测分析器接受某一输入串时的具体过程,明确栈如何变化,输入输出如何变化)15.LR文法和LR分析算法16.构造SLR分析表(从文法构造识别活前缀的DFA(LR(0)项目集规范族),从DFA构造SLR分析表)17.构造规范的LR分析表(从文法构造识别活前缀的DFA(LR(1)项目集规范族),从DFA构造规范的LR分析表)18.构造LALR分析表(从文法构造识别活前缀的DFA(合并同心的LR(1)项目集),从DFA构造规范的LR分析表)(合并同心项目集可能会引起归约-归约冲突,不会引起新的移进-归约冲突)学完本章:能计算FIRST集合和FOLLOW集合;给定一个文法,能判断是否是LL(1)文法,并为其构造分析表;能构造LR(1)文法的三种预测分析表;明确移近归约分析中的每一个步骤,明确栈如何变化。
《编译原理》知识点总结目录第一章引论第二章高级语言及其语法描述第三章语法分析——自上而下分析第四章属性文法和语法制导翻译第五章语义分析和中间代码产生第六章优化第一章引论一.编译程序(compiler):把某一种高级语言程序等价地转换成另一种低级语言程序(如汇编语言或机器语言程序)的程序二.编译程序的工作的五个阶段:词法分析、语法分析、中间代码产生、优化、目标代码产生1.词法分析任务: 输入源程序,对构成源程序的字符串进行扫描和分解,识别出一个个单词符号。
依循的原则:构词规则描述工具:有限自动机FOR I := 1 TO 100 DO保留字标识符等符整常数保留字整常数保留字2.语法分析任务:在词法分析的基础上,根据语言的语法规则把单词符号串分解成各类语法单位。
依循的原则:语法规则述工具:上下文无关文法3.语义分析与中间代码产生任务:对各类不同语法范畴按语言的语义进行初步翻译。
(变量是否定义、类型是否正确等)依循的原则:语义规则中间代码:三元式,四元式,逆波兰记号,树形结构等。
是一种独立于具体硬件的记号系统。
例:将Z:=X + 0.618 * Y 翻译成四元式为(1) * 0.618 Y T1(2) + X T1 T2(3) := T2 _ Z4. 优化任务:对于前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码。
依循的原则:程序的等价变换规则FOR K:=1 TO 100 DOBEGINM := I + 10 * K;N := J + 10 * K;END4.目标代码产生任务: 把中间代码变换成特定机器上的目标代码。
依赖于硬件系统结构和机器指令的含义目标代码三种形式:a)绝对指令代码: 可直接运行b)可重新定位指令代码: 需要连接装配c)汇编指令代码: 需要进行汇编第二章高级语言及其语法描述2.1.1语法词法规则:单词符号的形成规则。
a)单词符号是语言中具有独立意义的最基本结构。
复习汇总一、第一章概述1.文法与自动机的等价1)0型文法—图灵机2)1型文法—线性有界非确定图灵机3)2型文法—非确定下推自动机4)3型文法—有限状态自动机2.编译技术的应用1)语法制导的结构化编辑器2)程序格式化工具3)软件测试工具4)程序理解工具5)高级语言的翻译工具6)等等3.从面向机器的语言到面向人类的语言(结合第二章第9小点理解)1)面向机器的语言:机器指令,汇编语言2)面向人类的语言:通用程序设计语言,数据查询语言,形式化描述语言(正规式,产生式)等等。
4.各语言的分类(结合第二章第9小点理解)1)过程式语言,面向对象语言:通用程序设计语言。
2)函数语言:面向特点领域的,递归特性。
例如LISP语言3)说明性,非算法式语言:LEX/YACC,SQL。
4)脚本式语言:Shell语言5.语言之间的转换(李静PPT41)1)高级语言之间的转换一般称为预处理或转换。
2)高级语言翻译成汇编语言或机器语言称之为编译。
3)把汇编语言翻译成机器语言称之为汇编。
4)将一个汇编语言程序汇编为可在另一台机器上运行的机器指令称之为交叉汇编。
5)把机器语言翻译成汇编语言称之为反汇编。
6)把汇编语言翻译成高级语言称之为反编译。
6.编译器和解释器1)编译器●源程序的翻译和翻译后的程序的运行是两个不同的阶段。
◆编译阶段:用户输入源程序,经过编译器的处理,生成目标程序。
◆目标程序的运行阶段:根据要求输入数据,得出结果。
2)解释器(凡是可以采用编译器的地方均可以采用解释器)●解释器把翻译和运行结合到一起,编译一段源程序,紧接着就执行它。
这种方式称为解释。
7.解释器的优点(对比与编译器)1)具有较好的动态特性。
2)具有较好的移植特性。
8.解释器的缺点(对比于编译器)1)相比于编译器需花费大量的时间。
2)占用更多的内存空间。
9.编译器的工作阶段(结合第二章6小点红色部分理解)1)源程序->词法分析器->语法分析器->语义分析器->中间代码生成器->代码优化器->目标代码生成器->目标代码2)工作过程中的每个阶段均采用了符号表管理器,出错处理器。
编译原理知识点总结在计算机科学领域中,编译原理是一个重要的研究方向。
它涵盖了从源代码到可执行代码的整个过程,包括词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等多个环节。
本文将简要总结编译原理的一些关键知识点。
1. 词法分析:词法分析是编译过程的第一步,它负责将源代码分割成一个个单词或记号。
在词法分析中,需要定义合法的单词或记号的规则,这些规则通常使用正则表达式或有限自动机来表示。
词法分析器还可以去除空格、注释等无关元素,并将分割后的单词传递给下一步的语法分析。
2. 语法分析:语法分析是编译过程的第二步,它负责根据语法规则检查源代码的结构是否符合语法规范。
常用的语法表示方法有文法、语言、语法分析树等。
语法分析器可以通过递归下降、LL(1)分析、LR分析等方法来实现。
语法分析的主要目标是生成抽象语法树,为后续的语义分析做准备。
3. 语义分析:语义分析是编译过程的第三步,它负责检查源代码的语义是否合法,并对其进行解释或翻译。
语义分析的主要任务包括类型检查、作用域分析、绑定检查等。
在语义分析过程中,常用的方法有符号表、语义规则等。
语义分析器可以检测到潜在的语义错误,并生成中间代码或直接对源代码进行转换。
4. 中间代码生成:中间代码生成是编译过程的第四步,它负责将源代码转换成高级语言或低级语言的中间表示形式。
中间代码是介于源代码和目标代码之间的一种抽象表示,可以方便地进行代码优化和目标代码生成。
常见的中间代码表示方法有三地址码、四元式、虚拟机指令等。
5. 代码优化:代码优化是编译过程的一个重要环节,它可以在不改变程序功能的前提下,提高程序执行效率和资源利用率。
代码优化的目标通常包括减少代码体积、提高程序运行速度、减少存储器的使用等。
常见的代码优化技术有常量折叠、复写传播、循环优化等。
6. 目标代码生成:目标代码生成是编译过程的最后一步,它负责将中间代码转换成可执行的目标代码。
目标代码可以是机器语言、汇编语言或其他类似的形式。
哈工大编译原理一、概述编译原理是计算机科学中的一个重要分支,它研究如何将高级语言编写的程序转化为计算机能够执行的机器语言代码。
哈尔滨工业大学编译原理课程是计算机科学与技术专业的必修课程之一,主要涵盖了编译原理的基本概念、语法分析、语义分析、中间代码生成、目标代码生成等内容。
二、基本概念1. 编译器和解释器编译器和解释器都是将高级语言翻译成低级语言的工具,但两者有着不同的工作方式。
编译器将整个源程序一次性翻译成目标程序,然后再运行目标程序;而解释器则逐行地读入源程序,并立即执行相应的操作。
因此,编译器通常会比解释器运行更快,但需要预先编译整个程序;而解释器则可以直接在运行时进行调试。
2. 语言处理系统语言处理系统包括了编写高级语言程序所需的各种软件工具。
其中包括了编辑器(用于编辑源代码)、汇编器(用于将汇编代码转换为机器码)、链接器(用于将多个目标文件组合成一个可执行文件)等。
3. 词法分析词法分析是编译器中的第一步,它将源程序中的字符序列转换为有意义的单词序列。
在这个过程中,编译器会忽略空格、制表符和换行符等无关字符,并将单词分类为不同的记号(token)类型。
4. 语法分析语法分析是编译器中的第二步,它将词法分析得到的记号序列转换为语法树。
在这个过程中,编译器会根据语言规则进行语法检查,并将语句按照优先级和结合性进行组合。
5. 语义分析语义分析是编译器中的第三步,它对语法树进行处理并生成相应的中间代码。
在这个过程中,编译器会检查变量和常量是否被正确地声明和使用,并进行类型检查、作用域检查等操作。
6. 中间代码生成中间代码生成是编译器中的第四步,它将源程序转换为一种类似于汇编代码的低级表示形式。
在这个过程中,编译器会将高级语言转换为一种通用、可移植且易于优化的形式。
7. 目标代码生成目标代码生成是编译器中的最后一步,它将中间代码转换为机器码或汇编代码。
在这个过程中,编译器会根据目标机器的特定要求进行优化,并生成相应的可执行文件。
编译原理总结
编译原理是计算机科学中的一门重要学科,它研究的是如何将高级编程语言转换成机器能够执行的目标代码。
下面是编译原理的总结:1.编译原理的基本概念:编译原理是指编程语言的翻译过程,它包括词法分析、语法分析、语义分析、代码生成等几个关键环节。
2.编译过程的基本流程:编译过程主要分为两个阶段:分析(Analysis)阶段和综合(Synthesis)阶段。
分析阶段主要是词法分析,语法分析和语义分析等,综合阶段主要是代码生成和代码优化等。
3.词法分析:词法分析是编译过程中的第一个阶段,它将程序源代码转换成一个字符流,并根据定义的词法规则将字符流分成一个一个的词法单元。
4.语法分析:语法分析是编译过程中的第二个阶段,它将词法单元转换成语法树,以便对程序结构进行判断和分析。
5.语义分析:语义分析是编译过程中的第三个阶段,它对程序的语义进行分析,判断程序的合法性,并生成中间代码以便进行后续的基本块划分、指令调度和寄存器分配等操作。
6.代码生成:代码生成是编译过程中的最后一个阶段,它将经过词法分析、语法分析和语义分析的源程序转换成目标代码,使目标代码能够在计算机上运行。
7.代码优化:代码优化是编译过程的特有环节,它通过修改生成的程序代码,去除无用代码、减少程序执行时间和占用空间等,来提高编译效率和程序的运行效率。
综上,编译原理是计算机科学中的一门基础学科,它研究的是将高级编程语言转换为机器能够执行的目标代码的过程。
在实际的编写程序中,我们可以利用编译原理所提供的技术,将程序的编写效率、执行效率和可维护性等方面得到大大提高。
编译原理的复习提纲1.编译原理=形式语言+编译技术2.汇编程序:把汇编语言程序翻译成等价的机器语言程序3.编译程序:把高级语言程序翻译成等价的低级语言程序4.解释执行方式:解释程序,逐个语句地模拟执行翻译执行方式:翻译程序,把程序设计语言程序翻译成等价的目标程序5.计算机程序的编译过程类似,一般分为五个阶段:词法分析、语法分析、语义分析及中间代码生成、代码优化、目标代码生成词法分析的任务:扫描源程序的字符串,识别出的最小的语法单位(标识符或无正负号数等)语法分析是:在词法分析的基础上的,语法分析不考虑语义。
语法分析读入词法分析程序识别出的符号,根据给定的语法规则,识别出各个语法结构。
语义分析的任务是检查程序语义的正确性,解释程序结构的含义,语义分析包括检查变量是否有定义,变量在使用前是否具有值,数值是否溢出等。
语法分析完成之后,编译程序通常就依据语言的语义规则,利用语法制导技术把源程序翻译成某种中间代码。
所谓中间代码是一种定义明确、便于处理、独立于计算机硬件的记号系统,可以认为是一种抽象机的程序代码优化的主要任务是对前一阶段产生的中间代码进行等价变换,以便产生速度快、空间小的目标代码编译的最后一个阶段是目标代码生成,其主要任务是把中间代码翻译成特定的机器指令或汇编程序编译程序结构包括五个基本功能模块和两个辅助模块6.编译划分成前端和后端。
编译前端的工作包括词法分析、语法分析、语义分析。
编译前端只依赖于源程序,独立于目标计算机。
前端进行分析编译后端的工作主要是目标代码的生成和优化后端进行综合。
独立于源程序,完全依赖于目标机器和中间代码。
把编译程序分为前端和后端的优点是:可以优化配置不同的编译程序组合,实现编译重用,保持语言与机器的独立性。
7.汇编器把汇编语言代码翻译成一个特定的机器指令序列第二章1.符号,字母表,符号串,符号串的长度计算P18,子符号串的含义,符号串的简单运算XY,Xn,2.符号串集合的概念,符号串集合的乘积运算,方幂运算,闭包与正闭包的概念P19,P20A0={ε}3.重写规则,简称规则。
编译原理重点第一章1.编译原理所讨论的问题,就是如何把符合人类思维方式的、用文字描述的意愿(源程序)翻译成计算机能够理解和执行的形式(目标程序)。
具体实现从源程序到目标程序转换的程序,被称为编译程序或编译器。
2. 用符号表示的指令被称为汇编指令。
3.汇编指令的集合被称为汇编语言。
4.由汇编语言编写的指令序列被称为汇编语言程序。
5.通用程序设计语言是继汇编语言之后发展起来的应用最广的一类语言。
6.语言分为三个层次:高级语言、汇编语言、机器语言。
高级语言之间的翻译被称为转换或者预处理;高级语言可以直接翻译成机器语言,也可以直接翻译成汇编语言,这两个翻译过程被称为编译;从汇编语言到机器语言的翻译称为汇编;把机器语言翻译成汇编语言或者把汇编语言翻译成高级语言,分别称它们为反汇编和反编译。
7.公认为最早的编译器是50年代末研制的FORTRAN编译器。
8.解释器与编译器的主要区别:运行目标程序时的控制权在解释器而不在目标程序。
9.通用程序设计语言的典型特征之一是抽象,其抽象程度是以程序设计语言所支持的基本结构为特征的,可以大致划分为三种形式:过程、模块(抽象数据类型、ADT)和类。
10.编译器的工作阶段:符号表管理器(词法分析器、语法分析器、语义分析器、中间代码生成器、代码优化器、目标代码生成器)出错处理器。
11. 编译器从左到右扫描输入该语句,首先进行的是此法分析。
词法分析器的输入是源程序,输出的是识别出的记号流。
12.语法分析器以词法分析器返回的记号流为输入构造句子的结构,并以树的形式表示出来,称之为语法树。
13.语义分析器根据语法分析器够早的语法树,进行适当的语义处理。
对于声明语句,进行符号表的查填。
14.编译器生成的目标程序代码的多种形式:汇编语言形式、可重定位二进制代码形式、内存形式。
15.我们把每个阶段将程序完全扫描一遍的工作模式称为一遍扫描。
第二章1.组成语句的基本单元也可根据其在句子中的作用分类,最基本的分类有四类:关键字(保留字)、标示符、字面量、特殊符号。
《编译原理》重点知识总结一、编译器的基本概念1.编译器的定义:编译器是一种将高级语言程序转换为低级语言程序的软件工具。
2.编译器的主要任务:词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成等。
二、词法分析1. 词法分析的任务:将源程序的字符序列转换为有意义的词法单元(token)序列。
2.词法单元的分类:关键字、标识符、运算符、界限符等。
3.词法分析器的实现方法:有限状态自动机(DFA)、正则表达式、词法规则等。
三、语法分析1.语法分析的任务:根据语法规则,将词法单元序列转换为抽象语法树(AST)。
2.语法分析器的实现方法:上下文无关文法(CFG)、递归下降分析、LL(1)分析器、LR分析器等。
四、语义分析1.语义分析的任务:对抽象语法树进行静态语义检查,确定语法结构的含义和约束。
2.语义分析的主要内容:类型检查、作用域分析、常量折叠、中间代码生成等。
五、中间代码生成1.中间代码的定义:介于源程序和目标代码之间的一种抽象表示形式,可以是三地址代码、四元式、虚拟机代码等。
2.中间代码生成的方法:递归下降、语法制导翻译、语法制导的翻译方案等。
六、代码优化1.代码优化的目的:提高程序的执行效率和资源利用率,减小目标代码的体积。
2.常见的代码优化技术:常量传播、代码移动、循环优化、函数内联等。
七、目标代码生成1.目标代码的定义:能够被底层硬件直接执行的机器指令。
2.目标代码生成的方法:模板匹配、基本块划分、寄存器分配等。
八、词法分析器和语法分析器的生成工具1. Flex:用于生成词法分析器的工具。
2. Bison:用于生成语法分析器的工具。
3. Lex:Flex的前身,用于生成词法分析器。
4. Yacc:Bison的前身,用于生成语法分析器。
九、常用的编程语言1. 静态类型语言:C、C++、Java、C#等。
2. 动态类型语言:Python、JavaScript、Ruby等。
3. 函数式编程语言:Lisp、Haskell、Erlang等。
第一章概论1.什么是编译器?输入输出?编译器是将一种语言翻译为另一种语言的计算机程序。
输入:源语言( source language) 编写的程序输出:目标语言( target language ) 编写的程序。
2.汇编语言的优缺点优点:汇编语言大大提高了编程的速度和准确度缺点:编写起来也不容易,阅读和理解很难;而且汇编语言的编写严格依赖于特定的机器,所以为一台计算机编写的代码在应用于另一台计算机时必须完全重写。
3.什么是解释器?与编译器的区别?解释程序是如同编译器的一种语言翻译程序。
与编译器的区别:它立即执行源程序而不是生成在翻译完成之后才执行的目标代码。
4.乔姆斯基分类结构有几种文法?名称?相互关系?4种名称:0型无限制文法1型上下文相关文法2型上下文无关文法3型正则文法相互关系:其中的每一个都是其前者的专门化。
5.什么是扫描器?扫描器的功能是什么?扫描器就是语法分析程序。
功能:依据词法规则,分析由字符组成的源程序,把它分割为一个一个具有独立意义的最小语法单位,即单词。
6.什么是编辑器?IDE中编辑器的新功能编译器通常接受由任何生成标准文件(例如ASCII 文件)的编辑器编写的源程序。
IDE 中编辑器的新功能:尽管编辑器仍然生成标准文件,但会转向正被讨论的程序设计语言的格式或结构。
这样的编辑器称为基于结构的,且它早已包括了编译器的某些操作;因此,程序员就会在程序的编写时而不是在编译时就得知错误了。
从编辑器中也可调用编译器以及与它共用的程序,这样程序员无需离开编辑器就可执行程序。
7.什么是调试器,与编译器的关系调试程序是可在被编译了的程序中判定执行错误的程序。
运行一个带有调试程序的程序与直接执行不同,这是因为调试程序保存着所有的或大多数源代码信息(诸如行数、变量名和过程)。
它还可以在预先指定的位置(称为断点)暂停执行,并提供有关已调用的函数以及变量的当前值的信息。
为了执行这些函数,编译器必须为调试程序提供恰当的符号信息。
8.编译器有哪几个功能模块?各模块的功能及输入输出目标代码9.编译器有哪几个辅助部件?功能?(1)常量表:存放在程序中用到的常量和字符串(2)符号表:与标识符有关:函数、变量、常量以及数据类型。
与编译器的所有阶段交互:扫描程序、分析程序或将标识符输入到表格中的语义分析程序。
(3)错误处理器对源程序中错误的反应。
10.分析,综合已将分析源程序以计算其特性的编译器操作归为编译器的分析部分,而将生成翻译代码时所涉及到的操作称作编译器的综合部分。
当然,词法分析、语法分析和语义分析均属于分析部分,而代码生成却是综合部分。
在优化步骤中,分析和综合都有。
分析正趋向于易懂和更具有数学性,而综合则要求更深的专业技术。
因此,将分析步骤和综合步骤两者区分开来以便发生变化时互不影响是很有用的。
11.前段,后端将编译器分成了只依赖于源语言(前端)的操作和只依赖于目标语言(后端)的操作两部分。
12.遍编译器发现,在生成代码之前多次处理整个源程序很方便。
这些重复就是遍。
13.静态语义?哪几类?程序的语义确定程序的运行,但是大多数的程序设计语言都具有在执行之前被确定而不易由语法表示和由分析程序分析的特征。
这些特征被称作静态语义。
一般的程序设计语言的典型静态语义包括声明和类型检查。
由语义分析程序计算的额外信息(诸如数据类型)被称为属性,它们通常是作为注释或“装饰”增加到树中(还可将属性添加到符号表中)。
14.编译器中第一个考虑目标机的物理特性的模块是:代码生成器______15.T型图中 |S T|S,T,H分别代表什么?|H|语言H(代表宿主语言)编写的编译器将语言S(代表源语言)翻译为语言T(代表目标语言)16.T型图描述自举及移植的过程第二章词法分析正则表达式三种基本操作选择,连结,重复(闭包)有穷自动机的组成元素开始状态,结束状态,状态转换函数正则表达式a.十六进制数字串([0-9]|[A-F])+(x|X)b.包含奇数个a或奇数个b(b*ab*a)*ab*|(a*ba*b)*ba*c.包含偶数个a或偶数个b(a*ba*b)*a*|(b*ab*a)*b*d.a或b必须成对出现(aa|b)*(a|bb)*从正则表达式到NFA (Thompson结构)(1)并置(2)选择(3)重复DFA:构成{S, ∑, T, S0, A}S:状态集合∑:字母表T:转换函数S0:初始状态A:接受状态NFA:NFA构成相同,且Σ可以有ε,转入状态可以是多个状态。
例:S={x, y, z} ∑={a, b, c} T=f S0=x A={y, z}f(x, a) = {x, y} f(x, c) = {z} f(y, b) = {y, z}a*ab*=a+b*a*ab*b=a+b+a*ca+b*|a+b+|a*c=a*(ab|c)第三章上下文无关文法及分析语法分析两类:自顶向下,自底向上。
自顶向下两类:递归下降,LL(1)分析。
文法的表示用BNF(巴克斯范式)形式表示。
二义性文法:每一个字符串产生不同的分析树错只要有一个字符串产生不同的分析树对引起二义性的原因(1)运算的优先级:把具有相同优先权的算符归纳在一组中,并为每一种优先权规定不同的规则。
(2)运算的结合行:用基本情况代替递归,强制重复算符匹配一边的递归。
(3)else的悬挂问题:最近嵌套规则。
出现这三种情况就是二义性文法不是二义性说明原因,是二义性举反例,画出两个不同的分析树。
字符串最左推导,不要少步骤(每次只能对一个非终结符进行替换)。
最左推导最右推导形成的分析树的特点:最左推导是前序遍历,最右推导是后序遍历的倒序??。
最左推导:是指它的每一步中最左的非终结符都要被替换的推导。
最右推导:是指它的每一步中最右的非终结符都要被替换的推导。
最左推导和与其相关的分析树的内部节点的前序编号相对应;而最右推导则和后序编号相对应。
句柄:一个句型的最左直接短语。
(第五章,不考)分析程序的功能及输入输出功能:确定程序的语法输入:由扫描程序生成的记号序列输出:语法树二义性文法及解决办法可生成带有两个不同分析树的串的文法称作二义性文法。
解决方法:(1)设置一个规则,该规则可在每个二义性情况下指出哪一个分析树(或语法树)是正确的。
这样的规则称作消除二义性规则。
(2)将文法改变成一个强制正确分析树的构造的格式。
编译过程中,语法分析器的任务是(1)分析单词串是如何构成语句和说明的(2)分析语句和说明是如何构成程序的(3)分析程序的结构1) 终结符集合T。
2) 非终结符集合N(与T不相交)。
3) 产生式或文法规则A→α的集合P,其中A是N的一个元素,α是(T∪N)∗中的一个元素(是终结符和非终结符的一个可为空的序列)。
4) 来自集合N的开始符号。
第四章自顶向下的分析LL(1)的命名第1个“L”指的是由左向右地处理输入第2个“L”指的是它为输入串描绘出一个最左推导。
括号中的数字1意味着它仅使用输入中的一个符号来预测分析的方向。
(先行一个符号)递归下降分析:将一个非终结符A的文法规则看作将识别A的一个过程的定义。
消除左递归:(1)简单直接左递归→(2)普遍的直接左递归→提取左因子:→First集定义:令X为一个文法符号(一个终结符或非终结符)或ε,则集合First (X) 由终结符组成,此外可能还有ε,它的定义如下:1. 若X是终结符或ε,则First (X) = {X}。
2. 若X是非终结符,则对于每个产生式 X→X1 X2 . . . Xn ,First (X)都包含了First (X1 ) - {ε}。
若对于某个i < n,所有的集合First (X1 ), . . . , First (Xi ) 都包括了ε,则First (X) 也包括了First (X i + 1) - {ε}。
若所有集合First (X1 ), . . . , First (Xn )包括了ε,则First (X)也包括ε。
Follow集定义:给出一个非终结符A,那么集合Follow(A)则是由终结符组成,此外可能还有$。
集合Follow (A)的定义如下:1. 若A是开始符号,则$就在Follow (A)中。
2. 若存在产生式B→αAγ,则First (γ) - {ε}在Follow (A)中。
3. 若存在产生式B→αAγ,且在First (γ)中,则Follow (A)包括Follow(B)。
LL(1)证明定理:1. 在每个产生式A→α1 | α2 | . . . |αn中,对于所有的i 和j:1≤i,j≤n,i≠j,First (αi ) ∩First (αj )为空。
2. 若对于每个非终结符A都有First (A) 包含了ε,那么First (A)∩Follow(A)为空。
自顶向下的基本原理:在最左推导中描述出各个步骤来分析记号串输入。
自顶向下的关键问题:(which rules to use Ch4_2 P6)(P114)第六章语义分析语义分析:计算编译过程所需的附加信息。
语义分析的分类(1)程序的分析,要求根据编程语言的规则建立其正确性,并保证其正确执行。
(2)由编译程序执行的分析,用以提高翻译程序执行的效率。
静态语义分析包括(1)执行分析的描述(2)使用合适的算法对分析的实现属性:属性是编程语言结构的任意特性。
属性在其包含的信息和复杂性等方面变化很大,特别是当它们能确定时翻译/执行过程的时间。
属性的典型例子有:•变量的数据类型。
•表达式的值。
•存储器中变量的位置。
•程序的目标代码。
•数的有效位数。
联编:属性的计算及将计算值与正在讨论的语言结构联系的过程称作属性的联编。
联编时间:联编属性发生时编译/执行过程的时间称作联编时间。
执行之前联编的属性是静态的,执行期间联编的属性是动态的。
在如C或Pascal这样的静态类型的语言中,变量或表达式的数据类型是一个重要的编译时属性。
表达式的值通常是动态的,编译程序要在执行时生成代码来计算这些值。
变量的分配可以是静态的也可以是动态的,这依赖于语言和变量自身的特性FORTRAN77中所有的变量都是静态分配。
LISP中所有的变量是动态分配的。
C和Pascal语言混合了静态和动态的两种变量分配。
程序的目标代码无疑是一个静态属性。
数的有效位数在编译期间是一个不被明确探讨的属性。
属性文法:确定语言实体的属性或特性,它们必须进行计算并写成属性等式或语义规则,并描述这些属性的计算如何与语言的文法规则相关。
这样的一组属性和等式称作属性文法。
符号表的主要操作:插入,查找,删除。
符号表的功能:(1)建立存储信息(2)类型检查(3)数据地址第七章运行时环境运行时环境:目标计算机的寄存器以及存储器的结构,用来管理存储器并保存指导执行过程所需的信息。