文章目录
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/a39e1290a5c81d4b86676c693bcb9e3a.png)
一.基本概念
1.语法分析器的两个重要作用
1.根据词法分析器提供的记号流,为语法正确的输入构造分析树(或语法树),这是本章的重点,在以后各节中详细讨论;
2.检查输入中的语法(可能包括词法)错误,并调用出错处理器进行适当处理,下边简单介绍语法错误处理的基本原则,而在以后的讨论中忽略此问题。
2.语法错误的处理和错误类型
对语法错误的处理,一般希望达到以下基本目标:
- 清楚而准确地报告错误的出现,地点正确、不漏报、不错报也不多报;
- 迅速从每个错误中恢复过来(以便分析继续进行);
- 不应使对语法正确源程序的分析速度降低太多。
3.语法错误的基本恢复策略
二.上下文无关文法CFG
1.定义
注意:CFG中 越靠近根节点的运算符优先级越低
结合性:
文法1:term-> term+factor|factor
文法2:term->factor+term
|factor
文法1中‘+’是左结合的,文法2中‘+’是右结合的。
文法1中term = ( term + factor1) + factor2是符合的,其中factor1和前一个+号结合,所以该运算符‘+’是左结合的
文法2中term = factor1 + ( factor2 + term)是符合的,其中factor2和后一个+号结合,所以该运算符‘+’是右结合的
2.表示形式
3.推导
语法分析树
三. 二义性与二义性的消除
二义性的定义
两种方法
1:改写为非二义性文法
新引入的非终结符,限制了每一步直接推导均有唯一选择;
最终分析树的形状,仅与文法有关,而与推导方法无关;
非终结符的引入,增加了推导步骤(分析树增高);
越接近S的文法符号的优先级越低。(如E→E+T)。
对于A→αAβ,若A在终结符左边出现(即终结符在β中),则A产生式具有左结合性质。
改写二义文法的关键步骤:
引入一个新的非终结符,增加一个子结构并提高一级优先级;
递归非终结符在终结符左边,运算具有左结合性,否则具有右结合性。
基本套路:
第一层E对应+操作
考虑到展开 E+T 式子中可能没有+操作 因此 |T E要能直接推导出T
同理 T=>T*F|F 注意+ * 为左结合
对于F右递归 由于()内式子可任意展开 ()可能出现在任何一步 F=>(E)
因为E可=>T=>F
2:为文法符号规定优先级和结合性
四.正规式到CFG
由mov函数写出初始CFG
然后简化
五.上下文有关语言
L3={anbncn|n≥1} CSL 上下文有关文法
L3’={ambmcn|m,n≥1} CFL 上下文无关文法
L3’’={akbmcn|k,m,n≥1}正规集
六.左递归的消除
消除直接左递归
A→ Aα1|Aα2|…|Aαm|β1|β2|…|βn
其中αi非空,βj均不以A开始。然后用下述产生式代替A产生式:
A → β1 A’ |β2 A’ | …|βn A’
A’→ α1 A’ | α2 A’ | … | αm A’ |ε
例题:
注意合理排序可简化产生式,不同排序的结果也不相同,但他们都是等价的,为了简化起见,一般排序由后向前(将最终的直接左递归放在产生式上)这样方便删除不需要的非终结符。
七.消除回溯(提取左因子)
注意:该过程类似于提取公因式
构造预测分析表
First集合(终结首符集)
First集合求法:
(1)如果X是终结符,则FIRST(X) = { X } 。
(2)如果X是非终结符,且有产生式形如X → a…,则FIRST( X ) = { a }。
(3) 如果X是非终结符,且有产生式形如X → ABCdEF…(A、B、C均属于非终结符且包含 ε,d为终结符),需要把FIRST( A )、FIRST( B )、FIRST( C )、FIRST( d )加入到 FIRST( X ) 中。
(4)如果X经过一步或多步推导出空字符ε,将ε加入FIRST( X )。
注意:当如A不包含空串时即,由A一定可以推出一个非空含终结符开头的串,将FirstA加入后结束循环
FOLLOW集合
定义
对于非终结符号A,FOLLOW(A) 被定义为可能在某些句型中紧跟在A右边的终结符号集合。
规则
计算文法符号 X 的 FOLLOW(X) ,不断运用以下规则直到没有新终结符号可以被加入任意FOLLOW集合为止 :
(1)将 加 入 到 F O L L O W ( X ) 中 , 其 中 S 是 开 始 符 号 , 而 加入到FOLLOW(X)中,其中S是开始符号,而 加入到FOLLOW(X)中,其中S是开始符号,而是输出右端的结束标记。
(2)如果存在一个产生式S->αXβ,那么将集合FIRST(β)中除ε外的所有元素加入到FOLLOW(X)当中。
(3)如果存在一个产生式 S->αX , 或者S->αXβ且FIRST(β)中包含ε , 那么将集合FOLLOW(S)中的所有元素加入到集合FOLLOW(X)中。
注意:FOLLOW集合是随符集,一般开始集为#
FOLLOW集合中不含空串
预测分析表的构造
首先从First集合出发 对于b 它在FirstC中 C—>b
b加入M[C,b]
对于e它在FirstS‘中 且推导出e的为First(eS) eS加M[S’,e]
由于空串在FirstS’中 将空串填入对应followS’的表项下、
如果 有 X=>TF F=>(X) 为连续的产生式不含| First(X)中的(来源于对F的推导
表项中填写的仍为X的展开式
八.LL(1)文法
证明:
判断是否为LL1文法
1.看表,一个空格内不能有两个候选项展开式
2.利用推论
1.对任何终结符a,α和β不能同时推导出以a开始的串;
2.α和β最多有一个可以推导出ε;
3.若β=*>ε,则α不能导出以FOLLOW(A)中终结符开始的任何串。
解释:
1.对于产生式任意 A=>B|C|D
任意两候选式first(B)和First(C)不能有交集 或者说含左因子
2.不能同时可推导出空串
3.first和Follow不能相交
预测分析器
模拟最左推导,查表将展开式反向压栈,没进行一步弹出栈顶,反向压入栈
九. 自下而上语法分析
短语 直接短语 句柄
注意: 构造语法分析树后再按特征寻找短语 直接短语和句柄
最左归约
规约前先画分析树找出短语和句柄后写出最左归约
最左归约逆过程实际上就是最右推导(规范推导)
剪句柄
即从分析树裁剪句柄
移进归约方法实例
LR分析
重点:移进归约分析表
LR(0)和活前缀
定义:一个LR(0)项目(简称项目)是这样一个产生式,在它右部的某个位置有一个点“.”。对于A→ε,它仅有一个项目A→.。
拓广文法
简单的说就是添加一个S‘ 产生开始符S
LR(0)文法分析
分析过程:
首先要拓广文法,即如果文法开头不是一个非终结符到另一个非终结符的产生式则需要加入,如加入 S’->S .
然后需要构造 LR(0)自动机,就是加入了一个圆点,圆点后的符号是即将处理的符号,如果圆点后是非终结符时,则要写出该终结符为产生式左部的所有产生式。反复以上过程,直到不再扩大。给它们编号并写出读入下一个符号(即圆点后的符号)会跳转到哪。
然后构造 LR(0)分析表,左侧为项集族编号,上部为终结符和非终结符。中间内容表示该编号的项集族遇到非终结符应该移近还是归约,数字为跳转到的项集族编号,如果圆点到了产生式的最右边则应归约,反之移近。遇到终结符填入相应的项集编号即可。如 (0,a) 即第0行a列对应的是 S2,其意思为对于项集族 I0,如果下一个读入的符号为a,则移进到项集族 I2 ;又如第4行对应的都是 r1,其意思为对于项集族 I4,如果下一个读入的符号为一个终结符则需要按照编号为 (1) 的产生式进行归约;再如 (0,E) 对应的是 1,其意思为对于项集族 I0,如果下一个读入的符号为非终结符 E,则移进到项集族 I1.
r1表示归约式的序号为1
SLR(1)分析器