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,与第一篇文章中的类似,
0 0