最近在研究SQL解析的问题。用到了antlr. antlr这个工具可能知道的人不多。在这里也不多介绍。因为我不是为了宣传antlr的枪手。
Distributor ID: SUSE LINUX
Description: openSUSE 10.3 (i586)
Release: 10.3
Codename: n/a
IDE :Eclipse IDE for C/C++ Developers Build id: 20090920-1017
安装Antlr
首先下载antlr-2.7.7.tar.gz安装包。在CSDN的下载里面可以找到。因为是我上传的。+_-!!!
解压压缩包。
bndxgae@linux-78tc:~/antlr> su
Password:
linux-78tc:/home/bndxgae/antlr # tar -zxvf antlr-2.7.7.tar.gz
生成Make文件
linux-78tc:/home/bndxgae/antlr/antlr-2.7.7 # ./configure --prefix=/usr/local
执行安装
linux-78tc:/home/bndxgae/antlr/antlr-2.7.7 # make install
安装成功。
安装程序会把编译antlr程序需要的头文件和静态连接库放在
/usr/local/include/antlr
/usr/local/lib
下面。
安装Eclipse
首先下载Eclipse IDE for C/C++ Developers安装包。
解压到你想放置的目录下,执行
bndxgae@linux-78tc:~/eclipse> ./eclipse &
eclipse 启动后找一个目录设置为你的工作目录
我的工作目录为
/home/bndxgae/workspace
关闭欢迎界面后在Project Explorer视图内右键
新建一个空的C++工程,工程名为CppAntlrTest。
在工程名上右键新建一个cpp.g文件。
双击cpp.g这个文件将下面的内容添加到cpp.g文件中
header{
#include
#include
#include
}
options
{
language="Cpp";
}
class ExprParser extends Parser;
{
}
// rules
expr returns [double value=0]
{double x;}
:
value=term
(
PLUS x=term
|
MINUS x=term
)*
;
exception
catch [ANTLR_USE_NAMESPACE(antlr)ANTLRException& ex] {
// catch all exceptions and report it
reportError(ex.toString());
}
term returns [double value=0]
{double x;}
:
value=factor
(
STAR x=factor
|
SLASH x=factor { value /= x;}
)*
;
factor returns [double value =0 ]
{double x;}
:
value = atom
(
TOK_POW x = atom { value = pow(value,x); }
)*
;
atom returns [double value=0]
{double x;}
:
i:NUM
{
value=atof((i->getText()).c_str());
}
|
TOK_SIN x = atom { value = sin (x);}
|
TOK_COS x = atom { value = cos (x);}
|
TOK_TAN x = atom { value = tan (x);}
|
LPAREN value=expr RPAREN
;
exception
catch [ANTLR_USE_NAMESPACE(antlr)ANTLRException& ex] {
reportError(ex.toString());
}
class ExprLexer extends Lexer;
options{
k=1;
caseSensitive = false;
}
// tokens
LPAREN :'(';
RPAREN :')';
PLUS :'+';
MINUS :'-';
STAR :'*';
SLASH :'/';
NUM :('0'..'9')('0'..'9')*('.'('0'..'9')*)?;
RETURN :'n';
// math token
TOK_SIN :"sin";
TOK_COS :"cos";
TOK_TAN :"tan";
TOK_POW :'^';
// white space
WS :
(
' '
|
't'
)
;
**本上面文件内容是在网络上COPY下来的。原作者不详。
之后再在工程名上右键新建一个main.cp文件
并添加如下内容:
#include "ExprParser.hpp"
#include "ExprLexer.hpp"
#include
using namespace std;
void main()
{
ExprLexer lexer( cin );
ExprParser parser( lexer );
double x = 0;
x = parser.expr();
cout << "The Result is :" << x << endl;
}
**本上面文件内容是在网络上COPY下来的。原作者不详。
之后在工程名上右键。点击Properties.
选择C/C++ build /Settings
设置GCC C++ Linker/Libraries 如下图:
设置完成后,选择Build Steps页
在Pre-build steps/Command项里添加下面内容(内容要以你的环境来定):
java -cp /home/bndxgae/antlr/antlr-2.7.7/antlr.jar antlr.Tool -o "/home/bndxgae/workspace/CppAntlrTest" /home/bndxgae/workspace/CppAntlrTest/cpp.g
点击OK设置完成。
点击工程名,编译工程,第一次编译可能有问题,再编译一次。编译之后工程会自动生成下面几个文件
-rw-r--r-- 1 bndxgae users 11300 2010-01-04 21:10 ExprLexer.cpp
-rw-r--r-- 1 bndxgae users 1473 2010-01-04 21:10 ExprLexer.hpp
-rw-r--r-- 1 bndxgae users 4835 2010-01-04 21:10 ExprParser.cpp
-rw-r--r-- 1 bndxgae users 1903 2010-01-04 21:10 ExprParser.hpp
-rw-r--r-- 1 bndxgae users 564 2010-01-04 21:10 ExprParserTokenTypes.hpp
-rw-r--r-- 1 bndxgae users 221 2010-01-04 21:09 ExprParserTokenTypes.txt
编译通过我们来测试一下我们的程序吧。
bndxgae@linux-78tc:~/workspace/CppAntlrTest/Debug> ./CppAntlrTest
123*123
The Result is :15129
bndxgae@linux-78tc:~/workspace/CppAntlrTest/Debug>
OK。在SUSE下的编译环境就搭建完成了。