ANTLR(ANother Tool for Language Recognition)现在风头正盛,很多项目都用它来做语法解释器,Hibernate也在3.0的时候换上它来解释HQL,使HQL的语法获得了加强。
因为Antlr是EBNF语法解释系的代表,而自己总是心思思想搞一下DSL(领域语言),所以就借Hibernate来学习了一把Antlr。 Antlr最好的介绍文章是那篇A Gentle Introduction to ANTLR Syntax,在《程序员》2004年3月有中文的版本。
不过,那个计算器的例子太简单了,了解完基本原理后,还是要看看Hibernate的实战。
另外,SlickEdit 支持Antrl的语法,是一定要用的编辑器,在 ttdown.com上有破解。
一,Antlr引擎的工作过程大概是这样的:
1.定义Lexer类,在类中定义各种Token如 From , Where,=,<>.......
Lexer负责把读入的普通文本识别成Token串。
2.定义Parser类,在类中使用BNF语法,递归定义各种句子,如whereStatement、FromStatement、Select Statement。
Pattern负责把读入的Token串匹配成句子,翻译出AST(抽象语法树)
有些简单的应用,也可以在本层现炒现卖,完成所有动作。
3.定义TreeParser类,根据Parser类分析出来的AST(抽象语法树)进行动作。
二,开发人员的实际步骤
1.按照Antlr的简单语法定义前面讲的3个类,文件的后缀名为g
2.使用java antlr.Tool xxx.g 命令 ,把grammar文件编译成java文件
3.编写应用程序,如:
import antlr.*;
import antlr.collections.*;
public class Main {
public static void main(String[] args) throws Exception {
ExprLexer lexer = new ExprLexer(System.in);
ExprParser parser = new ExprParser(lexer);
parser.expr();
AST ast = parser.getAST();
ExprTreeParser treeParser = new ExprTreeParser();
int x = treeParser.expr(ast);
}
}
(待续)