用于遍历为具有高级特征的正则表达式图样生成的非确定有限自动机(nfa)的系统和方法_5

文档序号:8395915阅读:来源:国知局
为'b',固定计数节点与其元素匹配,该元 素也为'b'。在固定计数节点N2506匹配之后,然后,图形行走引擎加载为标记节点的节点 N3508。标记节点指示找到匹配。然后,如果复制位为'1',则图形行走引擎弹出运行堆栈中 的所有条目并丢弃它们,在这种情况下,其丢弃运行堆栈中的包含具有有效载荷偏移3的 节点N0502的单个条目。复制位为一个标志位,当到达NFA图形中的标记节点后(例如,找 出有效载荷中的匹配),可以从运行堆栈弹出标志标记复制位(例如,设置为'1')的任何运 行堆栈条目并将其丢弃而不进行进一步处理。如果没有标记复制位(例如,设置为'〇'),则 当被弹出后,不丢弃运行堆栈条目,而是被处理以试图找到附加(例如,针对全匹配节点) 匹配。
[0172] 关于图17,更加详细地描述了处理可变计数懒惰节点。
[0173] 如果节点N0502是贪婪的,则图形行走引擎找出到下一个节点(节点N1504)的 可能的最长路径。例如,有效载荷中的第一"z"或"Z"不一定意味着处理节点N1504。假 设图形行走引擎处理"yyyZbbbbbzyyyZbbbbb"的相同有效载荷。虽然懒惰节点N0502返 回"yyyZbbbbb"作为匹配,但贪婪节点N0502返回"yyyZbbbbbzyyyZbbbbb"。换言之,节点 N0502忽略第一可能的匹配而继续对有效载荷进行匹配以找到最长可能的匹配。以此类方 式对有效载荷进行匹配需要图形行走引擎保存其步伐,例如,通过将有效载荷位置的节点 和偏移推送至运行堆栈。这样,如果图形行走引擎到达有效载荷末端而没有找到匹配,其可 以从运行堆栈弹出节点从而回溯以匹配早前可能的匹配。
[0174] 在本发明的一个示例实施例中,在处理贪婪或领属节点N0502时,图形行走引擎 加载有效载荷的字节并针对元素对它们进行匹配直到其找到非匹配或其用完有效载荷。因 为字符类为r\n],其涵盖有效载荷中的所有值/字符/字母,所以图形行走引擎用完有效 载荷。然后,图形行走引擎将节点推送至包括被设置的复制位、有效载荷偏移、和指示当匹 配可变计数节点内指示的元素时所消耗的字节数量的计数(即,在这种情况下,该计数为 19)的运行堆栈。然后,图形行走引擎加载字符类节点N1504,但由于没有来自有效载荷的 字节以供消耗,其返回非匹配。
[0175] 然后,图形行走引擎从运行堆栈弹出可变计数节点并将该计数减少1。然后,图形 行走引擎将节点推送至包括被设置的复制位、有效载荷偏移、和指示所消耗的字节数量的 计数(18)的运行堆栈。然后,图形行走引擎加载字符类节点N1502。图形行走引擎试图消 耗有效载荷中的第19字节,其为'b',但这不与节点N1504的字符类[zZ]匹配。然后,图 形行走引擎再次弹出运行堆栈条目。重复此内容直到计数减少至节点N1504消耗的字节 为一个匹配的数量,其是当该计数为13时。当该计数为13时,可变计数节点有效地消耗 "yyyZbbbbbzyyy"。然后,节点N1504试图消耗第14字节,其为"Z",其是针对字符类[zZ] 的匹配。然后,图形行走引擎加载节点N2506。节点N2消耗有效载荷中的下5个"b"。然 后,图形行走引擎加载节点N3508,其是指示找到匹配的标记节点。处理标记节点N3508之 后,图形行走引擎弹出并丢弃复制位被设置为1的所有运行堆栈条目,并且在这种情况下, 运行堆栈中仅存在一个此类条目。因此,贪婪节点发现有效载荷中的最长匹配。设置/未 设置复制位是将引擎在运行时间期间推送的(标记)运行堆栈条目与也存在于运行堆栈中 的初始输入缓冲区条目分开,然而,这还可以通过其他方式来实现。关于图18,更加详细地 描述了处理可变计数贪婪节点。
[0176] 如果节点N0502是领属的,则图形行走引擎找出到下一个节点(节点N1504)的可 能的最长路径。针对领属节点,图形行走引擎产生于上述贪婪节点相同的结果,但执行以下 更优化的过程:如关于图19更加详细描述的,当到达有效载荷末端后不回溯。
[0177] 如果节点N0502为可变计数全匹配节点,则图形行走引擎找出到下一个节点(节 点N1504)的可能的所有可能的路径。图形行走引擎可以针对可变计数全匹配节点返回多 个匹配。关于图20,更加详细地描述了处理可变计数全匹配节点。
[0178] 图6A为框图600,展示了编译器604处理图样602的示例实施例。在本示例中,图 样602为"ACMEa*b{5, 10}c{5} [def] "。图样602包括可以分别被分成字符串节点(例如, "ACME")、可变计数节点(例如,"a*")、固定计数和可变计数节点(例如,可转换成"b{5} 13{0,5}"的"13{5,10}")、固定计数节点(例如,(3{5})以及字符类(例如,[(^])的图样段 620、622、624、626 和 628。
[0179] 编译器604包括字符串检测模块610、可变计数检测模块612、固定计数检测模块 614、固定计数和可变计数检测模块616、以及字符类检测模块618。每个模块610、612、614、 616和618接收图样602、或其中对应的图样段620、622、624、626、和628,并基于图样为图 形组装模块606组装的编译NFA图形640生成节点630、632、634、636a-b、638。
[0180] 在另一个实施例中,编译器604对图样602进行元素和元素类型而非单独模块检 查以针对每个元素和节点类型进行匹配。
[0181] 图6B为图6A的图样602产生的编译NFA图形640的图解601。编译NFA图形640 以针对字符串"ACME"进行匹配的字符串节点650开始。然后,图形640具有被配置成用 于针对元素"a"进行匹配无限次数的下一个可变计数节点652。可变计数节点可以或者是 懒惰的、贪婪的、领属的或者全的。基于图样的语法,该节点可以被设置为懒惰的、贪婪的、 领属的或全匹配类型。例如,如果元字符后面跟着第二元字符"?",如图样 "?? "或"{n,m} ?",则编译器可以创建匹配类型懒惰可变计数节点。如果元字符后面跟着 第二元字符" + ",如图样" 和"In,m} +",则编译器可以创建匹配类型领属 节点。例如,如果元字符后面跟着第二元字符"*",如图样"**"、"+*"、"?*"、和"{11,111}*", 则编译器可以创建匹配类型全可变计数节点。
[0182] 例如,考虑有效载荷"abbbbbbb"。针对"ab*"图样,生成贪婪匹配类型可变计数节 点。结果是节点消耗整个有效载荷,从而使得结果为"abbbbbbb"。
[0183] 类似地,针对"ab*+"图样,创建领属匹配类型可变计数节点。领属节点具有与贪 婪节点类似的特性,然后,被配置成用于当到达有效载荷末端后不进行回溯。同样,结果为 可变计数领属节点此处消耗整个有效载荷并且不进行回溯,从而使得结果为"abbbbbbb", 这刚好与贪婪节点相同。
[0184] 针对"ab* ? "图样,创建懒惰匹配类型可变计数节点。结果为,可变计数节点消耗 最短可能匹配,其为"a"。
[0185] 针对"ab**"图样,创建全匹配类型可变计数节点。结果为,找到全可能匹配,从而 使得找到 "a"、"ab"、"abb"、"abbb"、"abbbb"、"abbbbb"、"abbbbbb"、和 "abbbbbbb"。
[0186] 在其他实施例中,各种符号可以用于例如通过指定特殊字符为图样的前缀或后缀 来指示匹配类型。在其他实施例中,生成图形640的编译器的设置可以设置节点的匹配类 型。
[0187] 然后,图形640具有固定计数节点654a和可变计数节点654b,其基于逻辑上被分 成b{5}和"b{0,5}"的"b{5,10}"图样段。固定计数节点654a针对"b"进行匹配五次。可 变计数节点654b针对"b"在任何地方进行匹配从零到五次。然后,图形640具有在有效载 荷中针对"c"进行匹配五次的固定计数节点656。字符类节点658针对元素[def]进行匹 配,其为字符"d"、"e"、或"f"中任一项。
[0188] 该图形还可以针对作为可变计数节点或固定计数节点的一部分的字符类进行匹 配。例如,图样" [xyz] {〇, 5} "编译成针对字符类[xyz]进行匹配从零到五次的可变计数节 点。例如,"xyzzx"是与该图样匹配的有效载荷。
[0189] 图7为框图700,展示了对图样702进行编译的示例实施例。图样确定模块703 对图样702进行匹配项检查。匹配项包括元素和节点类型。如果图样确定模块703找到匹 配项,则其将该匹配项作为元素704和节点类型706输出至节点生成模块708。如果图样 确定模块703没有找到匹配项,则其指示图样结束,并且图样确定模块703可以消耗另一个 图样,或者如果没有更多图样,则完成编译。节点生成模块708生成包括元素704和节点类 型706的密集节点710,该元素可以是值/字符/字母、字符类、或字符串,该节点类型可以 是值/字符/字母、字符类、可变计数、固定计数、可变计数和固定计数、字符串、或分离节点 (用于交替)或用于宣布匹配的标记节点(被用作图形的最终节点)。
[0190] 图8为流程图800,展示了对图样进行编译的示例实施例。编译以对图样进行匹 配项检查而开始,匹配项包括元素和节点类型(802)。然后,该方法确定是否找到匹配项 (804)。如果找到了,则该方法生成指示节点类型和元素的节点(806)如果没找到,则该方 法结束(808)并可选地对另一个图样进行编译。
[0191] 图9为流程图900,展示了图形行走引擎对节点进行处理的示例实施例。图形行走 引擎从节点提取节点类型和元素(902)。如上所述,该元素可以是值/字符/字母、字符类 索引、或字符串值。然后,图形行走引擎确定节点是否需要继续与同一元素进行匹配(904)。 图形行走引擎可以例如通过使用索引或计数变量来跟踪其针对可变计数节点或固定计数 节点已经匹配的元素的数量。如果节点类型指示继续针对该元素进行匹配,则图形行走引 擎使有效载荷段与该元素匹配(906)。然后,图形行走引擎确定该有效载荷段是否该元素匹 配(910)。如果匹配,则确定该节点需要继续进行匹配(904)。如果节点类型不指示继续进 行匹配,则图形行走引擎针对该节点返回匹配或不匹配(908),并且可用于处理图形中的下 一个节点。
[0192] 如果该有效载荷段与该元素不匹配(910),然而,图形行走引擎返回不匹配 (912) 〇
[0193] 图10为框图1000,展示了图形行走引擎对NFA图形1002的节点1004a-d进行处 理的示例实施例。确定模块1006接收包括节点1004a-d的NFA图形1002。NFA图形1002 可以包括任意数量的节点l〇〇4a_d。进一步地,在一个实施例中,确定模块1006可以接收单 独节点1004a-d。确定模块1006将节点类型1008和元素1010输出至匹配模块1011。基 于节点类型1008,匹配模块1011针对元素1010对一个或多个有效载荷段1014进行匹配。 匹配模块1011可以接收基于节点类型1008的一个或多个附加段1014,例如,被配置成匹配 一个或多个有效载荷段的可变计数节点或固定计数节点。当完成处理后,匹配模块1011输 出匹配或不匹配1012。可选地,匹配模块1011可以请求确定模块1006处理NFA图形1002 的下一个节点。匹配模块1011可以进一步处理早前或稍后的有效载荷段以及NFA图形的 早前或稍后的节点。
[0194] 图11为流程图1100,展示了使本发明所使用的NFA图形行走的过程。在一个实施 例中,执行该过程的元素可以是与关于图2B中所示的框图250描述的元素。
[0195] 图形行走引擎252包括多个存储器,这些存储器存储用于保存步伐通过图形的其 他部分的路径的运行堆栈260和当有效载荷以仅部分匹配完成被处理时用于存储保存缓 冲区/堆栈264的保存缓冲区/堆栈264,从而使得当加载同一流的下一个有效载荷时,该 引擎可以从保存缓冲区将堆栈条目重新加载到运行堆栈内。在一个实施例中,运行堆栈260 或保存缓冲区264可以被保持为片上存储器中的循环缓冲区,并且其可以溢出至外部系统 存储器,但可以使用其他堆栈实现方式和存储器类型。并且,当将下一个指令馈送至引擎 以处理同一流的后续有效载荷时,主机可以从保存缓冲区将条目拷贝(移动)到运行堆栈 (输入缓冲区)内。
[0196] 运行堆栈260将堆栈条目推送至头指针并从头指针弹出堆栈条目。保存缓冲区/ 堆栈对其尾指针处的堆栈条目进行排队。因为保存缓冲区/堆栈264对其尾指针处的条目 进行排队(例如LILO),其被结构化为一个队列。与处理器耦合的主机为初始运行堆栈提供 至少一个填充的条目(例如,从图2的输入缓冲区258输入)。该主机还可以提供初始指令 (例如,来自指令队列254)。行走指令包含以下与堆栈相关的信息:(1)运行堆栈头指针; (2)保存堆栈尾指针;(3)运行堆栈条目的数量;以及(4)按照条目数量的运行堆栈和保存 堆栈大小。
[0197] 在本发明的一个示例实施例中,运行堆栈条目包括指示节点类型字段、复制字段、 逆向处理字段、有效载荷偏移字段、类型特定数据字段、和地址字段的字段。如果该节点类 型为"NOP"(例如,无操作(No-op)),则图形行走引擎丢弃运行堆栈条目并弹出有待处理的 下一个运行堆栈条目。如果该节点类型为提取(Fetch),则运行堆栈条目不包含节点信息, 并且类型特定数据字段无效。如果该类型为除了 "N0P"或Fetch以外的任何类型(例如, 固定字符、可变计数、分离节点、字符串节点、字符类、字符、或标记节点),则运行堆栈条目 本身包含类型特定数据字段中的节点信息。下表列出了可能的节点类型。
【主权项】
1. 一种行走表示图样的非确定有限自动机(NFA)图形的方法,该方法包括: 从该NFA图形的一个节点中提取一种节点类型、下一个节点地址、和一个元素;W及 通过使一个有效载荷与该元素进行匹配至少零次来将该有效载荷的一段与该元素进 行匹配,该次数基于该节点类型。
2. 如权利要求1所述的方法,其中,该节点类型是W下各项中的至少一项:可变计数、 固定计数、固定-可变计数、字符、不区分大小写的字符、字符类、区分大小写的字符串、不 区分大小写的字符串、标记的、分离的。
3. 如权利要求1所述的方法,进一步包括将一个条目推送至一个运行堆找,该条目指 示W下各项中的至少一项:该节点类型、该图形中的下一个节点的地址、一个有效载荷偏 移、一个计数值、一个复制位、一个逆向位。
4. 如权利要求3所述的方法,其中,将该条目推送至该运行堆找基于该节点类型。
5. 如权利要求4所述的方法,其中,如果该节点类型为可变计数、固定-可变计数、或分 离的,则执行将该条目推送至该运行堆找。
6. 如权利要求1所述的方法,进一步包括: 弹出一个运行堆找的一个顶条目; 加载所弹出的顶条目所指示的一个图形节点;W及 在所弹出的顶条目中所指示的一个有效载荷偏移下将该有效载荷的该段与该元素进 行匹配,在所加载的图形节点中指示该元素。
7. 如权利要求6所述的方法,其中,在将该有效载荷的该段与该元素进行匹配的失配 后执行将该运行堆找的该顶条目弹出。
8. 如权利要求1所述的方法,进一步包括: 弹出一个运行堆找的一个顶条目; 提取所弹出的顶条目中所存储的图形节点信息;W及 在所弹出的顶条目中所指示的一个有效载荷偏移下将该有效载荷的该段与该元素进 行匹配,在所提取的图形节点中指示该元素。
9. 如权利要求1所述的方法,其中,该字符串节点类型表示多个值的图样的一部分,每 个值为字节、字母、或字符中的至少一项。
10. 如权利要求1所述的方法,其中,将该有效载荷的该段与和该字符串节点类型相关 联的该元素进行匹配包括使该段内的至少两个值与被存储作为该节点中的该元素的字符 串的对应值进行匹配。
11. 如权利要求10所述的方法,进一步包括: 如果该段与该元素部分匹配,并且如果该有效载荷的长度比被存储作为该节点的该元 素的字符串的长度更短,则加载该有效载荷的同一流的下一个有效载荷并继续将该字符串 中的剩余值与该下一个有效载荷中的值进行匹配。
12. 如权利要求11所述的方法,进一步包括将一个部分匹配推送至一个当加载该有效 载荷的该同一流的该下一个有效载荷后有待加载的保存缓冲区。
13. 如权利要求12所述的方法,其中,将该部分匹配推送至该保存缓冲区包括将一个 正在被处理的当前运行堆找条目存储在该保存缓冲区内;并且进一步包括: 当加载该下一个有效载荷后,将该保存缓冲区内的所存储的至少一个条目拷贝至该运 行堆找。
14. 如权利要求1所述的方法,其中,将该有效载荷的该段与和该可变计数节点类型相 关联的该元素进行匹配包括与该元素进行匹配从该节点提取的一个计数值所指示的可变
当前第5页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1