(2015大作业)茹何优雅的手写正则表达式引擎(regular expression engine

貌似刚开学的时候装了个逼,和老师立了个flag说我要写个正则表达式引擎,然后学期末估计老师早就忘了这茬了,在历时3个月的懒癌发作下,终于在这学期末deadline的时候花了一个下午加晚上在没有网的房间写完了它,于是便有了这篇blog,本来想正儿八紧写篇论文,说不定毕业设计可以直接丢一篇这个走人,但第一觉得一个晚上写好的东西太low了,第二自己实在不适合写那种正经的论文,于是还是写从高中开始的一贯的乱七八糟体好了.
主要写自己写的时候遇到的一些瓶颈,例如茹何储存一个图,茹何遍历一个图,茹何表示一个集合之类基础的问题,等不再赘述.请自行查阅数据结构,C++ STL之类的相关书籍,首先介绍一些基础知识

1.DFA.NFA.正则表达式
DFA即有穷状态自动机,是一个有向图,其中每条边有有一个字母.这个图有唯一一个起始点 q0 ,有一些点是终止状态,现在有一个字符串str,当我们就从起点q0开始,根据下一个字符,在图中走到不同的点上,当整个字符串走完,我们必定停在某个点上,如果那个点是终止状态,那么我们称这个DFA接受这个字符串,反之不接受
/*************************************/
/* 形式化定义DFA:
/* DEF:DFA是一个五元组(Q,∑,δ,q0,F)
/* 其中Q是一个有穷集合,叫做状态集
/* ∑是一个有穷集合,叫做字母表
/* δ是一个映射 δ:Q × ∑ ->Q
/* q0属于Q是起始状态
/* F是Q的子集是终止状态
/*
/* 这个定义前三个定义了一个图G,别忘了图的定义G<V,E,δ> 第四个定义了一个起始状态,第五个定义了终止状态的集合,所以这个定义和上面的说法是定价的
/*
/*************************************/

NFA即非确定有穷状态自动机,简单来说,对于DFA,在每个点,不同的字符走到下一个点是确定的,而NFA则是不确定的,也就是

----------------------to be continue----------------------------------------------------------------------

reference:
[1] Michael Sipser "计算理论导引" 机械工业出版社
[2] Alfred V.aho Monica S.Lam Ravi Sethi Jeffrey D Ullman "Compilers:Pinciples,Techniques,&Tools Second Edition" 人民有点出版社影印
[3] 陈梓瀚(vczh) http://www.cppblog.com/vczh/archive/2008/05/22/50763.html
[4] Andrew W. "现代编译原理 C语言描述" 人民邮电出版社

时间: 2024-11-16 15:10:36

(2015大作业)茹何优雅的手写正则表达式引擎(regular expression engine的相关文章

一款非常好用的boostrap的验证插件、再也不用自己手写正则表达式和js了

基于jquery.bootstrap数据验证插件bootstrapValidator教程 bootstrap:能够增加兼容性的强大框架. 因为项目需要数据验证,看bootstrapValidator 还不错,就上手一直,完美兼容,话不多说. 需要引用css: bootstrap.min.css bootstrapValidator.min.css js: jquery-1.10.2.min.js bootstrap.min.js bootstrapValidator.min.js (下载实例)

大四重写大一的C语言大作业是一种怎样的体验

序言 在整理文件时偶然发现大一时的C语言大作业,故突然心血来潮想看看曾经花费一个星期的成果. 它虽然只有一个文件,却足足有829行,可见当时我下了多大功夫.回忆起当时作业的要求,大致也不过是实现一个可以增删改记录的学生成绩管理系统,何至于要写829行呢?找到源码配备的文档,想起那些我绞尽脑汁想出来的诸多花哨的功能,我不禁感慨:年轻就是能折腾啊! 而在我准备仔细拜读时,我却高兴不起来了--我根本看不懂也不想看懂我的代码!尽管我读过很多很烂的代码,但当发现自己曾经的骄傲之作其实是一片垃圾不堪入目时,

[留念贴] C#开发技术期末大作业——星月之痕

明天就要去上海大学参加 2015赛季 ACM/ICPC 最后一场比赛 —— EC-Final,在这之前,顺利地把期末大作业赶出来了. 在这种期末大作业10个人里面有9个是从网上下载的国内计算机水平五六流大学里学习编程,我感到压力很大. 但我依然选择作死——纯手工打造.庆幸的是,历时四天,翘课无数,现在基本完工了. 下载地址:http://pan.baidu.com/s/1pKx6OnL(还有一些小问题,但是逻辑上的BUG不存在了) 下载之后先解压,然后打开DestroyStars\Destroy

《Java语言程序设计》大作业报告 九宫格游戏

    <Java语言程序设计>大作业报告     中国石油大学(北京)2015 - 2016 学年第二学期     班级:_____计算机14-1_______ 姓名:_____  许 恺_________________ 学号:______2014011329___________     题意分析 程序首先需要九个可以移动的格子,大小相等,有字符串标示,其次要可以相应鼠标和键盘方向键的控制,可以自由移动,并且与此同时记录步数,最后在满足条件时弹出对话框并显示步数以及是否打破记录,关于打破

并行计算大作业之多边形相交(OpenMP、MPI、Java、Windows)

***************************************转载请注明出处:http://blog.csdn.net/lttree******************************************** 吐槽: 话说,相当郁闷,2015年,第一次打开博客,准备总结一下这一年.. 结果博客被封了= =! 今天,终于解封了,换了密码,换了密保.... 但是,写回顾的激情有点退散了.. 明后两天要上课,明天还要验收一个综合设计大作业,再后两天要考试,再后两天继续上课,

安卓Db天气客户端 大作业开发 记一

前几天总是叫团队开发.但因为是我自己开发的,所以我决定把它叫做大作业开发 今天写一写这几天做的功课. 项目还没开始,还在筹备,准备功课中. 设计准备改一下,调研还是起到了一些作用的,我觉得天气中加入图片创意虽然还不错,但是会混淆功能,还在考虑该不该去掉. 一开始准备开发ios,虚拟机这都要装了,后来发现说在APPstore发布需要花钱..果断放弃投安卓. 安卓需要java编程,还需要做功课,没有object-C接触的感觉好..就接触了一天的object-c就感觉还能有这样的编程..比尼玛蛋的万年

数据库大作业--由python+flask

这个是项目一来是数据库大作业,另一方面也算是再对falsk和python熟悉下,好久不用会忘很快. 界面相比上一个项目好看很多,不过因为时间紧加上只有我一个人写,所以有很多地方逻辑写的比较繁琐,如果是想学习flask还是推荐之前的项目,地址:http://www.cnblogs.com/INnoVationv2/p/5837495.html 寒假回去我会重构下代码,然后再po出来. 不知道怎么做数据库大作业的也可以参考: 所有功能: 三类用户模式: 一.管理员 1.查看所有档案 2.修改档案信息

机电传动控制大作业第一阶段

机电传动控制大作业第一阶段 一.系统硬件接口定义 系统硬件可分为显示部分.按键输入部分和运动控制部分. 显示部分包括每个楼层的电梯外的楼层显示LED和上下楼指示箭头.电梯内的楼层显示LED和上下楼箭头,LED显示如果用七段共阴数码管则每个LED需要七个继电器来控制显示字符,上下楼箭头每个需要两个继电器IO进行控制,而控制它们的信号源则来自每层楼的行程开关,共七个开关进行输入. 按键输入部分为电梯内和楼层中,电梯内七个常开触点输入楼层,两个常开触点控制开关门,同时需要点亮楼层按键上的指示灯,则需要

DIP大作业---图像分割

数字图像处理课程的大作业,要求如下: 图像分割就是把图像分成若干个特定的.具有独特性质的区域并提出感兴趣目标的技术和过程.它是由图像处理到图像分析的关键步骤.现有的图像分割方法主要分以下几类:基于阈值的分割方法.基于区域的分割方法.基于边缘的分割方法以及基于特定理论的分割方法等.图像分割后提取出的目标可以用于图像语义识别,图像搜索等等领域.要求1:输入一副真彩色RGB图像dog.jpg,完成对小狗的分割,输入结果为只包含小狗区域的二值图(matlab环境下,小狗区域值为1,其他区域值为0).要求