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代码示意如下
#include "stdafx.h" #include <iostream> #include <sstream> #include "L.hpp" #include "P.hpp" int main(int argc, char* argv[]) { ANTLR_USING_NAMESPACE(std) ANTLR_USING_NAMESPACE(antlr) try { L lexer(cin); for(;;) { RefToken t = lexer.nextToken(); if ( t->getType() == Token::EOF_TYPE ) break; cout << "Token: " << t->toString() << endl; } cout << "done lexing..." << endl; } catch( ANTLRException& e ) { cerr << "exception: " << e.getMessage() << endl; return -1; } catch( exception& e ) { cerr << "exception: " << e.what() << endl; return -1; } return 0; }