编译程序:将源程序翻译成目标程序
源程序:多为高级语言,eg:c,c++;
目标程序:汇编语言/机器语言。
编译过程:
词法分析——语法分析——语义分析——中间代码的生成——代码优化——目标代码的生成
词法分析:从左自右读入源程序,识别出一个个的单词。
语法分析:在词法分析的基础上将单词序列分解成语法短语。
语义分析:审查源程序有无语义错误,收集类型信息。
中间代码的生成:进行以上阶段分析之后的源程序叫做中间代码。
中间代码的特点:1.易生成;2易翻译成目标代码。
代码优化:优化中间代码。
目标代码的生成:与硬件有关,较为复杂。
前端:主要依赖与源语言而与目标机器无关的阶段
后端:依赖与目标机器的阶段
解释程序:接受某个语言的源程序并立即运行这个源程序
编译程序输出目标代码,解释程序输出结果。
解释程序的输入:源程序+初始数据;输出:结果
编译程序的输入:源程序;输出:目标程序
目标程序+数据 作为输入到 运行程序中去 才能得到 结果
根本区别:是否生成目标代码
处理源程序的软件工具:
1.语言的结构化编辑器:源程序的正文编辑,检查括号匹配,输入正确,检查语法错误
2.源程序的调试工具:检查结果与遗体是否一致,一行行跟踪
3.程序格式化工具:分析源程序,使其结构清晰
4.语言程序测试工具:
分为静态分析器:不运行程序;动态分析器:比较运行结构和期望;
5.程序理解工具:对程序进行分析,确定模块间的调用关系,画出控制流程图,帮助用户理解程序,
6高级语言之间的转换工具:转换高级语言
语言分类
语法:构成句子各个记号之间的组合规律;
语义:各个记号的含义
语用:各个记号的来源,使用以及影响;
形式语言:只考虑语法层面,抽象的定义为一个数学系统;形式代表语言的规则只能以什么符号串能出现表示
文法:描述词法,语法的工具,对含有无穷句子的语言进行有穷表示字母表:元素的非空有穷集合
符号:字母表中的元素
符号串:符号的有穷序列
文法G(Vn,Vt,P,S)
Vn:非终结符;Vt:终结符;P:产生式;S:开始符号
句型:由文法的开始符号推导出的符号串;
句子:由文法的开始符号推导出的终结符符号串;
语言:句子的集合;
重点**语言和文法的转换
文法的等价:不同的文法能过产生相同的语言
文法的类型:(限制产生式)
1.0型(PSG):产生式的左部至少有一个非终结符
2.1型(CSG):a1Aa2–>a1Ba2 只有上下文相同时才可以替换
3.2型(CFG):上下文无关
4.3型(RG):A–>aB/A–>a或者A–>Ba/A–>a;
最右推导为规范推导,所得句型为规范句型;
二义文法:句子对应不同的语法树/最左(右)推导;
改造二义文法:规定优先顺序和结合律;
句型分析:识别一个符号串是否为文法的句型
自上而下的分析法:开始符号–>输入符号串
自下而上的分析法:输入符号串–>开始符号
短语:
直接短语:
句柄:最左直接短语;
文法中不得有二义;不得有多余;一般不含空规则;
词法分析:逐个读入源程序的符号,输出单词符号;
单词符号:1.关键字 2.标识符 3.常数 4.运算符 5.界符
二元式(单词种类,单词的值)/(标识符种类,值的地址)
词法分析和语法分析的接口方式:
方式一: 词法分析的输出是二元式,经过中间文件作为语法分析的输入;
方式二:语法分析调用词法分析程序,词法分析程序返回值为一个单词;
词法分析作为独立阶段的原因:
1.使编译程序更加简洁;
2.提升编译效率;
3.增加可移植性;
单词的表示方式:
1.正则文法 2.正则式 3.有穷自动机 三者可以互相转换
考点:正则文法和正则式的互相转换
有穷自动机(FA):用来识别正则集的识别装置;
确定的有穷自动机(DFA):五元组(K,∑,f,S,Z)
K:有穷状态集;
∑:输入字符的集合(有穷字母表);
f:转换函数 K×∑到K的映射;
S: 唯一的初态;
Z:不唯一的终态;
L(M) DFA上的接受的所有句子
符号串集V在∑*是正规的 当且仅当 存在一个∑上的DFA 使得 V=L(M);
不确定的有穷自动机(NFA):五元组(K,∑,f,S,Z)
K:有穷状态集;
∑:输入字符的集合(有穷字母表);
f:转换函数 K×∑到**K+**的映射;K+为K的子集;
S: 不唯一的初态;
Z:不唯一的终态;
ε可以被NFA接受的两种状态
1.存在即初态又是终态的节点;
2.存在一条从初态到终态的ε道路;
对于每个NFA 存在一个DFA 使得 L(M’)=L(M)
状态I的ε闭包(ε-closure{I}):表示状态I中的S经过弧ε所能达到的状态的集合;
弧转换(move(I,a)):I集合中的状态经过a可以到达的全体;
NFA N={K,∑,f,K0,Kt}
DFA M={S,∑,d,S0,St}
转换规则:
考点:NFA 用子集构造法 构造DFA P51
DFA的化简:
1.消除多余状态;
多余状态:1.开始状态无法到达的状态;2.无法到达终态的状态;
2.合并等价状态;
等价状态:1.同是终态或者非终态;2.分别从两个状态出发经过同样的弧得到的状态等价;
合并的方法:跨子集;
考点:DFA的化简
FA和正规式的转换:
FA到正规式:利用P54的消去规则;
正规式到FA:主要R*=
正规文法和NFA的转换:
正规文法到FA:状态集输入字符集相同;
该章考点:正规式,正规文法 和NFA之间的转化 NFA用子集法转为DFA DFA的化简
语法分析的作用:识别词法分析的单词字符串是否是给定文法的正确句子;
方法分类:
自顶向下:
1.确定的分析方式(主要);2.不确定的分析方式(理论)
. 自底向上:
1.算符优先分析,2.LR 分析;
自顶向下:面向目标分析法
First集合:右部的首个非空的非终结符的集合;
Follow集合:A的Follow集为A后的非终结符的First集合;若A后的非终结符可以为空,则$属于Follow(A);
计算Follow集:
Select集合:A–>a ;Select(A)若A后的非终结符不空,=First(a);
若A后的非终结符为空 = {First(a)-{ε}}并上Follow(A);
计算Select集合:
LL(1)文法:1.上下文无关文法;2.A产生的 a,b 的Select集交集为空;3.a,b不能同时推空;
判别LL(1)文法:左部相同的Select集合交集为空;
左公共因子:S–>aA/S–>aB;此时的a为左公共因子;
必要条件:含有左公共因子/或者含有直接或间接左递归的文法一定不是LL(1)文法;
充要条件:不含空产生式;无左公共因子;无左递归;
直接左递归:A–>Ab;
消除直接左递归:改为右递归;
eg:S–>Sa S–>b; 改为 S–>bS’ S’–>aS’ S’–>ε;
间接左递归:A–>Bb B–>Aa
消除间接左递归:间接变直接;直接变右递归;
间接变直接:直接将B–Aa 待入到A–Bb 中;
考点:消除文法的左递归
确定的自顶向下的分析方法:
1.递归子程序法:
为每个非终结符编写一个递归过程;
2.预测分析法:
预测分析程序+栈+预测分析表
该章重点:预测分析法的使用
1.消除左递归;
2.判断是否是LL(1)文法;其中求ε,First集,Follow集,Select集的方法
3.构造预测分析表;
4.利用栈和预测分析表来预测输入串;
自底向上:利用栈移进----归约;
关键:如何确定句柄(栈顶的符号串)
分类:1.简单优先分析;2.算符优先分析
简单优先:考虑算符之间的优先级;
算符优先:遇到可以归约的就直接归约;
简单优先关系的定义:
=:X=Y 当且仅当 存在A–>XY;
<: X
>:X>Y当且仅当 存在A–>BD q且B±->X,D*–>Y;
简单优先文法:
1.任意两个算符之间只能有一种优先级;
2.任意两个产生式没有相同的右部;
3.不含空产生式;
算符优先文法:
1.不含两个相邻的非终结符;
2.若Ab或者bA出现在句型a中,任何含有b的短语肯定含有A;
3.不含空产生式
算符优先关系的定义:
=:a=b 当且仅当 A–>ab 或者 A–>aBb;
<: aaB 且 B±->b 或者B±->Cb;
>:a>b 当且仅当A–>Bb 且 B±->a或者B±->aC;
考点:算符优先关系表的构造
构造方法:1.定义法;2.关系图法;
定义法:
素短语:包含一个终结符且除自身外不再含有其他素短语;
最左素短语:句型最左边的素短语;
LR分析器的组成:总控程序+分析表+栈;
可归前缀:归约钱符号栈中的内容;
活前缀:形成可归前缀之前包括可归前缀在内的句型的前缀;
构造识别活前缀的有穷自动机:
形式定义法:1.先求右部的LC();2.求产生式的LR(0)C;
项目法:用 “·”号表示移进,归约;
LR(0)项目集规范族:识别文法活前缀的DFA项目集;
1.拓广文法:用一个新的S’来产生S;
2.构造规范集族;
3.判别冲突;
4.根据项目集族构造DFA;
SLR文法根据非终结符的FOLLOW集解决冲突;
LR(K):项目集右心与向前搜索符组成,搜索长度为k;
LALR(1):对LR(1)项目集规范族合并同心集;