注意:LR(0)分析表的归约项目,不管当前遇到什么输入符号都做归约动作。也是和SLR(1)分析表的主要区别。
因此假定一个LR(0)规范族中含有如下的项目集(状态)I I={X→α·bβ,A→γ·,B→δ·} 也就是在该项目集中含有移进-归约冲突和归约-归约冲突。其中α,β,γ,δ为文法符号串,b为终结符。那么只要在所有含有A或B的句型中,直接跟在A或B后的可能终结符的集合即FOLLOW(A)和FOLLOW(B)互不相交,且都不包含b,也就是只要满足 FOLLOW(A)∩FOLLOW(B)= ![]() ![]() FOLLOW(A)∩{b}= ![]() ![]() FOLLOW(B)∩{b}= ![]() ![]() 那么,当在状态I时面临某输入符号为a时,则动作可由下规定决策。 1) 若a=b,则移进。 2) 若a∈FOLLOW(A),则用产生式A→γ进行归约。 3) 若a∈FOLLOW(B),则用产生式B→δ进行归约。 4) 此外,报错。 通常对于LR(0)规范族的一个项目集I中可能含有多个移进项目和多个归约项目,我们可假设项目集I(状态)中有m个移进项目:A1→α1·a1β1,A1→α2·a2β2,…, Am→αm·amβm; 同时含有n个归约项目为:B1→γ1·,B2→γ2·,…,Bn→γn·只要集合{a1,a2,…, am}和FOLLOW(B1),FOLLOW(B2),…,FOLLOW(Bn)两两交集都为空,那么我们仍可用上述规则解决冲突即考查当前输入符号决定动作。 1) 若a∈{a1,a2,…, am},则移进。 2) 若a∈FOLLOW(Bi),i=1,2…n,则用Bi→γi进行归约。 3) 此外,报错。 |