Regex GNU-grep与复合模式

Regex GNU-grep与复合模式,regex,parsing,grep,pattern-matching,Regex,Parsing,Grep,Pattern Matching,我已经阅读了,也了解了的实现,但我真正想知道的是grep如何处理复合模式,例如pat1 | pat2甚至[ABC] grep正在构建解析树吗?或者检查复合模式,就好像它是一个简单模式列表一样 到目前为止,我还没有找到任何合理的网站来解释这一点 请快速解释并提供参考。除了阅读注释中建议的代码外,最好从正则表达式匹配开始。Russ描述了构造DFA(确定性有限自动机)的算法,提到grep和awk都使用该算法的变体 这些实用程序的Gnu版本使用类似的方式构造一个函数,然后按照Russ的建议,缓慢地构造相

我已经阅读了,也了解了的实现,但我真正想知道的是grep如何处理复合模式,例如
pat1 | pat2
甚至
[ABC]

grep正在构建解析树吗?或者检查复合模式,就好像它是一个简单模式列表一样

到目前为止,我还没有找到任何合理的网站来解释这一点


请快速解释并提供参考。

除了阅读注释中建议的代码外,最好从正则表达式匹配开始。Russ描述了构造DFA(确定性有限自动机)的算法,提到
grep
awk
都使用该算法的变体

这些实用程序的Gnu版本使用类似的方式构造一个函数,然后按照Russ的建议,缓慢地构造相应的函数,以避免NFA->DFA算法中潜在的指数爆炸。算法的延迟执行不需要对该算法进行任何更改;它只是按需执行所需的计算,保留计算功率集的缓存。如果缓存大小超过某个限制,则会删除缓存项以为新的缓存项腾出空间

gnugrep还包括许多优化,旨在使它在使用公共模式时工作得更快,这些优化使代码变得相当复杂。但是,如果您想开始读取源代码,可以从Gnulib for NFA->DFA转换算法中的函数(function
dfaexec_main
,它可以在DFA中移动并根据需要计算新状态),以及文件中的NFA构造(function
re_compile\u internal
)开始


既然在一篇评论中提到了它,我应该澄清一下,OP所称的“复合模式”实际上只是在其一种伪装中使用交替运算符(包括可选运算符),可以写成
(…|)
。和字符类,它们只是交替的紧凑表示,正如Russ在链接文章中指出的。)


“复合模式”还有另一种可能的含义,因为grep允许通过多次使用
-e
命令行参数,或者通过使用
-f
选项从文件中读取模式(每行一个),来指定多个模式。Grep然后对所有模式同时执行搜索,这可以看作是一个复合搜索。然而,这与简单的交替并没有什么不同;在内部,grep只是将所有选项合并到一个以交替运算符为标点的长正则表达式中,然后再将其编译成单个NFA。

除了阅读注释中建议的代码外,最好从正则表达式匹配开始。Russ描述了构造DFA(确定性有限自动机)的算法,提到
grep
awk
都使用该算法的变体

这些实用程序的Gnu版本使用类似的方式构造一个函数,然后按照Russ的建议,缓慢地构造相应的函数,以避免NFA->DFA算法中潜在的指数爆炸。算法的延迟执行不需要对该算法进行任何更改;它只是按需执行所需的计算,保留计算功率集的缓存。如果缓存大小超过某个限制,则会删除缓存项以为新的缓存项腾出空间

gnugrep还包括许多优化,旨在使它在使用公共模式时工作得更快,这些优化使代码变得相当复杂。但是,如果您想开始读取源代码,可以从Gnulib for NFA->DFA转换算法中的函数(function
dfaexec_main
,它可以在DFA中移动并根据需要计算新状态),以及文件中的NFA构造(function
re_compile\u internal
)开始


既然在一篇评论中提到了它,我应该澄清一下,OP所称的“复合模式”实际上只是在其一种伪装中使用交替运算符(包括可选运算符),可以写成
(…|)
。和字符类,它们只是交替的紧凑表示,正如Russ在链接文章中指出的。)


“复合模式”还有另一种可能的含义,因为grep允许通过多次使用
-e
命令行参数,或者通过使用
-f
选项从文件中读取模式(每行一个),来指定多个模式。Grep然后对所有模式同时执行搜索,这可以看作是一个复合搜索。然而,这与简单的交替并没有什么不同;在内部,grep只是将所有选项合并到一个以交替运算符为标点的长正则表达式中,然后再将其编译成一个NFA。

参考资料如下:但没有快速解释;)你说的“解析树”是什么意思?@rici我指的是为Aho-Corasick算法构建的trie。我知道这不是一个“死板”的定义,但我缺少一个更好的词。@vaultalliner:That's a trie:),可以肯定,这是一种树,但与解析几乎没有关系。如果你的意思是“grep正在构造一个有限自动机吗?”,那么根据我的答案和相关文章,答案是肯定的。参考文献如下:不过没有快速的解释;)你说的“解析树”是什么意思?@rici我指的是为Aho-Corasick算法构建的trie。我知道这不是一个“死板”的定义,但我缺少一个更好的词。@vaultalliner:That's a trie:),可以肯定,这是一种树,但与解析几乎没有关系。如果你的意思是“grep正在构造一个有限自动机吗?”,那么根据我的答案和链接的