编译原理知识点总结 哈工程
编译原理知识点总结哈工程

编译原理知识点总结哈工程第一章概论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表示每个非终结符的每个输入串只有一个产生式可以应用。
哈工大编译原理.ppt

procedure SORT(CH);
{ case CH of ‘字母’:
‘字母’: call RECOGID(CH,TOKEN);
‘/’: call HANDLECOM(CH,TOKEN);
‘数字’: call RECOGDIG(CH,TOKEN);
‘’‘
call RECOGSTR(CH,TOKEN);
if TOKEN!=‘ ’ then call PRINTERR(‘注解未完’);
TOKEN:=‘ ';
return }
25
识别界限符(RECOGDEL) 输入:CH内含单界限符; 输出:各种界符的TOKEN字; procedure RECOGDEL(CH,TOKEN); { case CH of
otherwise call RECOGDEL(CH,TOKEN);
end case;
write TOKEN into TOKEN文件;
Return } 23
procedure RECOGID(CH,TOKEN);
{ WORD:= ‘ ’; WORD:=WORD||CH; Repeat {
call GETCH(CH);
%%
标识符 {入口地址=LOOKUP();}
%%
LOOKUP()
31
辅助过程是动作需要的,这些过程用C书 写,可以分别编译.例:LOOKUP()
32
28
声明 %% 翻译规则 %% 辅助过程
29
声明包括变量,符号常量和正规定义式。
翻译规则的形式为:
p1
{ 动作1}
p2
{ 动作2}
…
…
pn
{ 动作n}
30
每个pi是正规定义式的名子,每个{动 作i}是正规定义式pi识别某类单词时,词 法分析器应执行动作的程序段。用C书 写。
编译原理知识点总结

编译原理知识点总结编译原理是计算机科学中的一个重要领域,它研究的是将高级程序语言转化为可执行目标代码的原理和方法。
在软件开发过程中,编译器起着至关重要的作用,因此了解编译原理的知识点对于理解和优化程序的性能至关重要。
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分析表。
哈工大编译原理4-2

( 0 0 0 1
) 0 0 0 0
i 0 0 0 1
27
算法4.1 设置F某一元素为真的过程: 算法4.1 设置F某一元素为真的过程: PROCEDURE INSERT(P,a) IF F[P,a]=0 THEN BEGIN F[P,a]=1; PUSH(P,a); END
28 计算机学院 辛明影
S
12 计算机学院 辛明影
句子 F+id*id 对应的语法树 短语:F 直接短语:F 句柄:F E E T F + T F id2 T * F id3 Id2 Id2 Id3 Id3 id2*id3 id1+id2*id3
三、用栈实现移进归约分析 移入归约分析器使用了一个栈来保存文 法符号,用输入缓冲区来存放待分析的 串w, $为栈底符号和输入结束标记。 为栈底符号和输入结束标记。 初始时,栈和输入串的情形为: 栈 输入串 w$ $ 终止时,形成如下格局: 栈 输入串 $S $
辛明影
输入串 id1*id2+id3 $ *id2+id3 $ *id2+id3 $ *id2+id3 $ id2+id3 $ +id3 $ +id3 $ +id3 $ +id3 $ id3 $ $ $ $ $ $
动作 prepare 移入 归约F→id 归约 归约T→F 归约 移进 移进 归约F→id 归约 归约T→T*F 归约T→T*F 归约E→T 归约 移入 移入 归约F→id 归约 归约T→F 归约 归约E→E+T 归约 access
2 计算机学院 辛明影
移入归约分析法为输入串构造分析 树时从叶节占点(底端)开始, 树时从叶节占点(底端)开始,向根节 顶端)前进。 点(顶端)前进。 该过程可看成是把输入串w“归约 归约” 该过程可看成是把输入串 归约” 成文法开始符号的过程 如果每一步都能恰当地选择子串, 如果每一步都能恰当地选择子串, 我们就可以得到最右推导的逆过程----最 我们就可以得到最右推导的逆过程 最 左归约 文法4.1: 文法 : 规范归约:最左归约 最左归约 S→aABe A→Ab|b 规范推导:最右推导 最右推导 B→d
编译原理要点整理

编译原理要点整理//红色字体标注的是重点中的重点,大题的归宿第一章引论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)文法的三种预测分析表;明确移近归约分析中的每一个步骤,明确栈如何变化。
哈工大编译原理

……
……
汇编程序 机器语言程序 反汇编程序 汇编语言程序
编译程序 高级语言程序 反编译程序
2011-9-25
图1.5 主要翻译程序汇总
12
1.3 编译程序总体结构
法分析器 表 语法分析器 格 管 理 语 分析 器 器
2011-9-25 13
出 错 处 理
语法
器
1、词法分析 、
例:
sum=(10+20)*(num+square);
1.1 程序设计语言
控制系统的工作——以功能封装为特征 以功能封装为特征 控制系统的工作 1011 1000 0000 0000 0100 1100 上的shell (B8004C) 如UNIX上的 上的
1100 1101 0010 0001 (CD21)
2011-9-25
3
程序设计语言的分类
强制式(命令式)语言 强制式(命令式)语言(Imperative Language)
构造分析树 指出语法错误 指导翻译
输入: 输入:token序列 序列 输出: 输出:语法成分
2011-9-25 16
2、语法分析 、
sum=(10+20)*(num+square);
2011-9-25
17
3、语义分析 、
语义分析(semantic analysis)一般和语法 语义分析 一般和语法 分析同时进行,称为语法制导翻译 分析同时进行,称为语法制导翻译 (syntax-directed translation) 功能: 功能:分析由语法分析器识别出来的语 法成分的语义
+③*+①a b+②@c d/ef
逆波兰表示(Reverse Polish / Suffix / Postfix 逆波兰表示 notation) ——也就是后缀表示 也就是后缀表示
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章概论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)数据地址第七章运行时环境运行时环境:目标计算机的寄存器以及存储器的结构,用来管理存储器并保存指导执行过程所需的信息。