乐易论坛-乐易网易语言培训教程火山PC视窗中文编程交流论坛

 找回密码
 立即注册

手机号登录

用手机号号登陆

微信登录

微信扫码,快速开始

QQ登录

用QQ账号登陆

办理VIP,定制软件,报名培训联系QQ[重磅]2024年实地培训高清培训目录火山PC版乐易模块使用教程
有了火山,易语言是否还有必要学习吗?易语言0基础入门课程火山PC视窗0基础入门课程
乐易论坛官方QQ群一览表易语言外挂0基础入门课程火山PC视窗火山HOOK入门课程
易语言误报处理课程QQ空间POST课程2022年火山PC易语言POST系列课程
Android逆向Jeb动态调试0基础课程QQ邮箱网页POST课程WeChat个微Hook实战课程
百日Js加密分析实战课程(无密下载)QQ群POST课程h5游戏WebSocket逆向视频
JavaScript加密特训课程易语言汇编快速入门课程破解实战系列课程
手游模拟器脚本0基础课程易语言加密防破解0基础入门课程广告位招租联系QQ1615457736
查看: 7541|回复: 1

C++正则表达式引擎设计与实现(core)

[复制链接]

C++正则表达式引擎设计与实现(core)

[复制链接]
已绑定手机
已实名认证
揰掵佲
等级头衔

等級:乐易运营组

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分成就
易币
贡献
主题
精华
金钱
积分
33746
注册时间
2014-8-2
最后登录
1970-1-1

勋章墙

2017-3-19 14:03:57 | 显示全部楼层 |阅读模式
标 题: 【原创】C++正则表达式引擎设计与实现(core)
作 者: 红绡枫叶
时 间: 2016-10-19,22:50:13
链 接: http://bbs.pediy.com/showthread.php?t=213353

此正则引擎主要目的还是让更多的人了解自动机理论的一些实际应用.
C++11实现.

1.核心文法设计

正则表达式有三种最基本的操作:
(1)选择 取并集.符号:|. 比如两个字符串集合R和S的选择操作,记作R|S.

(2)连接 字符串之间的拼接.两个字符串集合R和S的连接为RS.

(3)闭包 符号:* 字符串集合R的闭包R*是指把R与自身连接零次或者多次形成的所有集合的并集.

由这几个简单的操作可以得到我们平常接触的正则表达式的所有扩展.

所以设计最核心的正则文法G[RE]:

<RE>--><expr>

<expr>--><term>'|'<expr>|<term>

<term>--><factory><term>|<factory>

<factory>--><item>'*'|<item>

<item>-->'('expr')'|<sym>

<sym>-->a|b|c|....

文法已经把优先级写进去了,优先级分别是'('=')'>'*'>连接>'|'.
2.正则表达式引擎架构设计

文法解析用递归下降分析.分析完之后生成有限状态自动机.因此正则引擎主要两部分是正则分析器与状态机.

3.正则表达式引擎实现

在C++11标准库上实现了核心引擎,代码在github.

主要算法是将非确定性有限状态自动机(Non-deterministic Finite Automaton,NFA)转化到确定性有限状态自动机(Deterministic Finite Automaton,DFA)以及简化DFA的算法.两个算法本质上都是对等价状态集合的计算来简化状态机.现引用一段算法的介绍:

NFA到DFA


NFA到DFA的子集构造算法(The Subset Construction):从将初始状态划分为一个初始状态子集开始,构造状态子集(经过零个或多个空字符串ε转移到的状态和已在子集中的状态都是构造的新的状态子集),存在c属于字母表Σ,经过一个c的转移(必须有c的转移),能够使得从状态子集ni转移到状态子集nj,则在DFA中有在c的输入下从状态子集ni转移到状态子集nj的转移.最后不再有新的状态子集出现.根据状态子集的转移依次构造DFA.

DFA到最小DFA


最小化DFA用到的是等价状态集合的划分来构建.一开始只有两个状态集,一个接受状态集合,一个非接受状态集合.对于每一个状态集合Sp,如果存在c属于字母表Σ,使得Sp中的状态转移到不同的状态集合(包括没有转移的空状态集合),则拆分Sp,使得拆分后的状态集合中的每一个状态不可能转移到不同的状态集合.其中状态集合之间的转移构成最小化DFA中的转移.
更多的介绍:从正则表达式(RE)到最小确定性有限状态自动机(DFA)

我在核心引擎基础上上写了一个小工具方便查看状态机的构造过程.可以直接生成DOT语言描述的状态机图.

ERE.exe --help

Allowed options:

-h [ --help ] produce help message

-e [ --expr ] arg set regular expression

-s [ --string ] arg string to check by regular expression

-a [ --alphabet ] arg set regular expression alphabet

输入:ERE.exe -e "a(b|cd)*e" -s abbbcdcde,表示在正则表达式"a(b|cd)*e"下读入abbbcdcde字符串.输出匹配结果,并生成DOT状态机图文件:
[/url]

利用Graphviz的dot工具生成png图片:

dot -T png -O NFA.dot DFA.dot min_DFA.dot
NFA:
[url=http://m.pediy.com/attachment.php?attachmentid=107854&d=1476888441]

DFA:
[url=http://m.pediy.com/attachment.php?attachmentid=107852&d=1476888441][/url]
最小化DFA:


源代码:


https://github.com/yufengzjj/ERE

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

已绑定手机
冯古屋
等级头衔

等級:【编程大师】

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分成就
易币
贡献
主题
精华
金钱
积分
1231
注册时间
2014-9-4
最后登录
1970-1-1

勋章墙

2017-3-19 22:54:05 | 显示全部楼层
不明觉厉!
回复

使用道具 举报

如果懒得打字,请选择右侧内容快捷回复 提醒:以任何方式进行『恶意灌水』的行为,进行封号处理
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

热点推荐上一条 /5 下一条

QQ|网站地图|手机版|小黑屋|乐易论坛-乐易网 | 湘ICP备19007035号

拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表乐易立场!

娄底市乐易网络科技有限公司声明:乐易原创培训课程版权均为我公司所有,未经许可,不得擅自翻录,盗版,破解本站课课程,我们将保留法律诉讼的权利

GMT+8, 2024-4-28 15:35 , Processed in 0.065571 second(s), 44 queries .

Powered by Discuz! X3.4

Copyright © Tencent Cloud.

快速回复 返回顶部 返回列表