flex & bison学习(一)

本文深入探讨编译器的核心作用及Flex工具的开发应用,通过实例展示如何利用Flex统计单词个数,揭示编译器在软件开发中的关键地位,以及Flex在简化开发过程中的优势。

编译器是软件开发中的核心部件,其作用是其他任何软件所不能取代的。编译器在工作过程中,往往完成如下的任务:

  1. 读取源代码并且获得程序的结构描述
  2. 分析程序结构,并且生成相应的目标代码

在UNIX早期时代,编写一个编译器是一件非常耗时的工作。人们为了简化开发过程,开发了Lex和YACC程序来解决第一个任务,根据用户描述的语言,生成能够解决问题的C/C++语言代码,供开发者使用。

  1. 将源代码文件分解为各种词汇(Lex)
  2. 找到这些词汇的组成方式(YACC)

GNU软件协会开发了Flex和BISON,其功能与LEX和YACC基本兼容,并且在Lex和YACC提供的功能的基础上进行了各种扩展。

 

下面是一个统计单词个数的flex代码,类似于unix下的wc

/* fb1-1 just like unix wc */
%{
int chars = 0;
int words = 0;
int lines = 0;
%}

%%

[a-zA-Z]+    { words++; chars += strlen(yytext); }
\n        { chars++; lines++; }
.        { chars++; }

%%

main()
{
  yylex();
  printf("%8d%8d%8d\n", lines, words, chars);
}

用flex进行编译

$ flex fb1-1.l

$ cc lex.yy.c -lfl

$ ./a.out

This is a test.

^D

即可看到单词结果

其中

int chars = 0;
int words = 0;
int lines = 0;

三句作为第一段定义了三个变量,并初始化

第二段为统计,使用正则表达式进行匹配

第三段为主函数,每段之间用%%号分开

转载于:https://www.cnblogs.com/djcsch2001/archive/2011/11/15/2250123.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值