在linux(suse)下利用ANTLR生成C++描述的分析程序

最近在研究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 <stdlib.h>

#include <stdio.h>

#include <math.h>

}

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 <iostream>

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下的编译环境就搭建完成了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值