例子1、从标准输入的字数、单词、行数统计

%{
#include <string.h>
int chars = 0;
int lines = 0;
int words = 0;
%} %%
[a-zA-Z]+ { chars += strlen(yytext); words++; }
\n { lines++; }
. { chars++; } %% int main(int argc, char** argv)
{
yylex();
printf("chars=%d,words=%d,lines=%d\n",chars,words,lines); return 0;
}

 对应的Makefile文件:

test:wc.l
flex wc.l
gcc -W -o test lex.yy.c
clean:
rm -rf test lex.yy.o

 出现错误信息:

[root@typhoeus79 flex]# make
flex wc.l
gcc -W -o test lex.yy.c
/tmp/ccSylYmr.o: In function `yylex':
lex.yy.c:(.text+0x413): undefined reference to `yywrap'
/tmp/ccSylYmr.o: In function `input':
lex.yy.c:(.text+0xcb8): undefined reference to `yywrap'
collect2: ld returned 1 exit status
make: *** [test] Error 1

解决方案1:添加设置noyywrap设置 ,

%option noyywrap

解决方案2:设置绑定flex对应的库:

gcc -W -o test lex.yy.c -lfl

  

例子2、从一个文件中读取分析的内容,按照字母组成、数字、空格以及换行符进行区分

[root@typhoeus79 wc]# more test.l
/*默认是从标准输入输出读取,设置该选项支持从文件读取*/
%option noyywrap
%{
%} %% [a-zA-Z]+ { printf("CHAR Match=%s\n",yytext);}
\n { printf("Enter Match=%s\n",yytext);}
[0-9]+ { printf("Digitals Match=%s\n",yytext); }
[ \t]* { printf("SPACE Match=%s\n",yytext); } %% main(int argc,char ** argv)
{
int i; if(argc<2)
{
yylex();
return 0;
} for(i=1; i < argc; i++)
{
FILE *f = fopen(argv[i],"r"); if(!f){
perror(argv[i]);
return (1);
} //yyrestart使词法分析器从f中读取标准输入文件
yyrestart(f);
yylex();
fclose(f); } return 0; }

测试:

[root@typhoeus79 wc]# more Makefile
test:lex.yy.c
flex test.l
gcc -W -o test lex.yy.c
[root@typhoeus79 wc]#
[root@typhoeus79 wc]# make
flex test.l
gcc -W -o test lex.yy.c
[root@typhoeus79 wc]# more tmp
aaaee AAQQZZ
CCDD 1234
56
[root@typhoeus79 wc]# ./test tmp
CHAR Match=aaaee
SPACE Match=
CHAR Match=AAQQZZ
Enter Match= CHAR Match=CCDD
SPACE Match=
Digitals Match=1234
Enter Match= Digitals Match=56
Enter Match= [root@typhoeus79 wc]#

从输出中可以看出从文件逐个读取,按照模式最大匹配,并存储在yytext中。

例子3:模拟wc的简单例子

[root@typhoeus79 wc]# more wc.l
/*默认是从标准输入输出读取,设置该选项支持从文件读取*/
%option noyywrap %{
int chars = 0;
int lines = 0;
int words = 0; int totchars = 0;
int totlines = 0;
int totwords = 0;
%} %% [a-zA-Z]+ { words++; chars += strlen(yytext); }
\n { lines++; chars++;}
. { chars++ ;} %% main(int argc,char ** argv)
{
int i; if(argc<2)
{
yylex();
printf("%8d%8d%8d\n",lines,words,chars);
return 0;
} for(i=1; i < argc; i++)
{
FILE *f = fopen(argv[i],"r"); if(!f){
perror(argv[i]);
return (1);
} //yyrestart使词法分析器从f中读取标准输入文件
yyrestart(f);
yylex();
fclose(f); printf("%8d%8d%8d\n",lines,words,chars);
totchars += chars; chars = 0;
totwords += words; words = 0;
totlines += lines; lines = 0; } if( argc>1 )
printf("%8d%8d%8d total\n",totlines,totwords,totchars);
return 0; }

例子中具有三种匹配规则:

[a-zA-Z]+匹配1个或者多个字母组成的字符串

\n匹配换行

.匹配除了换行符以外的其他任意单一字符

可以看到规则1和规则3之间可能存在冗余,例如单个字符a,两个规则都可以匹配上,优先匹配规则1,故规则的顺序影响匹配的内容

例子4:词法分析解析算数表达式

%option noyywrap

%%
"+" { printf("PLUS\n"); }
"-" { printf("SUBS\n"); }
"*" { printf("MULT\n"); }
"/" { printf("DIVDE\n"); } [0-9]+ { printf("NUMBER %s\n",yytext); }
[ \t ] {}
\n { printf("NEWLINE\n"); } . { printf("Mystery character %s\n",yytext); } %%

测试例子:

[root@typhoeus79 flex]# ./test
5 6 / 7q
NUMBER 5
NUMBER 6
DIVDE
NUMBER 7
Mystery character q
NEWLINE
12+34
NUMBER 12
PLUS
NUMBER 34
NEWLINE

