编译原理复习.docx
《编译原理复习.docx》由会员分享,可在线阅读,更多相关《编译原理复习.docx(13页珍藏版)》请在冰豆网上搜索。
编译原理复习
1.正则表达式:
形如0*(1|23)(0|12)0(1|13)*
正规文法:
形如S->aB,S->a或S->Ba,S->a
DFA(确定的有限自动机):
形如
正规式转化为NFA
2.确定的和非确定的有限自动机之间的重要区别是:
1、状态转换函数是一个多值映射;反映在状态转换图上即对同一弧标记到达的状态结点不惟一。
2、NFA初态集,而DFA是一个唯一的状态.NFA存在空弧标记
DFA的三种表示:
(1)用转换函数(用f也行)
(2)转移矩阵(表)
(3)状态转换图
3.NFA的确定化
空-closure(f(A,a))的含义(闭包)
NFA中从集合A中的状态出发,先经若干空箭弧,接着经标记为a的箭弧到达的状态集合的空-closure。
必须要经过a,不经过a的状态不能算,经过a后经过空弧的状态算。
划归后的状态中,包含开始状态的所有状态都为初态,包含结束状态的所有状态都为终态。
4.DFA的最小化
一个DFAm可以通过消除多余状态和合并等价状态而转换成一个最小的与之等价的DFAm’
多余状态:
(1)从该自动机的开始状态出发,任何输入串也不能
到达的那个状态
(2)从该状态出发没有通向终态结的道路
合并等价状态时:
终结状态和非终结状态分成两个不同的状态,然后再根据不同的状态转移划分之后的状态集合。
空状态与任何状态都不相同。
5.最左推导,最右推导
最左推导:
从最左边的一个非终结符开始推导
最右推导:
从最右边的一个非终结符开始推导
6.句柄,直接短语,短语
句柄:
最左边的直接短语
直接短语:
子树只含有两层节点的短语树的叶子节点
短语:
所有子树(包括自己)的叶子节点
7.二义性文法判断
判断某一文法是否是二义性文法。
(举一反例,一个句子有两个不同结构的语法分析树)
7.LL
(1)文法
一定要消除左递归(包含间接左递归)和左公因子!
间接的左递归就还原成直接的左递归再去消除
8.FIRST,FOLLOW集合
FIRST(a)是a所有可能推导的开头终结符号或可能推导出的空元素所构成的集合
Follow(A)是所有句型中出现在紧接A之后的终结符号或#所构成的集合
若有S->...A,其中S为开始状态,则规定#在FOLLOW(A)中。
且开始符号S的follow中有#元素
若A->aBβ,则把first(β)中所有非空的元素加入follow(B)中。
若S->aB...,若B后面皆为空,则把FOLLOW(S)并入follow(B)中。
9.LL
(1)预测分析表构造
正常的放在左边的非终结符对应的该句的first集合中
推出空的放在左边的非终结符的follow集合中
设文法G(S):
S→S+aF|aF|+aF
F→*aF|*a
⑴消除左递归和回溯;
⑵构造非终结符的FIRST和FOLLOW集合;
⑶构造预测分析表
给出句子a*a+a*a的LL
(1)分析过程
(格式:
栈,输入缓冲区,动作)
⑴
S→aFS'|+aFS'
S'→+aFS'|ε
F→*aF'
F'→F|ε
⑵
FIRST(S)={a,+}FOLLOW(S)={#}
FIRST(S')={+,ε}FOLLOW(S')={#}
FIRST(F)={*}FOLLOW(F)={+,#}
FIRST(F')={*,ε)FOLLOW(F')={+,#}
步骤符号栈输入串所用的产生式
1#Sa*a+a*a#S->aFS’
2#S’Faa*a+a*a#
3#S’F*a+a*a#F->*aF’
4#S’F’a**a+a*a#
5#SF’aa+a*a#
6#SF’+a*a#F’->3
7#S+a*a#S->+aFS’
8#S’Fa++a*a#
9#S’Faa*a#
10#S’F*a#F->*aF’
11#S’F’a**a#
12#S’F’aa#
13#S’F’#F’->3
14#S’#S’->3
15##ACC
当要使用产生式时,要将产生式右边的所有的字符倒序压入堆栈,符号中里面的产生式左端的非终结符要弹出。
10.LR(K)
当进行SLR判断时,出现移进规约冲突后,根据推导表达式左边的非终结符的FOLLOW集来确定下一步的动作是什么
进行规约操作后,根据规约式右边符号个数弹出状态栈状态,然后,根据状态栈栈顶状态对应规约表达式左边的非终结符查找goto表,找到需要跳转的状态,压入状态栈,并且该终结符放入符号栈。
其中LR(0)(1)(1),所以在判断LR类型时,从LR(0)开始检查。
11.翻译模式
对于一个翻译模式,若采用自顶向下分析,必须消除左递归和提取公共左因子。
自顶向下分析一般需要使用继承属性来分析,且一般初始值在根节点的继承属性中设置,输出值在每一个叶子节点,或者最后回溯到根节点输出值。
自底向上分析一般需要使用综合属性来分析,且一般初始值在叶子节点的综合属性中设置,输出值在根节点。
继承属性的翻译模式是求其右边的非终结符的继承属性的值
综合属性的翻译模式是求其推导式左边的非终结符的综合属性的值。
左递归翻译模式
A→A1Y{A.a:
=g(A1.a,Y.y)}
A→X{A.a:
=f(X.x)}
消除左递归,文法转换成
A→XR
R→YR|ε
再考虑语义动作,翻译模式变为:
A→X{R.i:
=f(X,x)}
R{A.a:
=R.s}
R→Y{R1.i:
=g(R.i,Y.y)}
R1{R.s:
=R1.s}
R→ε{R.s:
=R.i}
经过转换的翻译模式引入了R的继承属性i和综合属性s。
S→L.L
S→L
L→LB|B
B→0|1
构造一个翻译模式,计算该二进制数的值(十进制的值)。
12.中间代码
三地址码序列语句,又叫四元式:
形如IfB>=Cgoto(8)
注意GOTO语句的数量,一个else就要写一个goto,一个while的最后需要一个goto
13.基本块的划分
首指令:
1.指令序列的第一个三地址指令是一个首指令
2.任意一个条件或无条件转移指令的目标指令是一个首指令
3.紧跟在一个条件或无条件转移指令之后的指令是一个首指令
基本块:
包含当前的首指令,到下一个首指令之前的一句代码
流图是以基本块为节点,而DFA的DAG图中每一个节点要把基本块里面的代码写出来。
流图中无入度的节点删除(除首节点)。
DAG中与活跃变量无关的节点都可以删除,相同的变量留一个就可以。
支配节点:
如果从流图的入口结点到结点n的每条路径都经过结点d,则称结点d支配(dominate)结点n,记为ddomn。
每一个节点都支配他自身。
14.循环优化:
(变量的数目不能变少)
①代码外提:
对循环不变计算语句s:
x=y+z移动的条件
(1)s所在的基本块是循环所有出口结点(有后继结点在循环外的结点)的支配结点
(2)循环中没有其它语句对x赋值
(3)循环中对x的引用仅由s到达
②强度削弱:
是指把程序中执行时间较长的运算替换为执行时间较短的运算(乘法换成加法,除法换成乘法)
③删除归纳变量:
如果在循环中对变量i只有形如:
i=i+C或i=i-C的赋值,且C为循环不变量,则称i为循环中的基本归纳量
如果i是循环中的一个基本归纳变量,而J=C1*i+C2,C1、C2都是循环不变量,则称J为归纳变量