已知文法G: 1S→A 2 A→B 3 A→aA 4 B→bB 5 B→b (1)写出该文法的LR(0)项目集规范族。(注:该文法已经拓广)
时间: 2024-05-06 22:16:20 浏览: 196
拓广后的文法G'如下:
```
1. S' -> S
2. S -> A
3. A -> B
4. A -> aA
5. B -> bB
6. B -> b
```
LR(0)项目集规范族如下:
```
I0:
S' -> .S
S -> .A
A -> .B
A -> .aA
B -> .bB
B -> .b
I1:
S' -> S.
I2:
S -> A.
I3:
A -> B.
A -> a.A [a]
B -> b.B [b]
I4:
A -> aA.
B -> b.B [b]
I5:
A -> aA.
B -> bB. [b]
I6:
B -> bB. [b]
```
其中,括号内的符号为该项目的“展望符号”。例如,[a]表示该项目后面期望看到输入中的符号为a。在LR(0)分析表中,如果一个项目的展望符号为$X$,则在该项目所在的行上填写动作“移进”,并在对应的列上填写状态转移后的状态;如果该项目为归约项目,则在对应的行、列上填写“规约”和对应的产生式编号。如果该项目既不是移进项目也不是归约项目,则在对应的行、列上填写“错误”。
相关问题
1.已知文法G[S]如下: S→aA∣bB∣ε A→aB∣bA B→aS∣bA∣ε 请根据上述文法构造所对应的状态图(画出状态图即可)。
抱歉,当前的文本输入框无法绘制图形。但是,我可以为您提供该文法的状态转移表:
状态图(状态转移表)如下:
| 状态 | a | b | ε |
|------|----|----|----|
| S | A | B | |
| A | B | A | |
| B | S | A | |
其中,每个单元格表示在当前状态下接收到对应输入符号后转移到的下一个状态。ε表示空符号。例如,从状态S接收到a,将转移到状态A;从状态A接收到b,将转移到状态A,以此类推。
编译原理:已知文法 A→fAa|fAg|b 判断该文法是否是 SLR(1)文法
要判断该文法是否是SLR(1)文法,需要进行以下步骤:
1. 构造该文法的LR(0)自动机,并求出LR(0)项集族和对应的转移表。
2. 对每个LR(0)项集,求出它的闭包和GOTO集合。
3. 对于每个非终结符A和每个终结符a,求出它们的FOLLOW集。
4. 对于每个LR(0)项集I和每个终结符a,求出ACTION[I, a]和GOTO[I, A]的值。
5. 判断文法是否是SLR(1)文法。对于每个LR(0)项集I和每个终结符a,如果ACTION[I, a]和GOTO[I, A]同时存在冲突,且冲突中至少有一项是移进-归约冲突,那么该文法就不是SLR(1)文法。
下面是具体的步骤:
1. 构造LR(0)自动机:
起始状态:[S' -> .A] (S'是起始符号)
状态1:[A -> .fAa, A -> .fAg]
状态2:[A -> f.Aa, A -> f.Ag]
状态3:[A -> fA.a, A -> fAg.]
状态4:[A -> fAg.]
状态5:[A -> fA.a]
状态6:[A -> f.Ag]
状态7:[A -> b.]
2. 对每个LR(0)项集,求出它的闭包和GOTO集合:
闭包({[S' -> .A]}) = {[S' -> .A], [A -> .fAa, A -> .fAg]}
GOTO({[S' -> .A]}, f) = {[A -> f.Aa, A -> f.Ag]}
GOTO({[S' -> .A], [A -> .fAa, A -> .fAg]}, a) = {[A -> fA.a]}
GOTO({[S' -> .A], [A -> .fAa, A -> .fAg]}, g) = {[A -> fAg.]}
GOTO({[A -> f.Aa, A -> f.Ag]}, a) = {[A -> fA.a]}
GOTO({[A -> f.Aa, A -> f.Ag]}, g) = {[A -> fAg.]}
GOTO({[A -> fA.a]}, a) = {}
GOTO({[A -> fAg.]}, a) = {}
GOTO({[A -> fA.a]}, g) = {[A -> f.Ag]}
GOTO({[A -> f.Ag]}, a) = {}
GOTO({[A -> f.Ag]}, g) = {[A -> fAg.]}
3. 对于每个非终结符A和每个终结符a,求出它们的FOLLOW集:
FOLLOW(A) = {a, g}
FOLLOW(f) = {a, g}
FOLLOW(g) = {a, b}
4. 对于每个LR(0)项集I和每个终结符a,求出ACTION[I, a]和GOTO[I, A]的值:
ACTION[{[S' -> .A]}, f] = {[A -> f.Aa, A -> f.Ag]}
ACTION[{[S' -> .A], [A -> .fAa, A -> .fAg]}, a] = {[A -> fA.a]}
ACTION[{[S' -> .A], [A -> .fAa, A -> .fAg]}, g] = {[A -> fAg.]}
ACTION[{[A -> f.Aa, A -> f.Ag]}, a] = {[A -> fA.a]}
ACTION[{[A -> f.Aa, A -> f.Ag]}, g] = {[A -> fAg.]}
ACTION[{[A -> fA.a]}, a] = {[A -> fAa]}
ACTION[{[A -> fA.a]}, g] = {[A -> f.Ag]}
ACTION[{[A -> f.Ag]}, a] = {}
ACTION[{[A -> f.Ag]}, g] = {[A -> fAg.]}
GOTO集合已经在步骤2中求出。
5. 判断文法是否是SLR(1)文法:
根据步骤4中求出的ACTION和GOTO,可以看出该文法没有移进-归约冲突,但存在归约-归约冲突(ACTION[{[A -> fA.a]}, a]和ACTION[{[A -> fAg.]}, a]同时存在)。因此,该文法不是SLR(1)文法。
阅读全文