给我一个求first集和follow集的例题供我练习并附上答案
时间: 2023-10-11 17:23:25 浏览: 113
好的,下面是一个求first集和follow集的例题:
对于以下文法G,求其每个非终结符的first集和follow集:
```
S -> Aa | Bb
A -> Ac | d
B -> Bf | g
C -> Cc | ε
```
答案如下:
```
First(S) = {a, b, g, d}
First(A) = {d, ε}
First(B) = {f, g, ε}
First(C) = {c, ε}
Follow(S) = {$}
Follow(A) = {a, b, g, d}
Follow(B) = {a, b, g, d}
Follow(C) = {c, f}
```
希望这个例题能够帮助你练习求解first集和follow集。
相关问题
帮我写一段根据产生式生成first集和follow集的代码
好的,以下是一个简单的 Python 代码示例:
```
# 产生式列表
productions = [
('E', ['T', 'E\'']),
('E\'', ['+', 'T', 'E\'']),
('E\'', []),
('T', ['F', 'T\'']),
('T\'', ['*', 'F', 'T\'']),
('T\'', []),
('F', ['(', 'E', ')']),
('F', ['id'])
]
# first集和follow集
first = {}
follow = {}
# 计算first集
def calc_first(symbol):
if symbol in first:
return first[symbol]
first[symbol] = set()
for production in productions:
if production[0] == symbol:
if len(production[1]) == 0:
first[symbol].add('ε')
else:
for i in range(len(production[1])):
first[symbol].update(calc_first(production[1][i]))
if 'ε' not in first[production[1][i]]:
break
return first[symbol]
# 计算follow集
def calc_follow(symbol):
if symbol in follow:
return follow[symbol]
follow[symbol] = set()
if symbol == productions[0][0]:
follow[symbol].add('$')
for production in productions:
for i in range(len(production[1])):
if production[1][i] == symbol:
if i == len(production[1]) - 1:
follow[symbol].update(calc_follow(production[0]))
else:
for j in range(i+1, len(production[1])):
follow[symbol].update(calc_first(production[1][j]))
if 'ε' not in calc_first(production[1][j]):
break
else:
follow[symbol].update(calc_follow(production[0]))
return follow[symbol]
# 计算所有符号的first集和follow集
for production in productions:
calc_first(production[0])
calc_follow(production[0])
# 输出结果
print('First集:')
for key, value in first.items():
print(key, value)
print('\nFollow集:')
for key, value in follow.items():
print(key, value)
```
这段代码适用于 LL(1) 文法,可以根据需要进行修改。需要注意的是,这里默认空串为 'ε',如果你的文法中使用的是其他符号,请修改代码中的相关部分。
求first集和follow集c
关于求first集和follow集,需要先确定文法的产生式规则。以下是求解过程:
假设文法的产生式规则为:
S -> AB | bB
A -> aA | ε
B -> cB | d
首先求解非终结符A的first集:
- A -> aA | ε
- first(aA) = {a}
- 如果A可以推导出ε,则将ε加入first(A)中
- first(A) = {a, ε}
然后求解非终结符B的first集:
- B -> cB | d
- first(cB) = {c}
- first(d) = {d}
- first(B) = {c, d}
接下来求解非终结符S的first集:
- S -> AB | bB
- 如果S可以推导出A,则将first(A)中除ε以外的所有元素加入first(S)中
- first(A)中除ε以外的所有元素为{a}
- first(S) = {a}
- 如果S可以推导出B,则将first(B)中除ε以外的所有元素加入first(S)中
- first(B)中除ε以外的所有元素为{c, d}
- first(S) = {a, c, d}
最后求解非终结符A和B的follow集:
- S是开始符号,将$加入follow(S)中
- follow(S) = {$}
- 对于产生式A -> aA | ε,将follow(A)加入到aA的后面
- follow(A) = {b, c, d, $}
- 如果A可以推导出ε,则将follow(S)加入到follow(A)中
- follow(A) = {b, c, d, $}
- 对于产生式B -> cB | d,将follow(B)加入到cB和d的后面
- follow(B) = {b}
- 如果B可以推导出ε,则将follow(A)加入到follow(B)中
- follow(B) = {b, b, c, d, $}
因此,求解得到的first集和follow集如下:
- first(S) = {a, c, d}
- first(A) = {a, ε}
- first(B) = {c, d}
- follow(S) = {$}
- follow(A) = {b, c, d, $}
- follow(B) = {b, b, c, d, $}
阅读全文