您的位置:首页 > 其它

深度剖析WinPcap之(十)——数据包的内核过滤(3)

2010-06-23 11:01 435 查看
本文转自http://eslxf.blog.51cto.com/918801/231362



1.1.1.4. 使用flex与bison实现四则运算计算器的实例

1)实现环境Redhat Enterprise Advance server 5(2.6.18内核),flex的版本为2.5.4,bison 的版本为2.3。
词法文件frame.l的内容:

$# cat frame.l

%{
#include <stdlib.h>
#include "frame.tab.h"

void yyerror(char *);
%}
%%
[0-9]+ {yylval = atoi(yytext);
return INTEGER;}

[-+*//n] {return *yytext;}

[/t] ;

. yyerror("invalid character");

%%
int yywrap(void)
{
return 1;

}

语法文件frame.y的内容
$ cat frame.y

%{

#include <stdio.h>

int yylex(void);
void yyerror(char *);
%}
%token INTEGER

%%
program:
program expr '/n' {printf("%d/n",$2);}
|
;
expr:INTEGER {$$ = $1;}
|expr'+'expr {$$=$1+$3;}
|expr'-'expr {$$=$1-$3;}
|expr'*'expr {$$=$1*$3;}
|expr'/'expr {$$=$1/$3;}
;

%%
void yyerror(char *s){
printf("%s/n",s);
return;
}

int main(void){
yyparse();
return 0;

}


编译过程
$ flex frame.l
$ bison -d frame.y
$ g++ -o cal frame.tab.c lex.yy.c
$ ls
cal frame.l frame.tab.c frame.tab.h frame.y lex.yy.c

运行结果如下所示:

$ ./cal

7=8
invalid character
syntax error
$ ./cal
7+8
15
8*6
48
9/4
2
7*8

56


2)实现环境WindosXP,Visual Studio 2005,flex的版本为2.5.4,bison 的版本为1.28[1]
词法文件frame.l的内容

%{

#include <stdlib.h>
#include <io.h>

#include "frame.tab.h"

void yyerror(char *);
%}
%%
[0-9]+ {yylval = atoi(yytext);
return INTEGER;}

[-+*//n] {return *yytext;}

[/t] ;

. yyerror("invalid character");

%%
int yywrap(void)
{
return 1;

}

语法文件frame.y的内容

%{

#include <stdlib.h>
#include <stdio.h>

int yylex(void);
void yyerror(char *);
%}
%token INTEGER

%%
program:
program expr '/n' {printf("%d/n",$2);}
|
;
expr:INTEGER {$$ = $1;}
|expr'+'expr {$$=$1+$3;}
|expr'-'expr {$$=$1-$3;}
|expr'*'expr {$$=$1*$3;}
|expr'/'expr {$$=$1/$3;}
;

%%
void yyerror(char *s){
printf("%s/n",s);
return;
}

int main(void){
yyparse();
return 0;

}

编译过程

> flex frame.l

> bison -d frame.y


在Visual Studio 2005中创建工程cal_vc2005,把生成的frame.tab.c frame.tab.h lex.yy.c文件添加到该工程中。
把lex.yy.c文件第25行屏蔽,否则编译出错,因为这为Unix系统或类Unix系统的头文件。

//#include <unistd.h>

构建成功。

注意:如果使用了C++的特性,则需要进行文件改名,否则编译器当作C文件编译将会出错

>mv frame.tab.c frame.tab.cpp

> mv lex.yy.c lex.yy.cpp

运行结果如图10-2所示:




图10-2 计算器的运行结果

[1] 从因特网上获得UnxUtils工具套件,其中含有flex与bison工具。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: