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

文档序号:8395915阅读:来源:国知局
示例实施例,每个节点存储一个元素,其中,元素为或者单独的值/ 字符/字母、字符类ID(例如,字符类索引)、或者字符串。每个节点进一步存储其节点类 型和节点类型所要求的任何其他信息,例如可变计数节点存储针对每个元素进行匹配的最 大(并且可选地最小)次数和其是否为懒惰/贪婪/领属全匹配类型节点,固定计数节点 存储针对每个元素进行匹配的次数。
[0137] 图4A为现有技术系统所使用的NFA图形440的示例实施例。NFA图形440被配置 成用于对"[aA][bB]"图样进行匹配,其对包括"&13"、"&8"、113"、和18"的有效载荷进行 匹配。
[0138] 图形行走引擎首先处理节点N0402。如果有效载荷为"a",则图形行走引擎加载节 点N1404。然后,图形行走引擎对有效载荷的下一段进行处理。如果有效载荷为"b",则图 形行走引擎加载节点N3408,该节点是标记节点。如果有效载荷为"B",则图形行走引擎加 载节点N4410,该节点也是标记节点。两个标记节点指令图形行走引擎返回匹配。
[0139] 另一方面,如果当处理节点N0402时,图形行走引擎处理为"A"的有效载荷,则图 形行走引擎加载节点Node2406。然后,图形行走引擎对有效载荷的下一段进行处理。如果有 效载荷为"b",则图形行走引擎加载节点N5412,该节点是标记节点。如果有效载荷为"B", 则图形行走引擎加载节点N6414,该节点也是标记节点。两个标记节点指令图形行走引擎返 回匹配。
[0140]NFA图形440甚至可以用短图样如" [aA] [bB] "来增加复杂性。即使每个字符类仅 指定两个值/字符/字母,则添加至图样的每个附加字符类使图形中的节点数量翻倍。进 一步地,字符类可以具有所指示的任何数量的字符,字符越多,则甚至进一步增加图形的复 杂性越大。
[0141] 在一个实施例中,每个字符类可以存储在128位或256位图中。字符类中的每个 位表示其相应的ASCII值。例如,位图中的第12位表示"换行"字符。如果第12位为1,其 意味着字符类包括"换行"字符。如果第12位为0,则字符类不包括"换行"字符。以相同 方式,每个字符类可以存储多个ASCII值。例如,[~\n] (S卩,具有除了换行以外的所有字符 的字符类)将除了第12位以外的所有位标记为"1"。举另一个示例来将,字符类[a-z]包 括97 - 122的ASCII值。因此,字符类[a-z]的位图将具有被设置为"1"的位97 - 122和 被设置为"〇"的所有其他位。
[0142]当图形行走引擎对有效载荷段与字符类进行匹配时,其可以将有效载荷的ASCII 值用作字符类的索引。例如,当字符类为[a-z]时,假设图形行走引擎处理字母"r",该字 母具有为114的ASCII值。图形行走引擎可以访问字符类的第114位并且确定其是否被 设置为用于确定其是否与该字符类匹配。这可以用以下逻辑语句来表达:"if(Characte rClass[PayLoadASCIIValue]= =true),returnmatch;elsereturnnomatch'',其中, PayLoadASCIIValue为有效载荷的当前段的ASCII值,或者在这种情况下为114。
[0143] 给定图样还可以包括多个字符类。例如,图样" [a-z] [0-9] [~\n] [a-z] "具有四个 字符类,但仅三个唯一字符类(即,[a-z]、[0-9]、和[~\n]),因为[a-z]为重复字符类。所 以,编译器首先确定该或这些图样中存在的唯一字符类的数量。然后,编译器为每个字符类 分配唯一号码(例如,索引或标识符)。例如,编译器为[a-z]分配为1的索引、为[0-9]分 配为2的索弓丨、以及为[~\n]分配为3的索引。即使其出现两次,字符类[a-z]作为位图被 存储一次,并且可通过其索引" 1"来访问。
[0144] 编译器存储字符类作为二维矩阵,可以用作为输入的两个索引来对其进行访问。 第一索引标识字符类,并且第二索引标识那个字符类内的值。
[0145] 在NFA图形的上下文中,节点类型="字符类"的每个节点的"元素"字段包含字 符类编号。此外,"可变计数"或"固定计数"类型的节点的"元素"字段还可以是字符类的 索引,从而使得图形行走引擎针对该字符类分别进行匹配可变次数或固定次数。
[0146] 此外,编译器确定所有图样的字符类。例如,编译器可以接收图样一 "[a-z] [0-9] "、图样二" [a-z] [~\n] "以及图样三" [0-9] [A-F] "。虽然图样一、二和三共有六个字 符类,但其仅具有四个唯一字符类。因此,编译器给[a-z]分配索引1、给[0-9]分配索引 2、给[~\n]分配索引3和给[A-F]分配索引4。图形的任何节点可以通过访问字符类的位 图来对字符类进行访问,而不管其所出现在其中的一个或多个图样。这减少了存储所有字 符类所需的存储器。
[0147] 在行走过程中,图形行走引擎将节点中所存储的指示(节点类型字符类的)字符 类的元素用作第一索引并且将有效载荷段(例如,有效载荷字节)用作具体字符类位图的 第二索引。这加载了二维矩阵的具体位,其中,在两个索引的位置处加载的位指示有效载荷 段(例如,有效载荷字节)是否在具体字符类内。
[0148] 图4B为图解450,展示了带有本发明所使用的密集节点和相应字符类矩阵472 (例 如,位图表)的NFA图形470的示例实施例。NFA图形470被配置成用于对图样" [aA] [bB] " 进行匹配,其与包括113"、"&8"、113"、和18"的有效载荷匹配。在本实施例中,即4图形 470利用图形的节点内的字符类来减少图形中节点的数量并降低图形复杂性。编译器确定 该图样是否包括两个唯一字符类([aA]和[bB])。编译器为字符类[aA]分配索引0并为字 符类[bB]分配索引1,并且两者作为位图存储在二维矩阵中。
[0149] 字符类矩阵472示出了字符类[aA]和[bB]在其相应索引处的展示。字符类0(即, [aA])示出了用于设置"A"和"a"的条目,并且字符类1(即,[bB])示出了用于设置"b"和 "B"的条目。使用相同字符类的其他图形可以利用这些字符类,并且该矩阵可以进一步包括 与其他图形不同的字符类。关于图21,示出了字符类矩阵的另一个示例。
[0150] 图22为表2200,展示了字符类匹配节点的格式。表2200包括节点类型2202、匹 配类型2204、元素2206、下一个节点地址2208、以及计数值2210。对于字符类匹配节点而 言,节点类型2202指示字符类。匹配类型2204指示其不适用(例如,空值)。元素2206指 示用于访问字符类矩阵中的字符类的字符类索引。下一个节点地址2208包括图形中的下 一个节点的地址。计数值2210对于字符类匹配节点而言是不适用的。
[0151] 再次参照图4B,当读取节点N0452时,图形行走引擎确定节点N0452是否针对所指 定的字符类中的任何值/字符/字母匹配,在这种情况下,其为"a"或"A",并且加载有效 载荷的第一段。图形行走引擎加载节点的节点类型和节点的元素,节点类型指示其为字符 类,节点的元素指示字符类具有索引0。然后,图形行走引擎将有效载荷的当前段用作位图 的索引(例如,加载Matrix[0] [PayloadSegmentValue])以确定该有效载荷段是否与字符 类匹配。如果该有效载荷的第一段为所指定的字符类中的任何值/字符/字母,如从这些 索引的位置处的位图加载的值所指示的,图形行走引擎加载由节点N0452中所存储的"下 一个节点地址"所指向的节点N1454。
[0152] 当读取节点N1454时,图形行走引擎确定节点N1454是否针对所指定的字符类中 的任何值/字符/字母匹配,在这种情况下,其为"b"或"B",并且加载有效载荷的下一段。 图形行走引擎加载节点的节点类型和节点的元素,节点类型指示其为字符类,节点的元素 指示字符类具有索引1。然后,图形行走引擎将有效载荷的当前段用作位图的索引(例如, 加载Matrix[l][PayloadSegmentValue])以确定该有效载荷段是否与字符类匹配。如果该 有效载荷的当前段为所指定的字符类中的任何值/字符/字母,如从这些索引的位置处的 位图加载的值所指示的,图形行走引擎加载由节点N1454(即,节点N2456)中所存储的"下 一个节点地址"所指向的节点。当加载节点N2456时,基于节点N2456的"节点类型",图形 行走引擎确定其是否为标记节点。然后,图形行走引擎可以返回匹配。
[0153]NFA图形470具有降低的复杂性和减少的大小。进一步地,每个字符类中的值/字 符/字母的数量不增加或减少NFA图形470的大小。此外,增加图形中不同字符类的数量 会线性地增加NFA图形470的大小,而不是增加字符类中的值/字符/字母的数量的倍数。
[0154] 除了字符类以外,根据本发明的示例实施例,另一种节点类型为字符串节点。字符 串节点为一个针对连续值/字母/字符进行匹配的节点。
[0155] 图23为表2300,展示了字符串匹配节点的格式。字符串节点表2330包括节点类 型2302、匹配类型2304、元素2306、下一个节点地址2308、以及计数值2310。节点类型2302 指示"字符串匹配"。匹配类型2304不适用(例如,空值)。元素2306指示字符串数据2340 的地址。下一个节点地址2308包括图形中的下一个节点的地址。计数值2310指示字符串 的长度。
[0156] 字符串节点2330的元素2306的字符串数据的地址所指示的字符串数据2340包 括节点类型2312、匹配类型2314、元素2316、下一个节点地址2318、以及计数值2320。节点 类型2312指示其为"字符串数据"。元素2316指示字符串中的字符。匹配类型2314、下一 个节点地址2318、以及计数2320全都不适用。
[0157] 字符串节点的相似变体为不区分大小写的字符串节点。在一个示例实施例中,字 符串前面的修饰符可以指示图样中的不区分大小写的字符串节点,如"U}abc",其将与以 下有效载荷匹配:"&1^"、"&13(:"、" &8,、"&8(:"、11^"、113(:"、11^"、和18(:"。本领域的普 通技术人员可以认识到修饰符"U} "可以是任何所指示的符号或系列符号。
[0158] 为了处理不区分大小写的字符串节点(以及不区分大小写的字符节点),在进行 比较之前,对字母的位之一进行遮罩。例如,大写字母(A-Z)的ASCII值在65-90之间和在 97-122之间。'A'(例如,十进制的97)的二进制表示为1100001,而'a'(例如,十进制的 65)的二进制表示为1000001。因此,在两个二进制值之间,仅一个位不同(例如,位[5],如 果从自〇开始的最低有效位进行标引)。对于每对相应的不区分大小写的字母字符而言,在 比较之前,遮罩元素和有效载荷段内的位[5](其中,每个的最低有效位为零)。该比较返回 匹配,因为除了仅表示大写变化的位[5]以外,这些值是相同的。本领域的普通技术人员可 以认识到,除了位[5]以外的其他一个或多个位可以用作例如其他字符方案中的遮罩位。
[0159] 图4C为使用五个单独节点的图样"USPTO"的常规图形475的示例实施例,每个节 点进行值/字符/字母检查。因此,常规图形475具有针对'U'匹配的第一节点N01476、针 对'S'匹配的第二节点N01477、针对'P'匹配的第三节点N02478、针对'T'匹配的第三节 点N3489、针对'0'匹配的第三节点N4480、以及指示匹配的标记节点N5481。
[0160] 图4D展示了使用字符串节点的图形490的示例实施例。节点N0492为包括指向 字符串"USPT0"的指针的字符串节点。节点N0492指令引擎针对整个字符串"USPT0"进行 匹配而不是按照图4C针对每个单独的字母进行匹配并且然后加载下一个节点。
[0161] 图24为表2400,展示了固定计数匹配节点的格式。对于固定计数节点而言,节点 类型2402指示固定计数匹配2402。匹配类型字段2404对固定计数节点而言不适用。对于 固定计数匹配节点而言,元素2406可以指示进行匹配所针对的字符,或者其可以指示进行 匹配所针对的字符类索引。如果匹配成功,则下一个节点地址2408包含有待处理的下一个 节点的地址。计数值2410包含进行元素匹配的固定次数。
[0162] 图25为表2500,展示了可变计数匹配节点的格式。该节点包括指示可变计数匹配 的节点类型2502。该节点进一步包括指示可变计数节点是否为懒惰、贪婪、领属、或全匹配 节点的匹配类型2504。元素2506可以包含进行匹配所针对的字符,或者其可以指示进行匹 配所针对的字符类索引。如果匹配成功,则下一个节点地址2508包括有待处理的下一个节 点的地址。计数值2510包括进行元素匹配的最大次数,其包括用于表示无限的特殊符号。
[0163] 可选地,计数值2510还可以包含用于存储元素必须匹配的最大次数的第二计数 值(如果没有提供第二计数值,则默认为零)。这可以用于表示范围匹配。此类图样还可以 由进行元素匹配最小次数的固定计数节点然后进行匹配剩余次数的可变计数节点的组合 来表示。
[0164] 图5为图解500,展示了NFA图形510的示例实施例,该图形展示了本发明的示例 实施例。NFA图形510被配置成用于检测图"r\n]*[zZ]b{5}",其中,[~\n]为指示除了换 行字符以外的任何值/字符/字母的字符,并且["zZ"]为表示或者"z"或者"Z"的字符 类。
[0165] 节点N0502为可变计数节点。可变计数节点可以是或者懒惰、贪婪、领属(其是贪 婪节点的优化形式)或全匹配类型节点。当从图样编译图形时,设置节点类型。用户可以 在图样中指示可变计数节点应被编译为哪种匹配节点类型。可替代地,取决于所希望的图 形行为,用户还可以将编译器设置为默认到四种模式中的任何模式。假设图形行走引擎处 理有效载荷 "yyyZbbbbbzyyyZbbbbb"。
[0166] 如果节点N0502是懒惰的,则图形行走引擎找出到下一个节点(节点N1504)的 可能的最短路径。即,图形行走引擎在节点N1504而不是在节点N0502处理有效载荷中的 "z"或"Z"的第一实例,即使节点N0502元素包括找出除换行以外的任何有效载荷段,其包 括"z"或"Z"。然而,如果节点N0502以此类方式处理有效载荷,则其将不利用通过图形的 最短路径。
[0167] 当按照可变计数懒惰节点处理节点N0时,图形行走引擎将具有零有效载荷偏移 的节点N0的运行堆栈条目推送至运行堆栈。当推送运行堆栈条目后,图形行走引擎提取 下一个节点N1504。图形行走引擎提取与零有效载荷偏移相对应的下一个有效载荷字节 ('y'),并试图使其与节点N1504的元素字符类[zZ]匹配。由于该字节与该字符类不匹 配,图形行走引擎弹出该运行堆栈条目。然后,图形行走引擎对带有包含节点N0502的所弹 出的堆栈条目的同一字节进行处理。字节'y'与字符类[~\n]匹配,所以其实现匹配。然 后,图形引擎使有效载荷偏移增量1并推送包含节点N0502的运行堆栈条目。
[0168] 当推送运行堆栈条目后,图形行走引擎提取下一个节点N1504。图形行走引擎提 取与1有效载荷偏移相对应的下一个有效载荷字节,'y',并试图使其与节点N1504的元素 字符类[zZ]匹配。由于该字节与该字符类不匹配,图形行走引擎弹出该运行堆栈条目。然 后,图形行走引擎对带有包含节点N0502的所弹出的堆栈条目的同一字节进行处理。字节 'y'与字符类[~\n]匹配,所以其实现匹配。图形行走引擎使有效载荷偏移增量1并推送包 含节点N0502的运行堆栈条目。
[0169] 当推送运行堆栈条目后,图形行走引擎提取下一个节点N1504。图形行走引擎提 取与2有效载荷偏移相对应的下一个有效载荷字节('y'),并试图使其与节点N1504的元 素字符类[zZ]匹配。由于该字节与该字符类不匹配,图形行走引擎弹出该运行堆栈条目。 然后,图形行走引擎对带有包含节点N0502的所弹出的堆栈条目的同一字节进行处理。字 节'y'与字符类[~\n]匹配,所以其实现匹配。图形行走引擎使有效载荷偏移增量1并推 送包含节点N0502的运行堆栈条目。
[0170] 当推送运行堆栈条目后,图形行走引擎提取下一个节点N1504。图形行走引擎提取 与3有效载荷偏移相对应的下一个有效载荷字节('Z'),并试图使其与节点N1504的元素 字符类[zZ]匹配。由于该字节与该字符类匹配,图形行走引擎提取下一个节点N2506。
[0171] 然后,图形行走引擎加载固定计数节点N2,该节点针对'b'进行匹配五次。图形 行走引擎加载有效载荷的下五个段,所有这些段
当前第4页1 2 3 4 5 6 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1