博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
词法分析程序 LEX和VC6整合使用的一个简单例子
阅读量:5892 次
发布时间:2019-06-19

本文共 1879 字,大约阅读时间需要 6 分钟。

词法分析的知识不少,包括了正规式、正规文法、它们之间的转换以及确定的有穷自动机和不确定的有穷自动机等等。。。

 

要自己写一个词法分析器也不会很难,只要给出了最简的有穷自动机,就能很方便实现了,用if、switch-case来写一通所谓的状态转换就可以,我近期会写一个简单的词法分析程序来作为例子。。。

 

现在已经有人发明了一个叫LEX的工具让你去应用,那我们就省了不少力气,毕竟没到万不得已的时候,我们都没必要重新发明轮子,从另一个角度来说,使用工具是我们人类知识继承的一种方法,也是我们比其他动物优胜的地方。所以这篇文章我们就来探讨一下如何使用这个工具。。。

 

工具的准备:

我是用了VC6和flex.exe(这个程序可以在WINDOWS下使用,下面还带了个BISON。exe的程序,可以上网找找看,下载下来,因为我都忘记在哪里下的了。。。)

 

flex.exe的使用:

首先要写个后缀为 .l 的文件,这个文件分为了上中下三部分,三部分是用两串的%%来隔开的。

开始部分是指你要准备的工作,例如定义一下要用到的变量阿之类的。。。

中间部分是指要识别的字串和识别到之后要进行的动作。。。

最后部分就是一些要拷贝到生成文件里的C代码了,LEX基本原封不动的帮你拷贝过去。。。

 http://hovertree.com/

下面就是我写的 .l 文件,看到两个%%隔开的三部分了吧,如果用flex生成文件的过程中出现什么 "yywrap"的错误,就像我一样在下面加上 %option noyywrap 这一句:

 

%{

int num_lines = 0, num_chars = 0;
%}
%option noyywrap

%%

[a-z]  ECHO;
/n      ++num_lines; ++num_chars;
.       ++num_chars;

%%

int main(int argc, char* argv[])
{
 yylex();
 printf( "# of lines = %d, # of chars = %d/n", num_lines, num_chars );
}

 

主要还是中间部分比较重要,在LEX的参考文档里,是一种 pattern--action 的对应,识别出来,要干吗就由你来定了,这里是:

1、[a-z]  ECHO; 用ECHO来输出一下 字母字符串,

2、/n      ++num_lines; ++num_chars;碰到/n换行符就行数加一,这样可以用来统计代码的行数,

3、.       ++num_chars; 这里是碰到任何字符都字符数加一,这样可以统计一下字符的个数。

 

然后就用flex.exe来"编译"一下,如果没有错误,就直接通过并生成一个"lex.yy.c" 文件。。。

 

vc6和flex.exe的整合:

flex.exe给我们生成了个 .c 的文件,我们要在vc6里使用它,那首先就是建立一个console工程,把这个 C文件包含进来。上面写的.l 文件也要和"lex.yy.c" 文件放在一起。。。

 

然后直接编译,OK,通过了,我们运行之,然后敲一些数字和一些字母回车,我们就会发现,程序把字母显示出来了(ECHO),数字没有显示,然后我们按 CTRL+break 来退出程序的时候,就会输出有多少行和多少个字符。。。

 

上面我们的输出和输入都是标准的,就是屏幕,如果我们要读入一个文件来分析应该怎么办呢?

 

很简单,我们就改写一下"lex.yy.c" 文件里的main()函数,改成下面这样就好了(打开一个文件,把输入 yyin 指向文件的句柄,yyin 和 yylex 都是lex生成的固定变量和函数,还有一些yyout什么的,先自己看看哈):

 

int main(int argc, char* argv[])

{
 FILE *f = fopen("main.txt", "r");
 yyin = f;
 yylex();
 printf( "# of lines = %d, # of chars = %d/n", num_lines, num_chars );
}

 好了,一个简单的词法分析程序就生成了,入了门,要做些别的事情就发挥你的想象力吧。。。

 

尚待解决的问题:

使用flex.exe和vc6的整合还是很不舒服,如果flex生成的是c++文件,又会要求包含一些unix下的头文件,我还没找到解决的办法,知道的请告诉我一下,先谢过哈。

转载于:https://www.cnblogs.com/roucheng/p/cifa.html

你可能感兴趣的文章
微软正式发布PowerShell Core 6.0
查看>>
Power Designer 备忘
查看>>
招商银行年度科技投入65亿元占总营收2.78%,各大银行科技投入争先全速跑
查看>>
专访卢政:TSF如何助力企业微服务开发
查看>>
元数据驱动设计——连接设计与开发的敏捷桥梁
查看>>
从蚂蚁金服实践入手,带你深入了解 Service Mesh
查看>>
MongoDB数据库泄露8亿电邮地址;微软开源Windows计算器;Linux 5.0 Kernel发布丨Q新闻...
查看>>
Gitter:高颜值GitHub小程序客户端诞生记
查看>>
Payara基金会发布全面支持MicroProfile 2.0的5.183版Payara Server和Payara Micro
查看>>
AWS开源Firecracker,一种运行多租户容器服务的新虚拟化技术
查看>>
搞容器,必须考虑这五大安全要素
查看>>
深入JVM彻底剖析ygc越来越慢的原因(上)
查看>>
More than React(二)组件对复用性有害?
查看>>
Fetch API
查看>>
严肃科普:12306能扛得住明星并发出轨级的流量吗?
查看>>
iOS程序员学习android之一
查看>>
vue.js 高德地图
查看>>
live555编译
查看>>
【译】测试驱动开发:使用 Node.js 和 MongoDB 构建 Todo API
查看>>
【腾讯Bugly干货分享】移动App入侵与逆向破解技术-iOS篇
查看>>