文法分类的python实现
#-*-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实现的更多相关文章
- day02-操作系统、编程语言分类及python安装
目录 操作系统 编程语言分类 安装python解释器 操作系统 操作系统有什么用 操作系统能接受外部指令转化成0和1,并把一些对硬件的复杂操作简化成一个个简单的接口,作为中间人连接硬件和软件 计算机三 ...
- 编程语言分类及python所属类型
编程语言分类及python所属类型 编程语言主要从以下几个角度为进行分类:编译型和解释型.静态语言和动态语言.强类型定义语言和弱类型定义语言. 编译和解释的区别是什么? 编译器是把源程序的每一条语句都 ...
- 操作系统+编程语言的分类+执行python程序的两种方式+变量
1.什么是操作系统? 操作系统就是一个协调\管理\控制计算机硬件资源与软件资源的一个控制程序. 2.为何要操作系统? a.把复杂的硬件操作封装成简单的功能\接口用来给用户或者程序来使用(文件) b.把 ...
- 朴素贝叶斯文本分类实现 python cherry分类器
贝叶斯模型在机器学习以及人工智能中都有出现,cherry分类器使用了朴素贝叶斯模型算法,经过简单的优化,使用1000个训练数据就能得到97.5%的准确率.虽然现在主流的框架都带有朴素贝叶斯模型算法,大 ...
- 编程语言分类和Python解释器介绍
主要内容: 一.编程语言分类和介绍 二.Python解释器分类和介绍 一.编程语言分类和介绍 1.编程语言分类 编程语言的发展依次经历了机器语言.汇编语言和高级语言. 2.编程语言的介绍 2.1 ...
- 【0806 | Day 9】三张图带你了解数据类型分类和Python深浅拷贝
一.数据类型分类 二.Python深浅拷贝
- 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 ...
- 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. ...
- Python异常处理 分类: python Raspberry Pi 服务器搭建 2015-04-01 13:22 172人阅读 评论(0) 收藏
一个程序要保持稳定运行必须要有异常处理,本文将简单介绍Python中的try-except..异常处理语句的使用. 该种异常处理语法的规则是: 执行try下的语句,如果引发异常,则执行过程会跳到第一个 ...
随机推荐
- 分享20款移动开发中很有用的 jQuery 插件
今天,很显然每个网站都需要有一个移动优化的界面以提高移动用户的使用体验.在开发任何移动项目时,要尽可能保持每一种资源尺寸都尽可能的小,以给最终用户提供一个好的体验是非常重要的.在这篇文章中我们已经编制 ...
- cocos2d-x3.3 以前版本 工程Xcode6编译时的问题
Undefined symbols for architecture i386: "_fwrite$UNIX2003", referenced from: _unixErrorHa ...
- inline-block 空白间距问题
一. 问题 元素是inline-block属性时,会有空白间隙 二. 解决方案 1. html方式 1)将元素之间的空隙去除 <div class="space"> & ...
- [threeJs][新浪股票api][css3]3D新浪财经数据-最近A股涨的也太疯了......
使用threeJS搭配新浪股票财经API 在线: http://wangxinsheng.herokuapp.com/stock 截图: A股涨幅榜[一片红10%] 检索[单击添加到自选内,自选使用l ...
- SPF邮件伪造漏洞测试脚本
测试脚本: # -*- coding: utf-8 -*- import socket,select,base64,os,re,time,datetime class mail: def __init ...
- AJAX初探,XMLHttpRequest介绍
AJAX初探,XMLHttpRequest介绍 AJAX AJAX = Asynchronous JavaScript and XML. 异步的JavaScript和XML. AJ ...
- 友盟(Swift)-集成、统计用户数量、具体页面访问数量、具体按钮点击数量
什么是友盟.有什么用? 这些傻瓜问题这里就不解释了,可以自己百度去. 友盟提供的文档和demo都是oc的,这里用swift写了一个小demo,在此分享一下. 步骤1:友盟后台注册应用(iOS),拿到a ...
- 来自沪江、滴滴、蘑菇街架构师的 Docker 实践分享
架构师小组交流会是由国内知名公司架构师参与的技术交流会,每期选择一个时下最热门的技术话题进行实践经验分享. Docker 作为当前最具颠覆性的开源技术之一,其轻量虚拟化.可移植性是 CI/CD.Dev ...
- 基于Windows 10平台的PM2.5检测器制作
本篇文章详细讲解了如何利用SDS011激光式PM2.5传感器.HC-06蓝牙模块和Windows 10设备完成一个简单的PM2.5检测器及其应用程序的开发.该检测器使用蓝牙完成数据输出,方便设备连接, ...
- 通过Ajax使用FormData对象无刷新上传文件
写在前面:本文说的这个方案有浏览器兼容性问题:所有主流浏览器的较新版本已经支持这个对象了,比如Chrome 7+.Firefox 4+.IE 10+.Opera 12+.Safari 5+,对兼容性比 ...