re2正则表达式引擎学习(三)
来源:互联网 发布:手机淘宝闲鱼官网主页 编辑:程序博客网 时间:2024/05/16 01:10
prog.h 和 prog.cc定义了几种基本的数据结构:
Bitmap(用bit位来标记某个元素的值),主要用于bytemap字符到字符集合的计算,划分字符区间:[00-ff],[61-61],[62-62],[63-63]
InstOp(几种基本的指令操作码,与Inst对应),
EmptyOp(^,$,\A,\z,\b,\B),
Inst表示指令,所有的正则表达式都可以由这几种指令所构成 (类似NFA的几种基本结构,复杂的大型结构由多种基本结构复合构成)Inst定义了若干函数构建对应的基本结构
Anchor,
MatchKind, 匹配时的贪婪与否
Prog Compile之后的类型,类似于NFA,
compile.cc文件
PatchList 看做指针,下标就好,自定义的一种指针 定义了Mk,Patch,Deref,Append四个基本操作函数接口使多个Inst结合为一个Frag(就是将多个NFA的基本结构连接为一个NFA图的结构Frag)
Frag 结构,多个Inst复合的一种结构,包括开始Inst和结束Inst,与PatchList的函数一起使用对多个Inst结合为一个大的Frag
Encoding 编码方式,项目中使用的应该是kEncodingLatin1编码方式
Compiler
后序遍历构建的Regexp结构(如ab*c|d -> ab*.c.d|),每读取一个元素,建立对应的基本Inst结构,当遇到符号要进行归并时,建立对应的Inst结构并将其中的out,out1等替换为对应的Frag结构,即多个小的Frag组合为一个大的Frag。完成后,最终应该为一个大的Frag结构
Compiler中使用遍历语法树regexp的Walker来逐步遍历语法树,转换为Prog形式。
使用Walker遍历语法树Regexp,每个节点的类型为Frag(结构)。扫描节点对应的所有子树,并根据其操作符与父节点结合成为新的节点,取代原来的节点树,一直持续直到语法树中只剩下一个节点Frag。这个过程是在Compiler中进行的,compiler根据遍历的状态,动态的为扫描到的每一个状态分配空间,记录状态数。当完成整个扫描过程后,将最终的状态数等信息存入Prog中,销毁compiler。完成语法树Regexp到Prog的转换。Compiler只在过程中使用,完成转换后就销毁
Prog转换为NFA进行匹配,匹配时,q0_,q1_分别作为当前的状态集合和下一个状态集合,对runq状态集合,匹配字符并转移到状态集合nextq。step函数来完成匹配并转移状态集合的功能(状态集合中的所有状态runq,分别接受字符c,p指针向前移动一位,并将新状态和新状态通过空边可以到达的状态加入到状态集nextq中。AddToThreadq函数,inst的id,及后通过空边可以到达的状态加入到状态集threadq中)。然后销毁runq,置换runq和nextq,重新开始匹配过程。
问题:thread怎么理解。如果按照threadq为当前所在状态集合的话,thread应该是状态,相当于state,与第一篇文章中的类似,
Bitmap(用bit位来标记某个元素的值),主要用于bytemap字符到字符集合的计算,划分字符区间:[00-ff],[61-61],[62-62],[63-63]
InstOp(几种基本的指令操作码,与Inst对应),
EmptyOp(^,$,\A,\z,\b,\B),
Inst表示指令,所有的正则表达式都可以由这几种指令所构成 (类似NFA的几种基本结构,复杂的大型结构由多种基本结构复合构成)Inst定义了若干函数构建对应的基本结构
Anchor,
MatchKind, 匹配时的贪婪与否
Prog Compile之后的类型,类似于NFA,
compile.cc文件
PatchList 看做指针,下标就好,自定义的一种指针 定义了Mk,Patch,Deref,Append四个基本操作函数接口使多个Inst结合为一个Frag(就是将多个NFA的基本结构连接为一个NFA图的结构Frag)
Frag 结构,多个Inst复合的一种结构,包括开始Inst和结束Inst,与PatchList的函数一起使用对多个Inst结合为一个大的Frag
Encoding 编码方式,项目中使用的应该是kEncodingLatin1编码方式
Compiler
后序遍历构建的Regexp结构(如ab*c|d -> ab*.c.d|),每读取一个元素,建立对应的基本Inst结构,当遇到符号要进行归并时,建立对应的Inst结构并将其中的out,out1等替换为对应的Frag结构,即多个小的Frag组合为一个大的Frag。完成后,最终应该为一个大的Frag结构
Compiler中使用遍历语法树regexp的Walker来逐步遍历语法树,转换为Prog形式。
使用Walker遍历语法树Regexp,每个节点的类型为Frag(结构)。扫描节点对应的所有子树,并根据其操作符与父节点结合成为新的节点,取代原来的节点树,一直持续直到语法树中只剩下一个节点Frag。这个过程是在Compiler中进行的,compiler根据遍历的状态,动态的为扫描到的每一个状态分配空间,记录状态数。当完成整个扫描过程后,将最终的状态数等信息存入Prog中,销毁compiler。完成语法树Regexp到Prog的转换。Compiler只在过程中使用,完成转换后就销毁
Prog转换为NFA进行匹配,匹配时,q0_,q1_分别作为当前的状态集合和下一个状态集合,对runq状态集合,匹配字符并转移到状态集合nextq。step函数来完成匹配并转移状态集合的功能(状态集合中的所有状态runq,分别接受字符c,p指针向前移动一位,并将新状态和新状态通过空边可以到达的状态加入到状态集nextq中。AddToThreadq函数,inst的id,及后通过空边可以到达的状态加入到状态集threadq中)。然后销毁runq,置换runq和nextq,重新开始匹配过程。
问题:thread怎么理解。如果按照threadq为当前所在状态集合的话,thread应该是状态,相当于state,与第一篇文章中的类似,
0 0
- re2正则表达式引擎学习(三)
- re2正则表达式引擎学习(二)
- re2正则表达式引擎学习(一)
- re2正则表达式引擎学习(四)
- re2正则表达式引擎学习(五)
- RE2正则表达式库的Windows移植
- RE2,C++正则表达式库实战
- 正则表达式学习(三)
- 正则表达式学习(三)
- 学习正则表达式(三)
- 正则表达式学习(三)
- 多个正则引擎的比较(pcre re2 hyperscan)
- python正则表达式二:literal、re1|re2 和 .
- 正则表达式学习三
- 正则表达式学习笔记(三)
- 正则表达式学习笔记(三)
- delphi正则表达式学习笔记(三)
- python正则表达式学习(三)
- adb 调试连接补上问题
- 【剑指Offer面试题】 九度OJ1514:数值的整数次方
- POJ No 2371
- jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令
- Linux学习3_学习shell脚本前应具备的基础知识
- re2正则表达式引擎学习(三)
- RRDTool(二)--update,graph
- TImer定时器的方法schedule和scheduleAtFixedRate区别已经动态修改定时计划的实现
- 拓扑排序
- 浅谈apache防盗链
- poj 1789 Truck History(先让我静静)
- GIT
- maven的安装和配置(手动和eclipse插件)
- Lua中的模块(module)和包(package)详解