深度剖析WinPcap之(十)——数据包的内核过滤(3)
2010-06-23 11:01
435 查看
本文转自http://eslxf.blog.51cto.com/918801/231362
词法文件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工具。
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工具。
相关文章推荐
- 深度剖析WinPcap之(十)——数据包的内核过滤(4)
- 深度剖析WinPcap之(十)——数据包的内核过滤(12)
- 深度剖析WinPcap之(十)——数据包的内核过滤(5)
- 深度剖析WinPcap之(十)——数据包的内核过滤(13)
- 深度剖析WinPcap之(十)——数据包的内核过滤(6)
- 深度剖析WinPcap之(十)——数据包的内核过滤(14)
- 深度剖析WinPcap之(十)——数据包的内核过滤(7)
- 深度剖析WinPcap之(十)——数据包的内核过滤(15)
- 深度剖析WinPcap之(十)——数据包的内核过滤(8)
- 深度剖析WinPcap之(十)——数据包的内核过滤(16)
- 深度剖析WinPcap之(十)——数据包的内核过滤(9)
- 深度剖析WinPcap之(十)——数据包的内核过滤(1)
- 深度剖析WinPcap之(十)——数据包的内核过滤(10)
- 深度剖析WinPcap之(十)——数据包的内核过滤(2)
- 深度剖析WinPcap之(十)——数据包的内核过滤(11)
- 深度剖析WinPcap之(九)——数据包的发送过程(2)
- 深度剖析WinPcap之(九)——数据包的发送过程(10)
- 深度剖析WinPcap之(九)――数据包的发送过程(5)
- 深度剖析WinPcap之(九)――数据包的发送过程(13)
- 深度剖析WinPcap之(三)——内核驱动NPF涉及的基础知识(1)