#-*-coding:utf-8-*-
G = raw_input("提示输入文法:"); #G为文法
S = G[2] #识别符号S Vn = raw_input("提示输入Vn:"); #Vn为非终结符号集
charactersVn = Vn.split(','); #记录每个非终结符号
VnString = "";
for var in charactersVn:
VnString += var + ",";
vAll = [];
lefties = []; #所有产生式左边的符号
setAllVt = set([]); #含重复元素
setVtAndVn = set([]); #非终结符号集的集合 P = raw_input("提示依次输入产生式规则:"); #P为产生式集
setP = P.split(); #根据空格分
for varP in setP:
n_t = varP.split('::=');
# leftOfP = n_t[0]; #产生式左边
lefties.append(n_t[0]);
rightOfP = n_t[1]; #产生式右边
rightChar = rightOfP.split('|'); #产生式右边的分割
setAllVt = setAllVt | set(rightChar); #所有产生式右边的式子的集合 #只保留式子右边中的单个符号
for ele in list(setAllVt):
# if len(ele) == 1:
# setVtAndVn = setVtAndVn | set(ele);
for i in range(0, len(ele)):
setVtAndVn = setVtAndVn | set(ele[i]); setVt = list(setVtAndVn - set(charactersVn)) #利用集合的差求非终结符号集
VtString = "";
for var in setVt:
VtString += var + ",";
#print setVt; #print len(lefties);
flag = 0; #代表几型文法
length = 0;
#记录并判断产生式左边长度是否都为1
for varLefty in lefties:
length += len(varLefty) if length == len(lefties): #长度都为1
flag = 2;
else:
flag = 1; #在0型文法和1型文法之间进行判断
if flag == 1:
for varP in setP:
n_t = varP.split('::=');
left = n_t[0];
right = n_t[1];
righties = right.split('|');
for righty in righties:
if len(left) > len(righty):
flag = 0; #在2型文法和3型文法中间进行选择
count = 0;
total = 0;
twoOrThird = 0;
if flag == 2:
twoOrThird = 1;
for varP in setP:
n_t = varP.split('::=');
right = n_t[1]; #::=的左边
righties = right.split('|'); #|分割后的每个产生式右边(由于表达形式的原因,要再次区分并计数)
for righty in righties:
total += 1;
if len(righty) == 1 and righty[0] in setVt: #右边为单个终结符合
count += 1;
elif len(righty) == 2 and righty[0] in setVt and righty[1] in charactersVn: #右边为单个终结符号加单个非终结符号
count += 1; if count == total and twoOrThird == 1:
flag = 3; print "文法" + G + "= ({" + VnString[:-1] + "} ,{" + VtString[:-1] + "}, P, " + G[2] + ")\n" ;
print P + "\n"
print "该文法是Chomsky%d型文法" % flag;

