1 字母表
字母表:
用
∑
表示,它是一个有穷符号集合符号:字母、数字、标点符号...
例如:二进制字母表为{0,1},ASCII字符集
2 字母表的运算
字母表上的乘积:
∑1∑2={ab | a属于∑1,b属于∑2}
例如:{0,1}{a,b}={0a,0b,1a,1b}
3 串
4 串的运算
5 文法的形式化定义
G=(VT,VN,P,S)
VT是终结符集合,用小写字母表示
VN是非终结符集合,用大写字母表示
P 是产生式集,产生式的右边的式子是左部字母的“候选式”
S是开始符号
6 语言的定义
直接推导:简而言之就是用产生式的右部替换成产生式的左部
有了文法(语言规则),如何判定某一词串是否是该语言的句子:
1.句子的推导(派生)--从生成语言的角度
2.句子的归约--从识别语言的角度
由文法G的开始符号推导出的所有句子构成的集合称为文法G的生成的语言,记为L(G)
7 文法分类
文法分类:
0型文法
1型文法
2型文法
3型文法
7.1 0型文法
无限制文法/短语结构文法,
由0型文法G生成的语言称为L(G),0型语言
7.2 1型文法
也称为上下文有关文法 CSG
要求产生式的左部的长度小于右部的长度
CSG中不包含空产生式( ε-产生式)
由CSG产生的语言叫做上下文有关语言(1型语言)
由上下文有关文法(1型文法)G生成的语言称为L(G)
7.3 2型文法
也称为上下文无关文法CFG
要求产生式的左部必须是一个非终结符
由CFG产生的语言叫做上下文无关语言(2型语言)
由上下文无关文法(2型文法)G生成的语言称为L(G)
7.4 3型文法
正则文法,包含右线性文法(A->wB或A->w)和左线性文法(A->Bw或A->w)
由3型文法产生的语言叫做正则语言(3型语言)
由正则文法(3型文法)G生成的语言称为L(G)
正则文法能描述程序设计语言的多数单词
7.5 四种文法之间的关系
逐级限制和逐极包含
8 CFG分析树
(句型的)短语:给定一个句型,其分析树中的每一棵子树的边缘称为该句型的一个短语 。如果子树只有父子两代结点,那么这可子树的边缘称为该句型的一个直接短语。
9 二义性文法
下面这种情况消除歧义的规则:每个else和最近的尚未匹配的if匹配
1-9 有关练习
1.文法G产生的 句子的全体是该文法的语言
2.文法G定义的语言是无限集,则文法必然是递归的
3.若一个文法是递归的,则它所产生的语言的句子是无穷多个的
4.文法E->E+E|E*E|i的句子i*i+i*i有5棵不同的语法树
5.由文法开始符号出发经过若干步(包括0步)推导产生的文法符号序列称为句型
6.空不能由符号集S={a,b}通过正比包运算产生
7.把汇编语言程序翻译成机器可执行的目标程序的工作是由汇编器完成的。
8.编译程序分成若干“遍”,是为了使得程序的结构更为清晰
9.编译是对高级语言的翻译
10 词法分析-正则表达式
正则表达式是一种用来描述正则语言的更紧凑的表示方法.例如r=a(a|b)*
正则表达式可以由较小的正则表达式按照特定规则递归地构建.每个正则表达式r定义(表示)一个语言,记为L(r).这个语言也是根据r的子表达式所表示的语言递归定义的
11 词法分析-正则语言
可以用RE(正规式)定义的语言叫做正则语言或者正则集合
11 词法分析-正则定义
d相当于是给每个正则式的命名,以后就用d来代替对应的正则式
12 词法分析- 有穷自动机
这类系统具有一系列离散的输入输出信息和有穷数目的内部状态
系统只需要根据当前所处的状态和当前面临的输入信息就可以决定系统的后继行为.每当系统处理了当前的输入后,系统的内部状态也将发生改变
最长子串匹配原则:当输入串的多个前缀与一个或多个模式匹配时,总是选择最长的前缀进行匹配
FA的分类:确定的FA、非确定的FA
12.1 DFA
用转换图或者转换表表示
12.2 NFA
13 词法分析--从正则表达式到有穷自动机
例题:
14 词法分析器--从NFA到DFA
15 识别单词的DFA
16 词法分析阶段的错误处理
10-16 例题
词法分析器的输出结果是:单词的种别编码和自身值
词法分析器能识别出数值常量、过滤源程序中的注释、扫描源程序并识别记号,不能发现括号不匹配
词法分析器用于识别单词,加工对象是源程序
语法分析器以单词为单位输入
语法分析器的任务是:分析单词串是如何构成语句和声名的
不存在这样一些语言,它们能被确定的有穷自动机识别,但不能用正则式表示
两个有穷自动机等价是指它们所识别的语言相等
有限状态自动机所能识别的是正规语言
DFA的成分有:有穷字母表、多个终态的集合、转换函数,不包括多个初始状态的集合
如果一个正规式所代表的集合是无穷的,则它必含有的运算是闭包运算
一个正规式不止对应一个确定的有限状态机,一个正规语言可能对应多个正规文法
翻译程序是把某一种语言程序(称为源语言程序)等价地转换成另一种语言程序(称为目标语 言程序)的程序。
编译程序是把某一种高级语言程序等价地转换成另一种低级语言程序(如汇编语言或机器 语言程序)的程序。
解释程序是把源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序 本身。
词法分析器,又称扫描器,输入源程序,进行词法分析,输出单词符号。
语法分析器,简称分析器,对单词符号串进行语法分析,识别出各类语法单元,最终判断输入串是否构成语法上正确的“程序”。
文法是描述语言的语法结构的形式规则(即语法规则)。
标识符是指由字母或数字组成的以字母为开头的一个字符串。
实质上,语法树与分析树的最根本区别在于它们的内部节点(包括根结点)
分析树的内部节点是非终结符
语法树的内部节点是操作符(运算符)
语法树省略了反应分析过程的非终结符抽象语法树:语法树
具体语法树:分析树
17 语法分析--自顶向下分析
从分析树的顶部(根节点)向底部(叶节点)方向构造分析树,看以看成是从文法符号S推导出词串w的过程
最左推导:总是选择每个句型的最左非终结符进行替换
最右推导:总是选择每个句型的最右非终结符进行替换
在自底向上的分析中,总是采用最左规约的方式,因此把最左规约称为规范规约,而最右推导相应的称为规范推导
计算机实现自顶向下分析是通过递归下降分析,递归下降分析由一组过程组成,每个过程对应一个非终结符。可能需要回溯,导致效率低下
预测分析技术是递归下降技术的一个特例,通过在输入中向前看固定个数(通常是1)符号来选择正确的A-产生式。预测分析不需要回溯,是一种确定的自顶向下分析方法
18 语法分析--文法转换
问题1:同一个终结符的多个候选式存在共同前缀,将导致回溯现象
问题2:左递归文法会使递归下降分析器陷入无限循环
18.1 消除直接左递归
实际是将左递归变成右递归;消除左递归付出的代价是--引进了一些非终结符和ε产生式
将A'→αA'|ε换成A→βA' A'→αA'|ε
例子:
E→E+T|T
T→T*F|F
F→(E)|i
消除直接左递归:
上面的文法有两条直接左递归:E→E+T|T和T→T*F|F
E→E+T消除左递归后变成:
E→TE' E'→+TE'|ε
同理,T→T*F|F消除左递归:
T→FT' T'→*FT'|ε
18.2 消除间接左递归
A→Bc A→d B→aA B→Ab
首先,经过推导(替换),文法变为
A→Abc|aAc|d
消除直接左递归:
A→(aAc|d)A' A'→bcA'|ε
或者
经过推导(替换),文法变为
B→aA|Bcb|db
消除直接左递归:
B→(aA|db)B' B'→cbB'|ε
18.3 提取左因子
通过改写产生式来推迟决定,等读入足够多的输入,获得足够信息再做出正确的选择
将S → aB1|aB2|aB3|aB4|...|aBn|y变成
S → aS'|y
S'→ B1|B2|B3|...|Bn
例如:
S →aAd|aBe
A →c
B →b
提取左因子之后
S →aS'
S' →Ad|Be
A →c
B →b
19 语法分析--LL(1) 文法
S_文法:简单的确定性文法
预测分析法的工作过程:从文法的开始符号出发,在每一步推导过程中根据当前句型的最左非终结符A和当前输入符号a,选择正确的A-产生式、为保证分析的正确性,选出的候选式必须是唯一的。
为满足这个要求,S_文法应该满足:每个产生式的右边都以终结符开始;同一个非终结符的各个候选式的首终结符都不同;S_文法不包含ε产生式
什么时候使ε
产生式:当前非终结符A与当前输入符不匹配时,若存在A →ε
,可以通过检查a是否可以出现在A的后面,来决定是否使用A →ε
(若文法中无A →ε
,则应报错)
串首终结符:串首的第一个符号,简称首终结符
LL(1):第一个L表示从左向右扫描,第二个L表示产生最左推导,1表示在每一步中只需要向前看一个输入符号来决定语法分析动作
20 语法分析--构造预测分析表
17-20 例题
如果文法G是无二义的,则它的任何句子最左推导和最右推导的语法树必定相同
识别上下文无关语言的自动机是下推自动机
一个文法G,若G的LL(1)分析表不含多重定义的条目,则称它是LL(1)文法
语法分析器的输入是Token序列
在递归子程序中,若文法存在左递归,则会使分析程序产生无限循环
LL(1)的1目的是确定使用哪一个产生式进行展开
21下推自动机
22 预测分析中的错误检测
两种情况可以检测到错误:
1.栈顶的终结符和当前的输入符号不匹配
2.栈顶非终结符与当前的输入符号在预测分析表对应项目为空
错误恢复:
恐慌模式
重点难点解析
如何实现自顶向下:
递归下降分析法
什么样的文法能够实现确定的自顶向下分析
LL(1)文法
自顶向下的步骤:
消除歧义(二义性),文法改造(消除左递归、提取左因子),LL(1)文法判定(确定性)
无二义性文法的判定:
对于任意一个上下文无关文法,不存在一个算法,判定它是无二义性的,但能给出一组充分条件,满足这组充分条件的文法是无二义性的。(不满足,不一定具有二义性)
如何实现确定的自顶向下分析
递归的方式:基于预测分析表对递归下降分析法进行扩展
非递归的方式
语法分析的任务:
识别句子,确定句子的类型。(对于不同类型的语句,后续的语义分析将执行不同的语义动作)
语法分析技术分类(前提是CFG无二义性):
自顶向下、自底向上
FIRST、FOLLOW集合均是终结符集,
FOLLOW集、SELECT集合中不能有空,FIRST集可以有
在编译时遇到错误时候,应该跳过错误所在的语法单位继续分析下去
23 语法分析--自底向上的语法分析
从分析树的底部(叶节点)向顶部(根节点)方向构造分析树,是将输入串规约为开始符号的过程。
自顶向下的语法分析采用最左推导方式,自底向上的语法分析采用最左规约方式(反向构造最右推导)
自底向上语法分析发通用框架:移入-规约分析
栈内符号+剩余输入=规范句型(上图的线隔开的每一块就是一个规范句型)
24 语法分析--LR分析法概述
LR文法是最大的、可以构造出相应移入-规约的语法分析器的文法类
L:对输入进行从左到右的扫描
R:反向构造出一个最右推导序列
LR(k)分析:需要向前查看k个输入符号的LR分析;K=0和k=1这两种情况最具有实践意义,当省略k时,表示k=1
自底向上分析的关键问题是:如何正确识别句柄
句柄是逐步形成的,用“状态”来表示句柄识别的进展程度
25 语法分析--LR分析表
LR(0)分析
SLR分析
LR(1)分析
LALR分析
25.1 LR(0)分析
25.2 SLR分析
(下面的 T->aBd 是I5)
25.3 LR(1) 分析
‘
25.4 LALR分析
重难点解析
自顶向下分析:
通用框架:递归下降分析
主要问题:候选式的选择
关键问题:如何正确选择候选式
自底向上分析:
通用框架:移入-规约分析
主要问题:冲突(归约-移进、归约-归约)
关键问题:寻找句柄
句柄是最左直接短语
如何正确识别句柄--LR分析法
基本原理:句柄是逐步形成的,用“状态”表示句柄的拓展程度
项目描述了句柄识别的状态
LR分析器基于这样一些状态构造自动机进行句柄的识别
以等价项目集作为状态构造自动机(等价项目)
ACTION的s表示移进,r表示归约
26 二义性文法的LR分析
每个二义性的文法都不是LR的
某些类型的二义性文法在语言的描述和实现中很有用
二义性文法的使用:应该保守的使用二义性文法,并且必须在严格控制之下使用,因为稍有不慎就会导致语法分析器所识别的语言出现偏差
27 LR的错误处理
重点难点
句柄都是相对于一个句型而言的
LR(0)分析只关心构成某个成分A的各个自称分是否都已出现(如果出现就归约),但并没有考虑这个成分A是否是待分析句子中的一个成分。事实上,如果A不是待分析句子的一个成分,那么即使把它归约出来也是徒劳的,在后续分析中迟早会发现进行不下去
因此应该把句柄的识别放在句型这样一个上下文环境中考虑
受技术限制,考虑正规上下文实现比较困难,因此LR(1)分析只考虑成分A下文的第一个(终结)符号
各种LR分析表构造方法的不同之处在于归约项目的处理上
一个LR(1)文法合并同心集后若不是LALR(1)文法,则可能存在归约/归约冲突;同心集合并可能存在归约/归约冲突
LR(1)文法都是无二义性但可能是左递归
在LR(0)的ACTION表中方中,如果某行有Rj,改行必定填满Rj,但是在其他分析法不一定填满
LR(0) 最右推导,不考虑后面输入进来是个啥,只看当前点的位置,所以没有有移进规约冲突和规约规约冲突时候才能用,才能被称为LR(0)文法
SLR(1) 不存在规约、移进冲突
LR(1) 不存在规约、规约冲突
LALR(1) 能合并,不冲突