正则学习杂感,附几枚链接
最近在学习编译原理,尤其是正则表达式的实现这一节。从网上搜索到有用的链接,张贴在这里。一个感受是,数学知识是非常有用的,尤其是创造性的编程。如果数学知识足够,完全可以写出更加高效的算法;如果数学知识不够,最多只是重复别人已经写好的算法而已。因此在初步学习时,可以不必另造车轮,老老实实地学习已经很成熟的算法,才是正途。
至于正则表达式的实现,其实也只是先有数学思想,然后将其使用编程语言实现而已。准备步骤是先归纳语法树,自顶至下,逐级细分;而实现步骤是从现有的正则表达式自叶至顶,先将正则式转换为NFA图,再优化,转为DFA,这时才可与目标字串进行比较。
在看紫龙书时,感觉到其中从思路到算法,从伪代码到实际代码之间,其转换需要太多的细节来补充。而这些知识,不单来自于对具体语言语法的掌握,还需要合适的数据支持,才能化繁为简,事半功倍。顺便读了一些C++ STL的内容,觉得这些标准库真是相当有用,在构建正则表达式时这些库正好可以物尽其用。STL的作者善莫大焉。
从理论上说,即使没有STL支持的纯C语言,对于实现正则表达式也是没有任何问题的,只不过是自己捎带着再写一遍自己需要的数据结构而已。别说C,就是宏汇编,也可以实现的。如果感兴趣,可以自行到Aogo的www.aogosoft.com上自行搜索他的实现。归结到一句话:思路有了,语言的实现只是翻译。我等初学者是无力想出更高级的实现的,只是在这种翻译过程中,作为一种深化理解和课后练习罢。言归正传,下面是我要推荐的几则链接。
1. 《正则表达式识别》 http://blog.csdn.net/slavik/archive/2006…40386.aspx
有图有真相。本文的配图还是挺丰富的。思路也清晰。极具指导意义。
可惜没有源码。该博客的其它相关文章,也值得阅读。
2. 正则表达式 TO NFA表格
http://hi.baidu.com/rabbit5455/blog/item…1aac8.html
这篇文章主要是提供了源码,源码中附注释。也不错。
3. 《Write Your Own Regular Expression Parser》 http://www.codeguru.com/cpp/cpp/cpp_mfc/….php/c4093
本文是英文文章,有图示,有源码,很不错。我正在边阅读,边学习,边翻译,一边自行实现。建议直接阅读英文资料,不必等我的翻译。本文的代码只提供了*,|,以及连接操作的实现。不过也对其它操作的实现给出了指导。我已经在源代码基础上添加了问号和加号的支持。