flex词法解析的更多相关文章

  1. Atiit 如何手写词法解析器

    Atiit 如何手写词法解析器 1.1. 通过编程直接从正则->nfa->dfa->表驱动词法解析一条龙自动生成.那是用程序自动生成是需要这样的,自己手写完全不必要这么复杂1 1.2 ...

  2. jQuery-1.9.1源码分析系列(三) Sizzle选择器引擎——词法解析

    jQuery源码9600多行,而Sizzle引擎就独占近2000行,占了1/5.Sizzle引擎.jQuery事件机制.ajax是整个jQuery的核心,也是jQuery技术精华的体现.里面的有些策略 ...

  3. 分析Sizzle引擎 - 词法解析

    分析Sizzle引擎 - 词法解析 声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 浏览器从下载文档到显示页面的过程是个复杂的过程,这里包含了重绘和重排.各家浏览器引擎的工 ...

  4. Python_编程题集_001_词法解析

    1.词法解析: 我的是名字是ths,今年18岁 语法分析后得到结果如下: 数字:18 中文:我的名字是 今年 岁 拼音:ths 符号:,. 请编写程序实现该词法分析功能 string模块解: impo ...

  5. jQuery 2.0.3 源码分析Sizzle引擎 - 词法解析

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 浏览器从下载文档到显示页面的过程是个复杂的过程,这里包含了重绘和重排.各家浏览器引擎的工作原理略有差别,但也有一定规则. 简 ...

  6. boost之词法解析器spirit

    摘要:解析器就是编译原理中的语言的词法分析器,可以按照文法规则提取字符或者单词.功能:接受扫描器的输入,并根据语法规则对输入流进行匹配,匹配成功后执行语义动作,进行输入数据的处理. C++ 程序员需要 ...

  7. flex容器解析

    通常在Flex种有两种形式的容器:布局和导航. 在容器中我们可以同时设置一些空间和子容器,我们可以叫在容器内定义的任何组件为该容器的孩子. 在一个Flex程序的根部是一个叫做Application C ...

  8. 自制操作系统Antz(14)——实现内置编程语言(词法解析器)

    AntzScript

  9. 词法解析 用reactjs和bootstrap创建页面IDE

随机推荐

  1. 媲美jQuery的JS框架——AngularJS(一)

    前言 相信原生JS大家都不陌生,至于为什么说原生,是因为在JS的基础上衍生出了很多的框架.有些框架的使用非常广泛,甚至已经达到了媲美原生的地步.在之前的文章中给大家介绍了jQuery这一介绍框架.今天 ...

  2. 使用邮件监控Mxnet训练

    1. 前言 受到小伙伴的启发,就自己动手写了一个使用邮件监控Mxnet训练的例子.整体不算复杂. 2. 打包训练代码 需要进行监控训练,所以需要将训练的代码打包进一个函数内,通过传参的方式进行训练.还 ...

  3. 深度学习入门篇--手把手教你用 TensorFlow 训练模型

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:付越 导语 Tensorflow在更新1.0版本之后多了很多新功能,其中放出了很多用tf框架写的深度网络结构(https://git ...

  4. android6.0 SerialPort 服务

    上一篇博客描述了一个简单的串口应用程序和驱动程序,了解了应用程序访问串口的基本操作,如打开串口,设置串口,写串口,读串口,关闭串口等.和Linux串口驱动的基本框架.这里将了解Android下的串口系 ...

  5. PHP windowns安装扩展包

    1.  php_msgpack.dll php.ini 添加  extension=php_msgpack.dll 下载dll: http://pecl.php.net/package/msgpack ...

  6. Java继承--覆盖

    java中支持单继承.不直接支持多继承,但对C++中的多继承机制进行改良. 单继承:一个子类只能有一个直接父类. 多继承:一个子类可以有多个直接父类(java中不允许,进行改良).不直接支持,因为多个 ...

  7. mybatis逆向工程

    一.背景 在实际开发中我们会自己去写mapper映射文件,接口,数据库表对应的实体类,如果需求任务比较少,咱们还可以慢慢的一个一个去写,但是这是不现实的,因为在工作中我们的任务是很多的,这时mybat ...

  8. Java数据结构和算法总结-字符串及高频面试题算法

    前言:周末闲来无事,在七月在线上看了看字符串相关算法的讲解视频,收货颇丰,跟着视频讲解简单做了一下笔记,方便以后翻阅复习同时也很乐意分享给大家.什么字符串在算法中有多重要之类的大路边上的客套话就不多说 ...

  9. Python基础3切片,字符串的方法

    切片:截取字符串某一段字符,并不改变原字符串.结构:[起始位置:终止位置:步长]  但不包括终止位置.所谓:顾头不顾尾 索引:序列中每个元素都是有编号的,都是从0开始编号的.使用负数索引时,Pytho ...

  10. PLSQL Developer oracle导入导出表及数据

    1.进入PLSQL Developer 2.创建新用户(如需要新表空间则需先创建新表空间再创建用户) 3.打开菜单Tools->Export User Objects 导出表及视图等创建SQL ...