求first和follow集合 代码
时间: 2023-04-28 17:03:38 浏览: 206
nppl.rar_Follow_ Follow_first follow
首先,需要明确一下什么是first集合和follow集合。
- first集合:对于一个文法符号,它的first集合是由它所能推导出的所有字符串的首字符组成的集合。
- follow集合:对于一个非终结符号,它的follow集合是由它所在产生式右侧的所有符号所能推导出的所有字符串的下一个字符组成的集合。
下面是求解first和follow集合的代码示例:
```python
# 定义文法符号和产生式
grammar = {
'S': ['AB', 'BC'],
'A': ['a', 'aA'],
'B': ['b', 'bB'],
'C': ['c', 'cC', '']
}
# 计算first集合
def calc_first(grammar):
first = {}
for symbol in grammar:
first[symbol] = set()
while True:
updated = False
for symbol in grammar:
for production in grammar[symbol]:
if production == '':
if '' not in first[symbol]:
first[symbol].add('')
updated = True
elif production[0] not in grammar:
if production[0] not in first[symbol]:
first[symbol].add(production[0])
updated = True
else:
for s in production:
if '' not in first[s]:
break
if s != symbol:
first[symbol] |= first[s]
if '' not in first[s]:
break
else:
if '' not in first[symbol]:
first[symbol].add('')
updated = True
if not updated:
break
return first
# 计算follow集合
def calc_follow(grammar, first):
follow = {}
for symbol in grammar:
follow[symbol] = set()
follow['S'].add('$')
while True:
updated = False
for symbol in grammar:
for production in grammar[symbol]:
for i, s in enumerate(production):
if s in grammar:
if i == len(production) - 1:
if '' not in follow[s]:
follow[s] |= follow[symbol]
updated = True
else:
for j in range(i + 1, len(production)):
if production[j] not in grammar:
if production[j] not in follow[s]:
follow[s].add(production[j])
updated = True
break
else:
follow[s] |= first[production[j]]
if '' not in first[production[j]]:
break
else:
if '' not in follow[s]:
follow[s] |= follow[symbol]
updated = True
if not updated:
break
return follow
# 测试代码
first = calc_first(grammar)
follow = calc_follow(grammar, first)
print('first集合:', first)
print('follow集合:', follow)
```
以上代码中,我们首先定义了一个文法符号和产生式的字典,然后分别计算了它们的first集合和follow集合。在计算first集合时,我们使用了一个while循环,不断更新每个符号的first集合,直到没有符号的first集合发生变化为止。在计算follow集合时,我们同样使用了一个while循环,不断更新每个符号的follow集合,直到没有符号的follow集合发生变化为止。
最后,我们将计算得到的first集合和follow集合打印出来,供测试和调试使用。
阅读全文