一、自上而下分析法
1.
自上而下分析是一种移进-规约的分析法,其基本思想是:用一个寄存符号的先进后出栈,把输入符号一个一个地移进到栈里,当栈顶形成某个产生式的候选式时,即把栈顶的这一部分替换成(归约为)该产生式的左部符号。简单来说就是当把输入符号一个个放进去的过程中,观察栈顶元素与它下边任何i个元素能否规约成某个产生式的左部非终结符,若能,则将这i+1个字符出栈,并用该非终结符来替换这i+1个符号然后入栈,一直进行该过程,直至无法规约成非终结符的形式,规约失败,若规约出最左端的非终结符,便规约成功。
例如将文法G:S--> aAcBe ; A-->b ; A-->Ab; B-->d; 将abbcde规约到S过程为:
1)将a 放入栈中,无法规约,然后b进栈
2)由文法可知b可以规约成A,于是将b出栈,将A压栈,此时栈中剩余为aA,无法规约,将b入栈;
3)由A-->Ab,可将Ab出栈,规约成A,此时栈中剩余为aA,无法规约,将c入栈;此时栈中剩余为aAc,无
法规约,将d入栈;
4)由B-->d,将d出栈,规约成B,此时栈中剩余为aAcB,无法规约,将e入栈;
5)由S--> aAcBe,将aAcBe出栈,规约成S。规约成功。
可以看到 自下而上分析的关键是:识别可规约串。那么问题来了,怎么判断栈顶的符号串的可规约性,以及如何规约。
2.规范规约
1) 短语:
令G是一个文法,S是文法的开始符号,假定αβδ 是文法G的一个句型, 其中α,β,∈(VN∪VT)*,A∈VN ,如果有
![](https://i-blog.csdnimg.cn/blog_migrate/e506ebe1cba45ab375062ef79cba3a1c.png)
则β称是句型 αβε相对于非终结符A的短语。
2)直接短语
特别是,如果有A==》β,则称β是句型 αβε相对于规则A-》β的直接短语。
3)句柄一个句型的最左直接短语称为该句型的句柄。
4)规范规约
假定α是文法G的一个句子,我们称序列
αn, αn-1,.... ,α0
是α的一个规范归约,如果此序列满足:
(1) αn= α
(2) α0为文法的开始符号,即α0=S
(3) 对任何i,0 < i <=n, αi-1是从αi经把句柄替换成为相应产生式左部符号而得到的。
αn, αn-1,.... ,α0
是α的一个规范归约,如果此序列满足:
(1) αn= α
(2) α0为文法的开始符号,即α0=S
(3) 对任何i,0 < i <=n, αi-1是从αi经把句柄替换成为相应产生式左部符号而得到的。
规范归约是关于是一个最右推导的逆过程
3、用符号栈进行语法分析
3、用符号栈进行语法分析
分析过程
自左向右对输入串ω不断向栈中进行移进——归约,直到形成如下格局
自左向右对输入串ω不断向栈中进行移进——归约,直到形成如下格局
![](https://i-blog.csdnimg.cn/blog_migrate/0a64639e208152fb85a3f16231ed95f6.png)
表示分析成功,否则意味着输入串ω有错
注意:在分析开始时,将’#’预先进栈,作为栈底符号,结束输入时,将’#’作为输入串的结束符
4、算符优先法
注意:在分析开始时,将’#’预先进栈,作为栈底符号,结束输入时,将’#’作为输入串的结束符
4、算符优先法
·1.意义:定义算符之间优先关系,借助这种关系来寻找“可归约串”和进行归约
2.定义两个终结符‘a’与‘b’的优先关系
a =.b 表示a的优先性等于b
a >.b 表示a的优先性大于b
a <.b 表示a的优先性小于b
5.算符文法
一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,.
2.定义两个终结符‘a’与‘b’的优先关系
a =.b 表示a的优先性等于b
a >.b 表示a的优先性大于b
a <.b 表示a的优先性小于b
5.算符文法
一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,.
6.构造算符优先关系表
(1)通过检查产生式的每一个候选式可以找出满足a=.b
(即P→…ab…或P→…aQb…的产生式)
(2)为了满足<.和>.,需对G中每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P):
(1)通过检查产生式的每一个候选式可以找出满足a=.b
(即P→…ab…或P→…aQb…的产生式)
(2)为了满足<.和>.,需对G中每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P):
![](https://i-blog.csdnimg.cn/blog_migrate/a5cb91dc2b4d433cf03da11d1a91acf8.png)
7.构造集合FIRSTVT(P)的算法
按其定义,可用下面两条规则来构造集合FIRSTVT(P):
按其定义,可用下面两条规则来构造集合FIRSTVT(P):
① 若有产生式P→a…或P→Qa…,
则aFIRSTVT(P);
则aFIRSTVT(P);
② 若aFIRSTVT(Q),且有产生式P→Q…,
则aFIRSTVT(P)。
则aFIRSTVT(P)。
![](https://i-blog.csdnimg.cn/blog_migrate/9e38834404773a55501b7f5040f48210.png)
8.构造构造集合LASTVT(P)的算法
按其定义,可用下面两条规则来构造集合LASTVT(P):
按其定义,可用下面两条规则来构造集合LASTVT(P):
① 若有产生式P→… a或P→… aQ ,
则a 属于 LASTVT(P);
则a 属于 LASTVT(P);
② 若a属于 LASTVT(Q),且有产生式P→… Q ,
则a属于 LASTVT(P)。
9、算符优先分析算法的设计
则a属于 LASTVT(P)。
1.素短语
指一个句型的短语,它至少包括有一个终结符号且除去它本身之外不再含任何更小的素短语
指一个句型的短语,它至少包括有一个终结符号且除去它本身之外不再含任何更小的素短语
2.最左素短语
处在句型最左端那个素短语成为最左素短语
处在句型最左端那个素短语成为最左素短语
10、LR分析法
LR分析方法是一种自下而上的分析方法,LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范归约过程。
LR分析方法是一种适用于一大类上下文无关文法的分析方法,比较复杂,不适于用手工实现,可借助于YACC/bison实现
LR分析法的构造结构包括Action(移进、规约结合艘、接收、出错)和goto函数(状态转换函数):
动作表:
ACTION[s,a]:
当状态s面临输入符号a时,应采取什么动作(<1>. 移进<2>. 归约<3>. 接受<4>. 报错)
ACTION[s,a]:
当状态s面临输入符号a时,应采取什么动作(<1>. 移进<2>. 归约<3>. 接受<4>. 报错)
状态转换表:
GOTO[s,X]:
状态s面对文法符号X时,下一状态是什么
GOTO[s,X]:
状态s面对文法符号X时,下一状态是什么
11、 LR(0)项目集族和分析表的构造:
1)活前缀:文法G的活前缀是他的规范句型的前缀,该前缀不超过句柄的右端。
2)LR(0)项目
3)项目集规范族
4)项目集的闭包
5)LR(0)分析表的构造
12、构造识别活前缀的NFA步骤:
1)构造文法的所有产生式的项目,每个项目都为NFA的一个状态。
2)确定初态、句柄识别态、句子识别态。
由于S′(起始符)仅在第一产生式的左部出现 ,因此规定起始符相关的项目1为初态
其余每个状态都为活前缀的识别态(终态)
圆点在最后的项目为句柄识别态
第一个产生式的句柄识别态为句子识别态
3)状态之间的转换关系确定方法如下:
1)活前缀:文法G的活前缀是他的规范句型的前缀,该前缀不超过句柄的右端。
2)LR(0)项目
3)项目集规范族
4)项目集的闭包
5)LR(0)分析表的构造
12、构造识别活前缀的NFA步骤:
1)构造文法的所有产生式的项目,每个项目都为NFA的一个状态。
2)确定初态、句柄识别态、句子识别态。
由于S′(起始符)仅在第一产生式的左部出现 ,因此规定起始符相关的项目1为初态
其余每个状态都为活前缀的识别态(终态)
圆点在最后的项目为句柄识别态
第一个产生式的句柄识别态为句子识别态
3)状态之间的转换关系确定方法如下:
若项目i为X→X1X2...Xi-1 • Xi…Xn。
项目j为X→X1X2...Xi-1Xi • Xi+1…Xn。
则从状态i到状态j连一条标记为Xi的箭弧。
项目j为X→X1X2...Xi-1Xi • Xi+1…Xn。
则从状态i到状态j连一条标记为Xi的箭弧。
![](https://i-blog.csdnimg.cn/blog_migrate/d36dfed2af36ef8c226639cec6f98c87.png)
若i为X→•A,k为A→•,
则从状态i画标记为的箭弧到状态k。
![](https://i-blog.csdnimg.cn/blog_migrate/93f46a8a41ac76b4f5b8a4ee8fb0bb60.png)
13.LR(0)项目集规范族不存在移进-归约,或归约-归约冲突,称为LR(0)文法。