序言
有的时候,我还真是怀疑过上本科时候学的那些原理课究竟是不是在浪费时间。比方学完操作系统原理之后我们并不能自己动手实现一个操作系统;学完数据库原理我们也不能弄出个像样的DBMS出来;相同,学完编译原理之后我们好像就仅仅能看着一大堆符号,表和下推自己主动机发呆,然后带着极其虔诚的心向从事编译器实现工作前辈致敬,先前些许对某些编译器小Bug不满的心情从此不翼而飞。
早在数年前我做一个有关DBMS的模拟试验的时候,当中就有一部分要求对SQL语言的WHERE语句进行编译,提取出实用的形式,并保证运算符(AND,OR和括号)各自的优先级。当时我全然是手工用编译原理中讲到的知识作了一个小编译器,历时数周,筋疲力尽。而我近期的一个项目要求将一个自己定义的查询语言(简化的改动版SQL)进行编译并以查询包的形式发送给传感器网络。这时我学乖了,不再什么都从轮子造起了 J,開始的时候本来想用YACC/LEX作为底层编译器,但由于整个应用程序是纯Java的,基于可移植性考虑,也由于不想和下面推自己主动机为原理的YACC/LEX生成的一大堆整数表打交道,我选择了还有一个开源的LL(K)语法/词法分析器—ANTLR。