1.编译程序的每个工作阶段的主要任务
词法分析(lexical analysis or scanning):自动分词,词性标注。 从左到右扫描将一个一个字符读入源程序,对构成源程序的字符流进行扫描和分解,从而识别一个单词。
语法分析(syntax analysis):在词法分析的基础上,将单词分解成各类语法词语,并表示成"语法树"。判断由词构成的短语的排列顺序是否符合对应编程语言的语法。 语法分析特点: 1.每一种“高级语言”都有自己的语法规则 2.每一种“高级语言”的编译(解释)程序都将一定将他的语法规则内嵌在其中。
语义分析(semantic analysis):按照语法树的层次关系和先后顺序,进行类型审查,审查每个算法是否符合语言规范,不符合时应报告错误。(类型审查,作用范围检查)类型分析如,java语言中,public,private,protected的区别 特点:分为静态语义分析和动态语义分析,并且静态语义分析可以在编译时被实现,而动态的则不可以。
中间代码生成:在语法和语义分析完成后,将源程序变换成一种“内部表示形式”,该代码是一种简单的记号系统,三元组或者四元组。
代码优化:对中间代码进行变换,使代码更加高效。
目标代码生成:将中间代码变换成特定机器上的绝对指令或者可重定位的汇编指令代码。主要与硬件系统和指令含义有关。
除此之外还包括表格管理程序和出错管理程序
题目:
1.错误匹配
1)else没有匹配的if:语法分析
2)数组下标越界:语义分析
3)使用的函数没有定义:语法分析
4)在数中出现非数字字符:词法分析
按逻辑上划分,编译程序第二步工作是 C。
A. 语义分析 B. 词法分析 C. 语法分析 D. 代码优化
编译过程中,语法分析器的任务就是B__。
A.分析单词是怎样构成的 B.分析单词串是如何构成程序的
C.分析语句和说明的语义 D.分析程序的词法错误
编译程序绝大多数时间花在___D__上 。 A. 词法分析 B. 语法分析 C. 语义分析 D. 表格管理
汇编程序是将_ __ 翻译成 ;编译程序是将 __翻译成___ _。B ①高级语言 ②汇编语言 ③机器语言 ④高级语言或汇编语言 ⑤汇编语言或机器语言 A.①③①⑤ B. ②③①⑤ C. ④③①③ D. ②③①③
2.根据句子或句型,画出语法树,求短语、简单短语和句型
如果S->* αAβ and A->+γ,则称γ是句型αγβ的相对于变量A的短语 。 如果S->* αAβ and A->γ,则称γ是句型αγβ的相对于变量A的直接(简单)短语 最左直接短语叫做句柄。
如果S->* x,则称x是文法G[S]的句型。
句柄是最左边的直接短语
书本31页
课后习题35题
(85条消息) 编译原理 —— 短语、直接短语、素短语和句柄starter_zheng的博客-CSDN博客编译原理短语
3.将正则文法转换成正则式
(85条消息) 编译原理-正则文法与正则表达式的相互转化xigama的博客-CSDN博客正则文法
4.用子集法将NFA转换为DFA:改造(如果需要的话)使其仅有一个初态和一个终态,构造状态集的转换表,重新为状态编号,得到DFA
PPT第三章25页
5.自动机的简化:分割法
课本53页
练习题
确定的有穷自动机的最小化 - 我闪啊 - 博客园 (cnblogs.com)
6.由正则表达式,设计相应的最小DFA。三个步骤:由三个分裂规则画出NFA;确定化得到DFA;DFA的化简
(85条消息) 正则表达式转NFA懒猫gg的博客-CSDN博客正则表达式转nfa
(85条消息) 【编译原理总结】由正则式构造等价的DFA并将其最小化hanmin822的博客-CSDN博客编译原理等价状态
7.求首符号集(对符号串)、向前看集(对非终结符)、可选集(对规则)
(85条消息) 编译原理(第四章)——首符号集和后继符号集的求法mengsz1的博客-CSDN博客后继符号集
first,follow,select
(85条消息) 编译原理之first集,follow集,select集解析GroovRain的博客-CSDN博客first follow select集
8.算符优先分析法:素短语、最左素短语的概念和求法
(85条消息) 短语,直接短语,素短语与最左素短语(语法树求法)驼驼学编程的博客-CSDN博客素短语和直接短语的区别
9.构造LR(1)项目集规范族以及识别活前缀的DFA,并得LR(1)分析表
《编译原理》LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析 - xpwi - 博客园 (cnblogs.com)
(85条消息) 编译原理学习笔记(二十六)~习题:构造基于LR(0)、LR(1)项目的识别活前缀的DFA_海轰Pro的博客-CSDN博客
10.对句子进行LR(1)分析,写出分析过程
(85条消息) 《编译原理》LR 分析法与构造 LR(1) 分析表的步骤 - 例题解析肖朋伟的博客-CSDN博客lr(1)分析表
(85条消息) 编译原理学习笔记(十)~LR(1)分析海轰Pro的博客-CSDN博客lr(1)
11.四元式表示法
(85条消息) 编译原理——将代码翻译成四元式序列A__Plus的博客-CSDN博客四元式序列
《编译原理》复习提纲
第一章:概述
[考点]
- 编译程序的地位:系统软件
编译程序是系统软件中资格最老的成员之一
- 编译程序和解释程序的根本区别:是否生成目标代码(解释程序不生成目标代码)
- 源程序的执行过程:两种形式
直接生成机器代码程序:编译-运行
目标程序是汇编语言程序:编译-汇编-运行
- 编译程序的6个工作:词法分析、语法分析、语义分析、代码生成(4个必须完成)、中间代码生成、代码优化
- 编译程序的每个工作阶段的主要任务
(1)词法分析(扫描器):
任务:输入源程序;扫描、分解字符串,识别出一个个单词
- 语法分析(分析器)
任务:在词法分析的基础上,将单词符号串转化为语法单位,并确定整个输入串是否构成语法上的正确程序。
- 语义分析(语义处理)
- 中间代码生成
任务:对语法分析所识别出的各类语法范畴,分析其含义,并进行初步翻译(产生中间代码)。
所做转换:语法范畴->中间代码
依据:语义规则->属性文法
- 代码优化
任务:对于代码(主要是中间代码)进行加工交换,以期能够产生更为高效(省时间和空间)的目标代码
(6)目标代码生成:
任务:将中间代码变换成特定机器上的低级语言代码
编译程序的几种常用开发技术
自编译
交叉编译
自展
移植
第二章:文法和形式语言
[考点]
- 基本概念:文法和语言、BNF表示法、推导和归约、规范推导(最右推导、最左归约)、句型、句子和语言
- 写出句子或句型的最左推导和最右推导的过程
- 给定文法,写出由此生成的语言
- 给定语言,写出相应的文法
- 根据句子或句型,画出语法树,求短语、简单短语和句型
- 证明文法的二义性,由句子或句型画出2棵不同的语法树,由此证明文法是二义性的。
- 可推出符号和活的非终结符,化简为等价文法。
- 文法和语言的分类:4种,了解包含关系,1型文法不允许空规则,2型(上下文无关文法)和3型(正则文法)文法的产生式的基本规则
- 由正则表达式写出正则集。
10.将正则文法转换成正则式
第三章:自动机
[考点]
- 状态转换图的概念:描述有限自动机的工作状态,用于识别一定的符号串。
- 有限自动机的分类:DFA和NFA
- DFA:初始状态仅有一个,单值映射
- 已知语言,画出DFA。
- 已知DFA写出对应的语言。
- NFA:初始状态可以有多个,多值映射
- 用子集法将NFA转换为DFA:改造(如果需要的话)使其仅有一个初态和一个终态,构造状态集的转换表,重新为状态编号,得到DFA
- 自动机的简化:分割法
- 由正则表达式,设计相应的最小DFA。三个步骤:由三个分裂规则画出NFA;确定化得到DFA;DFA的化简。
第四章:语法和语义分析
[考点]
- 求首符号集(对符号串)、向前看集(对非终结符)、可选集(对规则)
- 语法分析方法分类:自顶向下分析和自底向上分析
- 自顶向下分析法:回溯问题和左递归带来的无限循环问题
- 消除文法的左递归的方法
- LL(1)分析法:含义:第一个“L”:从左到右扫描源程序,第二个“L”:最左推导,“1”:向前看1个符号,即查看输入串的当前符号
- LL(1)文法的概念:对于文法G[S],其每个非终结符号的不同规则具有不相交的可选集Select,不含左递归
第五章:算符优先分析法
[考点]
- 简单表达式的逆波兰表示法,P159题6.7,注意运算符的优先级,单目减运算符的优先级高于乘方、乘除运算
- 算符优先分析法:素短语、最左素短语的概念和求法
- 判断两个相邻的终结符之间的优先关系,由优先关系的定义求得。利用算符文法中每个非终结符的FirstVt和L astVt
第六章:LR(k)分析法
[考点]
- 自底向上分析法:移进-归约冲突和归约-归约冲突
- LR分析法的分析过程
- LR(0)、SLR(1)、LR(1)文法的判断,由状态描述序列中每个状态的项目集是否存在冲突,冲突能否解决来判断
- 构造LR(1)项目集规范族以及识别活前缀的DFA,并得LR(1)分析表
- 对句子进行LR(1)分析,写出分析过程
第八章:中间语言
[考点]
- 中间代码生成的目的:便于代码优化和便于目标程序的移植
- 逆波兰表示法
- 四元式表示法
- 三元式表示法
- 树表示法
第十章:优化
[考点]
- 分类:与机器无关的优化工作(4个)
删除多余运算
删除无用赋值
其他优化技术
局部优化
全局优化
循环优化