编译原理
什么是编译程序,编译系统
编译:将将高级语言翻译成汇编语言或机器语言的过程
编译系统:源程序通过预处理器得到预处理后的源程序、通过编译器得到汇编语言程序、通过汇编器得到可重定位的机器代码、通过连接器和加载器得到目标机器代码
2.2定义:闭包,正,克林
正闭包:设E是字母表,E的正闭包:E并E2并E3….(长度正数的符号串构成的集合)
克林闭包:设E是字母表,E的克林闭包:空并E并E2并E3…. (任意符号串,长度可为0构成的集合)
啥是句子
句子:设E是字母表,任意x属于E的克林闭包,x称为是E上的一个句子、句子可称为字,行,串
句型:设文法G=(V,T,P,S),对于α∈(V∪T)*,如果S通过若干步骤推出α,则称α是G产生的一个句型
语言:任意L是E克林闭包的子集,则L是字母表上的语言
词法单元流:单词的内部形式:种别,属性值
句柄:一个句型的分析树中最左那棵只有父子两代的子树的所有叶子的自左至右排列。最左直接短语
活前缀就是句柄的子集
文法的定义(VTPS代表什么)
V:变量的非空有穷集合,非终结符(语法变量,语法范畴)
T:终结符,V并T并空都称为文法符号或者语法符号
P:产生式,左部定义为右部(定义式,语法规则)
S:开始符号,至少在产生式左侧出现一次
推导:最左最右
最左:A->Ba
最右:A->aB
前后缀
前缀:若x=yz,则y是前缀,z不为空则是真前缀
后缀:若x=yz,则z是后缀,同理
文法分类
0型文法:PSG(短语结构文法)
1型文法:CSG(上下文有关文法)、且左边长度小于右边
2型文法:CFG(上下文无关文法)、左边只能有一个非终结符
3型文法:RG(正则文法)、左线性A→Ba或A→a,右线性A→aB或A→a
0>1>2>3包含
语法树
CFG的语法树称为分析树(parse tree)、推导树(derivation tree)、派生树(derivation tree)
设有CFG G=(V,T,P,S),G的句型的最左直接短语叫做句柄(handle)
短语:一棵子树的所有叶子自左至右排列起来形成一个相对于子树根的短语。
直接短语:仅有父子两代的一棵子树,同上
句柄:一个句型的分析树中最左那棵只有父子两代的子树的所有叶子的自左至右排列。最左直接短语
规约与推导
最右规约:对应于最左推导,即将最左边的非终结符替换
最左规约:对应于最右推导,同理
最右推导也称为规范推导
最左规约也称为规范规约
二义性
如果一个文法的句子存在两棵分析树,那么,该句子是二义性的
如果一个文法包含二义性的句子,则称这个文法是二义性的
词法分析器
输入:字符流
输出:词法单元流
语法分析器(核心部分)
输入:词法单元流
输出:语法树
语义分析器(一般和语法分析同时进行,称为语法制导翻译)
输入:语法树
输出:符号表和语法报错信息
中间代码生成(和语义分析一起称为语义翻译)
输入:语法树
输出:中间表示形式
根据正则文法构造正则表达式
反过来转换
正则文法与Fa(有穷自动机)的转换
正则表达式的运算优先级:*,连接,|
FA有穷自动机:有输入输出信息,内部状态
多个终止状态:多个前缀匹配时,会找最长匹配
正则文法与正则表达式等价与自动机
NFA的画,先把简单的画出来
有穷状态自动机
具有离散输入输出的系统的数学模型
具有有穷个内部状态
根据当前状态和面临输入确定后继的行为
语法分析
最右推导是规范推导
最左规约是规范规约
自顶向下:最左推导(选择最左非终结符替换)
自底向上:最左规约(规范规约)??????
二义性
如果一个文法的句子存在两棵分析树,那么,该句子是二义性的
如果一个文法包含二义性的句子,则称这个文法是二义性的
如果L(G)中存在一个具有两个或两个以上最左(或最右)推导的句子,则G是二义性文法
自顶向下的问题:回溯,左递归,二义性
解决二义性:
人为定义规则,比如划分优先级和结合性、引入新的非终结符
解决回溯:会删掉不符合的一直找符合的,因为有共同前缀,
解决:将公共因子后面的用其他变量替换如:aA|aB => aS S->A|B
解决左递归:会陷入无穷推导(循环),有直接左递归和间接左递归,
转换成右递归4.2.2
消除二义性:通过引入新的语法变量
回溯问题162:解决:左递归转换成右递归(间接左递归要转换成直接左递归再做)
自顶向下:预测分析法first和follow集计算
Follow:句型中紧跟在A后边的终结符a 的集合,如果 A是某个句型的的最右符号,则将结束符“$”添加
First:串首第一个符号,并且是终结符
什么情况是LL1文法
LL(1)文法既不是二义性的,也不是左递归的
什么时候不是LL1文法
预测分析法(器的构成)
LL1自顶向下分析过程
栈放待分解的字符
通过First与follow集合来构造
LR分析法(LR(0),SLR,LR(1),LALR)
自底向上分析
自底向上语法分析的关键问题-
找句柄
增广文法:E’->E(本来有两个E,让开始符号变成一个),即引入这个新的开始产生式的目的是使得文法开始符号仅出现 在一个产生式的左边,从而使得分析器只有一个接受状态
为啥要有增广文法
让树根只有一个
等价项目集的概念
形如:下一个待移进的符号有产生式可替换
LR0
如果LR(0)分析表中 没有语法分析动作冲突,那么给定的文法 就称为LR(0)文法
不是所有CFG都能用LR(0)方法进行分析,也就是说,CFG不总是LR(0)文法
LR(0)分析过程的冲突:
移进与规约的冲突:
SLR
如果给定文法的SLR分析表中不存在有冲突的动作, 那么该文法称为SLR文法
因为存在移进与规约的问题,所以新增follow集,对左部出现的非终结符操作,当状态遇到follow集合里的终结符时,使用对应的规约即可
LR1的提出
如果LR(1)分析表中没有语法分析动作冲突, 那么给定的文法就称为LR(1)文法
无二义性但可能左递归
展望符:谁的展望符就是谁后面必须紧跟的终结符
但是一个形如[A→α·, a]的项在只有在下一个输入符号等于a时才可 以按照A→α 进行归约
LALR
形式和LR1相同,将相同状态的合并在一起,展望符用或关系
合并同心项集 不会产生移进- 归约冲突,但会有规约规约冲突