原理

数据结构

 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集的算法的更多相关文章

  1. 关联规则—频繁项集Apriori算法

    频繁模式和对应的关联或相关规则在一定程度上刻画了属性条件与类标号之间的有趣联系,因此将关联规则挖掘用于分类也会产生比较好的效果.关联规则就是在给定训练项集上频繁出现的项集与项集之间的一种紧密的联系.其 ...

  2. K:Union-Find(并查集)算法

    相关介绍:  并查集的相关算法,是我见过的,最为之有趣的算法之一.并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题.其相关的实现代码较为简短,实现思想也 ...

  3. 求用delphi编写的LRC校验位算法函数,急!!!

    求用delphi编写的LRC校验位算法函数,急!!! 某命令串为":010200000001FC" 其16进制为“3A 30 31 30 32 30 30 30 30 30 30 ...

  4. c语言求回文数的三种算法的描述

    c语言求回文数的三种算法的描述 题目描述 注意:(这些回文数都没有前导0) 1位的回文数有0,1,2,3,4,5,6,7,8,9 共10个: 2位的回文数有11,22,33,44,55,66,77,8 ...

  5. SIGAI机器学习第二十一集 AdaBoost算法2

    讲授Boosting算法的原理,AdaBoost算法的基本概念,训练算法,与随机森林的比较,训练误差分析,广义加法模型,指数损失函数,训练算法的推导,弱分类器的选择,样本权重削减,实际应用. 大纲: ...

  6. 并查集(union-find)算法

    动态连通性 . 假设程序读入一个整数对p q,如果所有已知的所有整数对都不能说明p和q是相连的,那么将这一整数对写到输出中,如果已知的数据可以说明p和q是相连的,那么程序忽略p q继续读入下一整数对. ...

  7. 求最长回文子串——Manacher算法

    回文串包括奇数长的和偶数长的,一般求的时候都要分情况讨论,这个算法做了个简单的处理把奇偶情况统一了.算法的基本思路是这样的,把原串每个字符中间用一个串中没出现过的字符分隔开来(统一奇偶),用一个数组p ...

  8. bzoj 1191: [HNOI2006]超级英雄Hero 并查集 || 匈牙利算法

    1191: [HNOI2006]超级英雄Hero Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1804  Solved: 850[Submit][S ...

  9. 常见算法:C语言求最小公倍数和最大公约数三种算法

    最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,当中一个最小的公倍数是他们的最小公倍数,相同地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求 ...

随机推荐

  1. Yii 生成表单下拉选框及查询下拉选框

    CHtml类参考: http://www.yiichina.com/api/CHtml#activeDropDownList-detail activeDropDownList() 方法 public ...

  2. Ubuntu下Django初体验(三)——django初体验

    Django中的重要概念: 一次web访问的实质: 1. 客户发送http请求到web服务回 2. web服务器返回html页面给客户 Django概述: 1. URL配置             建 ...

  3. Android4.0 以后不允许在主线程进行网络连接

    Android4.0 以后不允许在主线程进行网络连接,否则会出现 android.os.NetworkOnMainThreadException.因此,必须另起一个线程进行网络连接方面的操作. pac ...

  4. java利用commons-email发送邮件并进行封装

    本例中利用commons-email发送邮件并进行封装,支持html内容和附件:Commons Email是Apache的Commons子项目下的一个邮件客户端组件,它是基于JavaMail的,大大简 ...

  5. 【ThinkingInC++】65、使用delete void*可能会出错

    /** * 书本:[ThinkingInC++] * 功能:使用delete void*可能会出错 * 时间:2014年10月5日14:31:43 * 作者:cutter_point */ #incl ...

  6. WCF - 学习总目录

    WCF - 基础 WCF - 地址 WCF - 绑定 WCF - 绑定后续之自定义绑定 WCF - 契约 WCF - 序列化 WCF - 消息 WCF - 实例与会话 WCF - REST服务

  7. Intra-cluster Replication in Apache Kafka--reference

    Kafka is a distributed publish-subscribe messaging system. It was originally developed at LinkedIn a ...

  8. 深度剖析:CDN内容分发网络技术原理--转载

    1.前言 Internet的高速发展,给人们的工作和生活带来了极大的便利,对Internet的服务品质和访问速度要求越来越高,虽然带宽不断增加,用户数量也在不断增加,受Web服务器的负荷和传输距离等因 ...

  9. android开发之Toast的多种应用

    Toast最基本的功能就是弹出一个弱提示,这个很简单我就不说了,说说Toast一些其他的作用. 来公司的时候,公司产品的1.0版本已经发布出去了,但是1.0是一个必须联网才能使用的产品,在2.0中想让 ...

  10. Unty3D动态加载图片

    试验动态加载图片,代码如下: using UnityEngine; using System.Collections; public class DynamicLoad : MonoBehaviour ...