求算符文法的FIRSTVT集的算法
原理
数据结构
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',;
运行结果

求算符文法的FIRSTVT集的算法的更多相关文章
- 关联规则—频繁项集Apriori算法
频繁模式和对应的关联或相关规则在一定程度上刻画了属性条件与类标号之间的有趣联系,因此将关联规则挖掘用于分类也会产生比较好的效果.关联规则就是在给定训练项集上频繁出现的项集与项集之间的一种紧密的联系.其 ...
- K:Union-Find(并查集)算法
相关介绍: 并查集的相关算法,是我见过的,最为之有趣的算法之一.并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.其相关的实现代码较为简短,实现思想也 ...
- 求用delphi编写的LRC校验位算法函数,急!!!
求用delphi编写的LRC校验位算法函数,急!!! 某命令串为":010200000001FC" 其16进制为“3A 30 31 30 32 30 30 30 30 30 30 ...
- c语言求回文数的三种算法的描述
c语言求回文数的三种算法的描述 题目描述 注意:(这些回文数都没有前导0) 1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个: 2位的回文数有11,22,33,44,55,66,77,8 ...
- SIGAI机器学习第二十一集 AdaBoost算法2
讲授Boosting算法的原理,AdaBoost算法的基本概念,训练算法,与随机森林的比较,训练误差分析,广义加法模型,指数损失函数,训练算法的推导,弱分类器的选择,样本权重削减,实际应用. 大纲: ...
- 并查集(union-find)算法
动态连通性 . 假设程序读入一个整数对p q,如果所有已知的所有整数对都不能说明p和q是相连的,那么将这一整数对写到输出中,如果已知的数据可以说明p和q是相连的,那么程序忽略p q继续读入下一整数对. ...
- 求最长回文子串——Manacher算法
回文串包括奇数长的和偶数长的,一般求的时候都要分情况讨论,这个算法做了个简单的处理把奇偶情况统一了.算法的基本思路是这样的,把原串每个字符中间用一个串中没出现过的字符分隔开来(统一奇偶),用一个数组p ...
- bzoj 1191: [HNOI2006]超级英雄Hero 并查集 || 匈牙利算法
1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1804 Solved: 850[Submit][S ...
- 常见算法:C语言求最小公倍数和最大公约数三种算法
最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,当中一个最小的公倍数是他们的最小公倍数,相同地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求 ...
随机推荐
- Javascript and AJAX with Yii(在yii 中使用 javascript 和ajax)
英文原文:http://www.yiiframework.com/wiki/394/javascript-and-ajax-with-yii /*** http://www.yiiframework. ...
- 【转】PyDev for Eclipse 简介
转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-pydev/index.html PyDev for Eclipse 是一 ...
- (转)JS托管和最新的jQuery引用地址大全(jQuery最新版v1.9.0)
什么是Google的js托管? 说的明白点,跟我们以往做法一样,只不过这时候的引用的js库是放在Google服务器上的.比如引用jquery,则使用路径http://ajax.googleapis.c ...
- WDCP是什么 关于WDCP的详细介绍
WDCP是WDlinux Control Panel的简称,是一套用PHP开发的Linux服务器管理系统以及虚拟主机管理系统,,旨在易于使用Linux系统做为我们的网站服务器,以及平时对Linux服务 ...
- win8笔记本无法搜索wifi信号找不到WLAN该 wifi共享特别注意的服务
WlansvcWLAN AutoConfigWLANSVC 服务提供配置.发现.连接.断开与 IEEE 802.11 标准定义的无线局域网(WLAN)的连接所需的逻辑.它还包含将计算机变成软件访问点的 ...
- json.net xml转换为json格式时,如何将指定节点转换成数组
using System.Xml.Linq; using Newtonsoft.Json; Response.ContentType = "application/json"; X ...
- sql server和my sql 命令(语句)的差别,sql server与mysql的比較
sql与mysql的比較 1.连接字符串 sql :Initial Catalog(database)=x; --数据库名称 Data Source(source)=x; ...
- AOP 的利器:ASM 3.0 介绍
引言 什么是 ASM ? ASM 是一个 Java 字节码操控框架.它能被用来动态生成类或者增强既有类的功能.ASM 可以直接产生二进制 class 文件,也可以在类被加载入 Java 虚拟机之前动态 ...
- display_errors & error_reporting(php调试安全)
这两个选项对应的值即都可以在php.ini文件中设置,也都可以在php代码中使用相应的函数来设置. 在php.ini文件中的设置如下:
- 【转】谈Objective-c block的实现
本文转自http://blog.devtang.com/blog/2013/07/28/a-look-inside-blocks/,如有侵权,请联系我删除 前言 这里有关于block的5道测试题,建议 ...