文法分类的python实现的更多相关文章

  1. day02-操作系统、编程语言分类及python安装

    目录 操作系统 编程语言分类 安装python解释器 操作系统 操作系统有什么用 操作系统能接受外部指令转化成0和1,并把一些对硬件的复杂操作简化成一个个简单的接口,作为中间人连接硬件和软件 计算机三 ...

  2. 编程语言分类及python所属类型

    编程语言分类及python所属类型 编程语言主要从以下几个角度为进行分类:编译型和解释型.静态语言和动态语言.强类型定义语言和弱类型定义语言. 编译和解释的区别是什么? 编译器是把源程序的每一条语句都 ...

  3. 操作系统+编程语言的分类+执行python程序的两种方式+变量

    1.什么是操作系统? 操作系统就是一个协调\管理\控制计算机硬件资源与软件资源的一个控制程序. 2.为何要操作系统? a.把复杂的硬件操作封装成简单的功能\接口用来给用户或者程序来使用(文件) b.把 ...

  4. 朴素贝叶斯文本分类实现 python cherry分类器

    贝叶斯模型在机器学习以及人工智能中都有出现,cherry分类器使用了朴素贝叶斯模型算法,经过简单的优化,使用1000个训练数据就能得到97.5%的准确率.虽然现在主流的框架都带有朴素贝叶斯模型算法,大 ...

  5. 编程语言分类和Python解释器介绍

    主要内容: 一.编程语言分类和介绍 二.Python解释器分类和介绍 一.编程语言分类和介绍 1.编程语言分类 编程语言的发展依次经历了机器语言.汇编语言和高级语言. 2.编程语言的介绍   2.1 ...

  6. 【0806 | Day 9】三张图带你了解数据类型分类和Python深浅拷贝

    一.数据类型分类 二.Python深浅拷贝

  7. learn python, ref, diveintopython 分类: python 2015-07-22 14:42 14人阅读 评论(0) 收藏

    for notes of learing python. // just ignore the ugly/wrong highlight for python code. ""&q ...

  8. Python调用C可执行程序(subprocess) 分类: python 服务器搭建 C/C++ shell 2015-04-13 21:03 87人阅读 评论(0) 收藏

    从Python 2.4开始,Python引入subprocess模块来管理子进程,以取代一些旧模块的方法:如 os.system.os.spawn.os.popen.popen2.commands. ...

  9. Python异常处理 分类: python Raspberry Pi 服务器搭建 2015-04-01 13:22 172人阅读 评论(0) 收藏

    一个程序要保持稳定运行必须要有异常处理,本文将简单介绍Python中的try-except..异常处理语句的使用. 该种异常处理语法的规则是: 执行try下的语句,如果引发异常,则执行过程会跳到第一个 ...

随机推荐

  1. IE8,IE10下载的临时文件到哪里去了???

    操作攻略: 打开IE浏览器=>工具=>Internet选项=>常规选项卡中,找到"浏览历史记录"=>设置,然后就可看到"当前位置"所列出 ...

  2. c#的那些有效性判断

    在开发中合理的对象有效性判断是程序健壮性的重要保障,也有利于提高程序的执行效率.本人简单总结了几个需要判断对象是否为空的例子,分享如下: 一.集合对象中可以包含空对象,遍历集合对象时要同时判断集合中的 ...

  3. jquery简介和实例

    一.简介 定义 jQuery创始人是美国John Resig,是优秀的Javascript框架: jQuery是一个轻量级.快速简洁的javaScript库. 参考:http://www.php100 ...

  4. Aspose.Words基本操作

    一个非常好用的控件. 基本的操作可以参考伍大神的文章: http://www.cnblogs.com/wuhuacong/archive/2012/08/30/2662961.html 在这里补充四点 ...

  5. [Android]官网《monkeyrunner》中文翻译

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5050768.html 翻译自 Android Develope ...

  6. Linux0.11内核--加载可执行二进制文件之3.exec

    最后剩下最核心的函数do_execve了,由于这里为了简单起见我不分析shell命令的情况, /* * 'do_execve()'函数执行一个新程序. */ //// execve()系统中断调用函数 ...

  7. 蚂蚁金服寒泉子:JVM源码分析之临门一脚的OutOfMemoryError完全解读

    ➠更多技术干货请戳:听云博客 概述 OutOfMemoryError,说的是java.lang.OutOfMemoryError,是JDK里自带的异常,顾名思义,说的就是内存溢出,当我们的系统内存严重 ...

  8. TabLayout和ViewPager简单实现页卡的滑动

    首先需要在当前的module中的build Gradle的 dependencies中加入以下句子 compile 'com.android.support:design:23.0.1' 因为我们用到 ...

  9. [原创]python之socket-ftp

    今天来讲讲ftp文件下载,感觉挺有趣的,知道吧,就那种看到新文件生成,而自己写的代码也不多,那种成就感! 一.需求: 客户端发送指令给服务端,服务端根据指令找到相应文件,发送给客户端 分析: PS:e ...

  10. c#中抽象类(abstract)和接口(interface)的相同点与区别

    相同点: 1.都可以被继承 2.都不能被实例化 3.都可以包含方法声明 4.派生类必须实现未实现的方法 区别: 1.抽象基类可以定义字段.属性.方法实现.接口只能定义属性.索引器.事件.和方法声明,不 ...