目录
1.拓广文法
2.构造dfa
I0中,2是1的等价;3,4是2的等价 ;5,6是3的等价。
对于2,β相当于空,所以按照
3,4的向前搜索符应该继承2.
对于3来说,β = A#,所以5,6的向前搜索符即first(A#) = a,b,#.
之后按照如此规则画出其他状态
3.画出分析表
注意:
例如I5利用拓广文法中的第五条产生式归约,同时其向前搜索符是a,b,#,所以在表中I5那行对应a,b,#三列填入r5.
4.利用分析表
附:几种文法的区别
首先来看张图,上图是四种文法的包含关系,即 LR(1)文法范围最大,而 LR(0)文法范围最小。同时也说明了四种文法分析过程的强弱,即 LR(1)文法分析最强,而 LR(0)文法分析最弱。
LL(1)分析法是自上而下的分析法。LR(0),LR(1),SLR(1),LALR(1)是自下而上的分析法。
自上而下:从开始符号出发,根据产生式规则推导给定的句子。用的是推导。
自下而上:从给定的句子规约到文法的开始符号。用的是归约。
LL(1)文法判别:
1.不含左递归
2.同一个非终结符的产生式的first集合交集为空mue,例如
A->aB|ε ,FIRST(aB) = { a },FIRST(ε ) = { ε },交集为Φ
3.同一个非终结符的产生式的follow集合交集为空。同上
LR(0)文法判定:
如果文法对应的自动机中不存在移进-归约冲突和归约-归约冲突则为 LR(0)文法。换句话说LR(0)文法分析不能解决这两种冲突,所以范围最小。移进-归约冲突就是在同一个项集族中同时出现了可以移进的产生式和可以归约的产生式。归约-归约冲突类似。
SLR文法判定:
SLR文法不存在归约-归约冲突,有可能存在移进-归约冲突,但是如果可以用 follow集解决则是 SLR文法。换句话说,SLR文法分析过程可以解决归约-归约冲突,但是不一定能解决移进-归约冲突。用 follow集来处理即出现移进-归约冲突的两条产生式,如果其 follow集相交为空则为 SLR文法,反之不是。当然,如果以上两种冲突都不存在自然是了。
LALR文法分析
有个结论是合并同心集不会产生新的移进-归约冲突,但是会产生新的归约-归约冲突,如果没产生冲突就是 LALR 文法,反之不是。
LR(1)文法判定:
因为 LR(1)文法的范围比较大,所以文法几乎都是 LR(1)的,现在知道的只有当合并同心集产生了归约-归约冲突时才只属于LR(1)文法,而不属于其他文法。