词法分析程序 LEX和VC6整合使用的一个简单例子

词法分析的理论知识不少,包括了正规式、正规文法、它们之间的转换以及确定的有穷自动机和不确定的有穷自动机等等。。。要自己写一个词法分析器也不会很难,只要给出了最简的有穷自动机,就能很方便实现了,用if

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

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

 

要自己写一个词法分析器也不会很难,只要给出了最简的有穷自动机,就能很方便实现了,用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下的头文件,我还没找到解决的办法,知道的请告诉我一下,先谢过哈。

http://www.cnblogs.com/roucheng/p/texiao.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120440.html原文链接:https://javaforall.net

(0)
上一篇 2021年12月25日 下午3:00
下一篇 2021年12月25日 下午3:00


相关推荐

  • linux——ifcfg-ens33文件参数解释

    linux——ifcfg-ens33文件参数解释早上在用 ifconfig 命令的时候得到的 IP 是 192 168 137 132 但是看 ifcfg ens33 文件里面 IP 配置的是 192 168 137 129 通过请教大神和百度得知 是与 ifcfg ens33 文件配置有关系 BOOTPROTO 改为 static 故学习下 ifcfg ens33 文件的各参数具体含义 参考 https wenku baidu com view a1f85a28

    2026年3月18日
    2
  • Lion Disk Maker让你一键制作Lion系统安装U盘

    Lion Disk Maker让你一键制作Lion系统安装U盘LionDiskMake 让你一键制作 Lion 系统安装 U 盘什么是 liondiskmake liondiskmake lion 系统盘制作器 是一款基于 applescript 的小程序 可以在 macosx10 6 或者 10 7 系统下 通过 osxlion 安装程序 一键自动制作一个 dvd 安装光盘或安装 u 盘 使用方法很简单 打开 liondiskmake 之

    2026年3月19日
    1
  • 《天下强汉》6、西汉历史的最后一抹辉煌——绝域名将陈汤

    《天下强汉》6、西汉历史的最后一抹辉煌——绝域名将陈汤【档案】  姓名:陈汤,字子公  生卒:约公元前75年—约公元前5年  性别:男  外貌:双臂半残  籍贯:山阳瑕丘人(今山东兖州东北)  家庭出身:穷书生,业余乞丐  学历:自学成才  著作:《汉射声校尉陈汤集》二卷,已失传  经典战役:远袭中亚郅支之战  战功:亲诛郅支单于,威行外国  特技:火攻,鼓舞,强行  特长:学识渊博,精于著文,具备非凡的决断力和行动力  爱好:读书,登山,钱财,交友…

    2022年5月31日
    80
  • 设置libevent

    设置libeventlibevent 有一些全局设置是整个程序共享的 这些设置影响整个库 在调用 libevent 库的其他部分之前都需要对这些设置进行修改 否则 libevent 可能处于不一致状态 1 日志 libevent 记录内在的错误和告警 如果支持日志进行编译 它也能记录调试信息 默认情况下 这些信息输出到 stderr 我们也可以提供自己的日志函数改变输出 涉及的接口 defineEVENT L

    2026年3月16日
    2
  • 神经网络与BP神经网络

    神经网络与BP神经网络

    2021年11月19日
    38
  • 员工管理系统源码_小公司服务器方案

    员工管理系统源码_小公司服务器方案简介:员工管理系统源码是一款:基于ThinkPHP框架开发的员工管理/员工信息记录系统,有增删改查功能,源码全开源,方便二次开发,搭建和使用都很简单安装教程:环境:Linux+mysql5.6+php7.2安装步骤:1.新建站点–》上传–》解压2.导入数据库文件3.修改/数据库 \Application\Home\Conf\config.php4.后台地址/home/login/index账号密码admin  www.ohbbs.cn5

    2026年2月21日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号