学习Lex&Yacc做语法分析也有两个月了,最近准备把自己辛苦攒写的代码移植到Javacc上。所以准备尽量每天都腾出点儿时间,把之前学的知识进行整理和巩固。同样也利于以后与别人分享。
最后选择Javacc做语法分析而放弃使用Yacc,是基于以下几点考虑的:
1、Yacc只支持LL(1)算法,而Javac支持LL(k)算法。
2、Yacc基于C编写,且它自动生成的.c文件可读性很差,当程序达到一定上千行代码以后,要查找里面错误很麻烦,无法用gdb调试程序准确定位。
3、Yacc的内存分配依赖于C,在实际过程中导致的内存段错误很难跟踪。
4、虽然C的效率更高,但Java更稳定,且移植性更高,支持类库很多,在对数据库操作和XML等操作的情况下,Java显得更容易快速开发。(在我的解析程序中,需要让解析程序读取配置文件和写数据库操作)
5、个人原因,目前当然自己对Java比C更熟悉。
综上所述,我最后将选择Javacc做语法解析,去解析SQL,将SQL中的元素提取出来做数据仓库中的ETL自动MAPPING。
那么在《Lex&Yacc》的日志中,我将记录下学习flex&Yacc的从入门到熟悉的一个过程。虽然该过程是事后总结,但我还是希望自己能够使用例子进行一步一步的讲解,能对后学者有一点点的帮助。
(注:flex是lex的一个分支版本,Flex - Fast LEXical analyzer generator.(GNU version of lex))
日志大致分为以下部分:(有不合理的地方会临时调整)
1、环境准备与参考资料
2、第一个flex的例子
3、第一个yacc的例子
4、第一个flex&yacc结合的例子
5、一个简单的计算器
6、冲突管理
7、一个简单的SQL解析器
8、提取SQL中的元素及Yacc的内存分配
9、解析程序如何与C++结合
10、解析程序如何与Java结合
最后选择Javacc做语法分析而放弃使用Yacc,是基于以下几点考虑的:
1、Yacc只支持LL(1)算法,而Javac支持LL(k)算法。
2、Yacc基于C编写,且它自动生成的.c文件可读性很差,当程序达到一定上千行代码以后,要查找里面错误很麻烦,无法用gdb调试程序准确定位。
3、Yacc的内存分配依赖于C,在实际过程中导致的内存段错误很难跟踪。
4、虽然C的效率更高,但Java更稳定,且移植性更高,支持类库很多,在对数据库操作和XML等操作的情况下,Java显得更容易快速开发。(在我的解析程序中,需要让解析程序读取配置文件和写数据库操作)
5、个人原因,目前当然自己对Java比C更熟悉。
综上所述,我最后将选择Javacc做语法解析,去解析SQL,将SQL中的元素提取出来做数据仓库中的ETL自动MAPPING。
那么在《Lex&Yacc》的日志中,我将记录下学习flex&Yacc的从入门到熟悉的一个过程。虽然该过程是事后总结,但我还是希望自己能够使用例子进行一步一步的讲解,能对后学者有一点点的帮助。
(注:flex是lex的一个分支版本,Flex - Fast LEXical analyzer generator.(GNU version of lex))
日志大致分为以下部分:(有不合理的地方会临时调整)
1、环境准备与参考资料
2、第一个flex的例子
3、第一个yacc的例子
4、第一个flex&yacc结合的例子
5、一个简单的计算器
6、冲突管理
7、一个简单的SQL解析器
8、提取SQL中的元素及Yacc的内存分配
9、解析程序如何与C++结合
10、解析程序如何与Java结合