上两篇用分析JSON的例子讲完了词法分析与语法分析的整个过程,本篇再谈谈自己的一些认识。
词法分析与语法分析的理论基础都是自动机原理。或许会有人认为理论比较难学难用,其实我们也不必拘泥于它的理论,我们只要知道在一个大的循环里,我们要使用大量的if语句来进行判断,根据要分析的对象的边界条件来产生相应的对象也就可以了。对词法或语法的解析,最难的地方是要怎么才能知道这样的词法或语法是行得通的,而需要证明这一点,我们要画出DFA图或者是NFA图,一旦实现了这些图,编码的事情也就是纯机械运动了而已。
在多年的开发中,常常能听到编译原理无用论这样的观点。不过说实在的,在web(.net)开发中,我们确实是很少需要自己去解析些什么东东,因为.net本身就已经给我们实现了足够多的并且测试良好的解析工具了。但是如果我们想自己去把握最底层,自行处理整个WEB请求的所有流程的话,我们真的是很有必要去实现一些类似于编译器的东西,而且也很有必要去解析一些东西。
像目前还比较受关注的MVC的开发方式,网上流行的各大MVC框架都有它们自己定义的模板语法,而要实现这样一类的模板语法就需要用到编译原理的知识。对于C#程序员来说,类C#语法的模板语法是需要学习时间最少的,但当时我却没有能找到比较合适的,所以我就自己去实现了一个这样的模板语法的解析算法。刚开始做这件事情的时候,我也走过了很多的弯路,一开始就像课本说的那样去实现一个抽象语法树,花了我相当多的时间,而且自己实现的那棵树的结构也不是十分的合理,很不容易扩展,搞到最后差点把自己都搞迷糊了。随着不断地总结和参考大量的现有编译器的代码实现,渐渐地我找到了这种按对象去构建的方式,它的优点是算法比较简洁,实现起来也相对容易,而且能很方便地扩展。
再说一些乱七八糟的东西吧,反正说到这里已经没什么主题了。
我们日常的开发中重构是很重要的,而开发环境给我们的重构工具虽然也是十分的强大,但并不能按我们现在的项目的结织形式来进行完全的重构。所以,如果我们能根据自己的项目的结织形式和变化的特点来实现自定义的重构工具,这样的话,我们就能很好的应对变化,而不至于被动了。
一直在找分析SQL语句的解析器,没有找到开源的,或许有一天我会努力去实现一个这样的工具,如果真到那么一天,那我们以后的项目开发的最主要的任务就是写存储过程了,哈。