python代码求First集
时间: 2023-11-04 22:09:41 浏览: 61
python 并查集代码
首先,确定文法的开始符号 S,和产生式集合 P。接着,定义好非终结符的 First 集合。
示例如下:
```python
# 定义开始符号,产生式集合
start_symbol = 'E'
productions = {
'E' : ['TX'], # E -> TX
'X' : ['+TX', ''], # X -> +TX | ε
'T' : ['FY'], # T -> FY
'Y' : ['*FY', ''], # Y -> *FY | ε
'F' : ['(E)', 'num'] # F -> (E) | num
}
# 定义非终结符的First集合
FIRST = {}
# 用于处理产生式右侧的符号
def first_of_symbol(sym):
# 是终结符直接返回,不再递归求解
if sym not in productions:
return {sym}
# 非终结符时,先判断是否已经求解过
if sym in FIRST:
return FIRST[sym]
# 没有求解过,递归求解
FIRST[sym] = set()
for prod in productions[sym]:
idx = 0
while idx < len(prod):
# 获取到这个符号的First集合
first_set = first_of_symbol(prod[idx])
# 将这个符号的First集合加入到 sym 的First集合中
FIRST[sym] |= first_set
# 如果这个符号没有空串,结束循环
if '' not in first_set:
break
# 否则去掉空串后继续循环
idx += 1
return FIRST[sym]
# 遍历所有非终结符,求解他们的First集合
for sym in productions.keys():
first_of_symbol(sym)
# 输出结果
for sym in productions.keys():
print(sym, ' : ', FIRST[sym])
```
这是对于一个简单的产生式求解First集合的示例,其中的关键点是 `first_of_symbol` 函数,采用了递归方式来求解非终结符的First集合。注意,在递归过程中,需要考虑符号有没有空串,以及递归中重复求解的问题。
阅读全文