需要原卷和答案请点赞关注收藏后评论区留言私信~~~
自底向上分析概述:
方法描述
从输入串开始,逐步进行“归约”,直至归约到文法的开始符号。
自左向右逐个扫描输入串,一边把输入符号移入分析栈,一边检查位于栈顶的一串符号是否与某个产生式的右部相同
- 如果相同,就把栈顶的这串符号归约为相应左部的非终结符。
- 如果不同,则继续移入输入符号,再进行判断。
这一过程一直重复到输入串结束,栈内符号恰好为S即为接受。
利用栈,输入符号移进栈,当栈顶形成某个非终结符号P的候选式时,就将其归约为非终结符号P
由此,自底向上分析方法也称为“移进-归约”法
(移进,归约,移进,归约...)
归约过程中存在的问题
在第二步归约的时候分析栈的情况是
有两种归约的可能:
A→Ab和A→b
假如采用A→b
abbcde ⟸aAbcde⟸aAAcde ⟸aAAcBe ⟸?
需要选择一个最优的归约方法
2. 规范归约
- 短语:
令G是一个文法,S是文法的开始符号,若αβδ是文法G的一个句型
如果有 �→∗α�δ ,且 �→+β ,则称β是相对于非终结符号A的,关于句型αβδ的短语。
如果其中存在 �→β ,则称β是句型αβδ关于非终结符号A的直接短语
- 句柄:
一个句型的最左直接短语称为该句型的句柄。
- 规范推导:
即最右推导
- 规范句型:
由规范推导所得的句型称为规范句型(右句型)
- 规范归约:
关于句型α的一个最右推导的逆过程,也称为最左归约
移进-归约方法需要解决的关键问题:
A. 如何在右句型中找出可归约串(句柄)?
B. 在相同的右部有不止一个产生式时, 选哪一个?
①实现移进-归约分析的一个方便途径是用一个栈和一个输入缓冲区,用$表示栈底和输入的结束
一、LR(0)自动机构造
下面我们以实际题目为例,为下列的字符串构造 DFA
A → aAd | aAb | ε
移进归约不难理解,这个自动机也不难构造,此处有一点需要提醒,当·后的字符为非终结符时需要将以该非终结符为左部的产生式加入到该状态中
同样此处还要进行增广文法的构建,也是非常简单,只需要增加一个新的非终结符指向原开始符号A即可(这样使得文法只有一个接受状态)
答案如下
文法增广如下
自动机构造如下
例如此处状态I2中a的后面出现了非终结符A,因此要把以非终结符A为左部的产生式加入到该状态中
二、构造SLR(1)分析表
此处我们首先判断该文法是不是LR(0)文法,如果不是再判断是否为SLR(1)文法,接着构造SLR(1)分析表
由上图的I0 I2状态可知有移入/归约冲突,所以不为LR(0)文法,又因为输入符号之间的follow集之间没有交集,所以该文法为SLR(1)文法,下面构造SLR(1)分析表
其中action表中为输入终结符时的动作,包括移入或者归约,goto表中为输入非终结符时跳转到的状态
三、构造SLR(1)分析器
有了上面的结果和铺垫,构造SLR(1)分析器就简单很多了,注意状态和输入符号对应查表即可
创作不易 觉得有帮助请点赞关注收藏~~~