求算符文法的FIRSTVT集的算法
2015-06-25 20:33
323 查看
原理
数据结构
G = {'key':[v1,v2,v3],'key':[v1,v2,v3]}; VN = []; Vt = []; FirstVT = {'key':[v1,v2,v3],'key':[v1,v2,v3]};
也就是map里放list,同样将文法压缩,对于产生式相同的发到一个map元素里,追加到map元素对应的list后面
算法过程
1、 先求出直接满足A->a 或 A->Ba的文法的A的FIRSTVT集合2、 扫描FIRSTVT集,将满足蔓延性公式的终结符加到非终结符的FIRSTVT集合中。蔓延性满足下面的条件
若a属于FIRSTVT(B) 且有产生式A->B..... 则a属于FIRSTVT(A)
输入
8 S->#E# E->E+T E->T T->T*F T->F F->P^F|P P->(E) P->i
完整算法
#!/usr/bin/env python #-*-coding:utf8-*- #count = raw_input('Please input P count:'); #print "Input all P:\n"; f = open("./2.in", 'r',1); count = int(f.readline()); #G = []; G = {}; VN = []; Vt = []; FirstVT = {}; for i in range(0,count): #key = raw_input("P key:"); #value = raw_input("P value:"); line = f.readline().strip(); print line; arr = line.split("->"); #P = {'key':key,'value':value}; #P = { #'key':arr[0], #'value':arr[1] #}; VN.append(arr[0]); #G.append(); if arr[0] not in G: G[arr[0]] = []; G[arr[0]].append(arr[1]); #print G; #for p in G: #a = ''; #if (p['value'][0] not in VN): #a = p['value'][0]; #elif (len(p['value']) >= 2 ) and ( p['value'][0] in VN): #a = p['value'][1]; for k in G: vs = G.get(k); for v in vs: a = ''; if v[0] not in VN: a = v[0]; elif len(v) >= 2 and v[0] in VN and v[1] not in VN: a = v[1]; if k not in FirstVT: FirstVT[k] = []; if a != '': #将形如 A->a 的 FirstVT[A] 添加进 a FirstVT[k].append(a); #print FirstVT; stack = []; for _k in FirstVT: _vs = FirstVT.get(_k); for _v in _vs: # 将 形如 A->a 的入栈 stack.append([_k,_v]); #print stack; while len(stack) > 0: ij = stack.pop(); B = ij[0]; a = ij[1]; for A in G: vvs = G.get(A); for _vs in vvs: # 存在形式如 A->B && f[ia,ja]为假 if _vs[0] == B and A != B and ( a not in FirstVT.get(A) ): FirstVT[A].append(a); stack.append([A,a]); #print FirstVT; print '------------------------------------------------' for fk in FirstVT: fv = FirstVT.get(fk); print 'FIRSTVT(',fk,')={',; for item in fv: if item != fv[-1] : print item,',',; else: print item,; print '}\n',;
运行结果
相关文章推荐
- Android 中 使用 Gson解析json
- pycharm的vim插件安装
- Android基础知识_Intent概念及实现
- C与C++代码互相访问
- Hibernate入门之配置文件
- Java命名规范
- lintcode:Continuous Subarray Sum
- SpringMVC将数据返回到页面
- ixgbe 82599 固定源与目标, UDP, 64字节小包, 1488w pps 单核CPU软中断sirq 100%
- shuffle和排序
- 为HT公司搭建一台 web 服务器
- 微软100题第46题:四对括号可以有多少种匹配排列方式?
- 青蛙跳井的故事
- 剑指offer 41 - 和为s的两个数字VS为s的连续正数序列
- Android项目目录结构分析
- linux核心技术免费学习视频
- 回调函数 作业1
- Beijing Bus
- Maven入门(一)
- 有道词典