LR(0)是什么
- LR(0) : 假如一个文法G的拓广文法G’的活前缀识别自动机的每个状态(项目集)不存在下述情况:
(1):既含移进项目又含归约项目
(2) 含多个归约项目
则称G是一个LR(0)文法。换言之,LR(0)文法规范族的每个项目集不包含任何冲突项目
如何判断是否是LR (0)
1.构造它的LR(0)项目集合的DFA(即识别来该文法全部活前缀的DFA);
2.根据自该DFA画出该文法zd的LR(0)分析表;
3.在分析表中,每格要么只有一个内容,要么没有内容,(即无冲突)则为LR(0)文法。
项目分类:
- 归约项目:凡圆点在最右的项目,如A→α•称为一个“归约项目”
- 接受项目:对文法的开始符号S’的归约项目,如S’→α•称为“接受”项目。
- 移进项目:形如A→α•aβ的项目,其中a为终结符,称为“移进”项目。
- 待约项目:形如A→α•Bβ的项目,其中B为非终结符,称为“待约”项目。
LR(0)分析表构造算法
假定项目集规范族C={I0,I1,…,In}。令每一个项目集Ik的下标k作为分析器的状态。分析表的ACTION子表和GOTO子表可按如下方法构造:
- 令那个包含项目S’→•S的集合Ik的下标k为分析器的初态。
- 若项目A→α•aβ属于Ik且GO(Ik , a)= Ij,a为终结符,置ACTION[k,a]为“把(j,a)移进栈”,简记为“sj”。
- 若项目A→α•属于Ik,对任何终结符a(或结束符#),置ACTION[k,a]为“用产生式A→α进行归约”,简记为“rj”(假定产生式A→α是文法G’的第j个产生式)。
- 若项目S’→S•属于Ik,则置ACTION[k,#]为“接受”,简记为“acc”。
- 若GO(Ik , A)= Ij,A为非终结符,则置GOTO[k,A]=j。
LR 分析表结构
例子
步骤
- 1.写出扩张文法
- 2.写出所有的项目集
-3.写出DFA( A→α•aβ,B属于非终结符,Si需要写出 B→·r) - 4.构造分析表
如果某个状态Sx接收一个VT,置ACTION Sj
如果某个状态Sx接收一个VN,置ACTION j
如果某个状态Sx接收一个VT产生规约项目,置ACTION rj
例: G[S]为 :
S →a A c B e
A →b
A →A b
B →d
1.写出扩展文法
S` →S
S →a A c B e
A →b
A →A b
B →d
2. 写出项目表
3.写出DFN
4.构造它的 LR(0) 分析表