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

  在用flex杯bison开发语言处理程序时,用户先编写一个flex源程序和一个bison源程序。flex , bison和C/C++是强耦合的。
  flex源程序经flex处理后,在文件lex.yy.c中生成一个用C语言描述的词法分析子程序yylex() ,文件lex.yy.c再经C编译器编译,就可以得到能与其它模块链接的目标文件lex.yy.o或可直接运行的命今文件。
  bison源程序经bison处理后可在文件y.tab.c中得到一个用C语言描述的语法分析子程序yyparse()。文件y.tab.c再经C编译器编译,就可以得到能与其它模块链接的目标文件y.tab.o或可直接运行的命令文件。
  flex和bison对源程序文件的名字没有特殊要求,但以.1作为flex源文件的扩展名,以.Y作为bison的扩展名是一个良好的习惯。
  flex编程可以分为三步:
  Step 1:编写词法分析文件,以flex可以理解的格式指定模式相关的动作。
  Step2:在这一文件上运行flex,生成扫描器的C代码。
  Step3:编译和链接C代码,生成可执行的扫描器。
  注意:如果扫描器是用bison开发的解析器的一部分,只需要进行第一步和第二步。
  用bison来创建一个编译器包括四个步骤:
  Step 1:编写一个.Y的语法文件(同时说明C在这里要进行的动作);编写一个词法分析器来处理输人,并将标记传递给解析器。这通常可以使用flex来完成。编写一个函数,通过调用yyparse()来开始解析。编写错误处理例程(如yyerror())。
  Step2:通过在语法文件上运行bison生成一个解析器。
  Step3:编译bison生成的代码以及其他相关的源文件。
  Step4:将目标文件链接到适当的可执行解析器库。
  如果要用flex所生成的词法分析程序和bison生成的语法分析程序共同组成一个完整的语言处理系统,那么,要使它们的函数名、参数和返回值相一致。由于bison所生成的语法分析程序yyparse()调用的词法分析程序与flex所生成的程序都叫yylex(),所以函数名上是相吻合的,不存在矛盾。而且因yylex()是无参函数,也不存在参数传递问题,语法分析程序yypase()要求词法分析程序为它返回单词的编码。
  flex源程序中,同一个单词在词法分析程序和语法分析程序中必须代表相同的值。在bison所生成的文件y.tab.c中,每一个终结符、标识符都被用#define语句定义为一个整数,这个整数的值就是该终结符的编码。第一个出现在bison源程序的%token说明中的终结符的编码为257,其余终结符的编码按照它们在%token说明中出现的次序依次增加。文字型终结符以它们的ASCII码值(0-255)作为自身的单词编码。yylval是一个由bison负责进行定义的变量,不必在源程序中进行说明。但如果需要重新定义,就需要在.Y文件的说明段指出。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值