antlr之Hello World

最近要写一个SQL的Parser,因此需要一个Parser代码生成器,以前用过Lex 和 Yacc,但是缺点是生成的代码可读性非常差,而且生成的都是C的代码,重用性不好,所以这次准备用Antlr来实现.

* 首先下载antlr2.75,安装运行
* 然后安装JRE1.42
* 然后添加classpath c:\antlr\275\bin
* 编写一个简单的test.g

class P extends Parser;

startRule
: n:NAME
{printf("name:%s ", n->toString().c_str());}
;

class L extends Lexer;

// one-or-more letters followed by a newline
NAME: ( 'a'..'z'|'A'..'Z' )+ NEWLINE
;

NEWLINE
: '\r' '\n' // DOS
| '\n' // UNIX
;

* 运行命令java antlr.Tool test.g 将生成parser的java代码
* 要生成cpp的代码只要在test.g文件中添加一个选项就可以了
options {
language="Cpp";
}
* 注意,antlr的库是用VC7编译的,最好使用VS2003来编译生成的cpp文件,编译时需要添加antlr的头文件的include路径,以及Lib路径.
* 测试TestAntlr.cpp代码示意如下

  1. #include "stdafx.h"
  2.  
  3. #include <iostream>
  4. #include <sstream>
  5. #include "L.hpp"
  6. #include "P.hpp"
  7.  
  8. int main(int argc, char* argv[])
  9. {
  10. ANTLR_USING_NAMESPACE(std)
  11. ANTLR_USING_NAMESPACE(antlr)
  12.  
  13. try
  14. {
  15. L lexer(cin);
  16.  
  17. for(;;)
  18. {
  19. RefToken t = lexer.nextToken();
  20.  
  21. if ( t->getType() == Token::EOF_TYPE )
  22. break;
  23.  
  24. cout << "Token: " << t->toString() << endl;
  25. }
  26. cout << "done lexing..." << endl;
  27. }
  28. catch( ANTLRException& e )
  29. {
  30. cerr << "exception: " << e.getMessage() << endl;
  31. return -1;
  32. }
  33. catch( exception& e )
  34. {
  35. cerr << "exception: " << e.what() << endl;
  36. return -1;
  37. }
  38.  
  39. return 0;
  40. }