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

要自己写一个词法分析器也不会很难,只要给出了最简的有穷自动机,就能很方便实现了,用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

词法分析程序 LEX和VC6整合使用的一个简单例子的更多相关文章

  1. SSM 整合配置以及一个简单登陆案例(个人记录)

    SSM 文件以及大部分参考博客 https://blog.csdn.net/qq598535550/article/details/51703190 简答的登陆注册案例下载链接在末尾补贴图了 我建立的 ...

  2. SpringBoot整合MongoDB(实现一个简单缓存)

    前言 SpringBoot是常用开发框架,而MongoDB也是最近越来越火的非关系型数据库,这里使用SpringBoot+MongoDB实现一个小案例,当然MongoDB实际做缓存的可能不多,但是这里 ...

  3. axis2与eclipse的整合:开始一个简单的axis2 的demo

    1.下载axis2,现在axis2最新版本是axis2-1.6.2,下载地址:http://axis.apache.org/axis2/java/core/download.cgi 2.下载好的zip ...

  4. 用C语言编写一个简单的词法分析程序

    问题描述: 用C或C++语言编写一个简单的词法分析程序,扫描C语言小子集的源程序,根据给定的词法规则,识别单词,填写相应的表.如果产生词法错误,则显示错误信息.位置,并试图从错误中恢复.简单的恢复方法 ...

  5. 正则语言引擎:一个简单LEX和YACC结合运用的实例

    本文先描述了LEX与YACC的书写方法.然后利用LEX与YACC编写了一个简单正则语言的引擎(暂时不支持闭包与或运算),生成的中间语言为C语言. 正则引擎应直接生成NFA或DFA模拟器的输入文件,但在 ...

  6. VC6下OpenGL 开发环境的构建外加一个简单的二维网络棋盘绘制示例

    一.安装GLUT 工具包 GLUT 不是OpenGL 所必须的,但它会给我们的学习带来一定的方便,推荐安装. Windows 环境下的GLUT 本地下载地址:glut-install.zip(大小约为 ...

  7. 并发编程概述 委托(delegate) 事件(event) .net core 2.0 event bus 一个简单的基于内存事件总线实现 .net core 基于NPOI 的excel导出类,支持自定义导出哪些字段 基于Ace Admin 的菜单栏实现 第五节:SignalR大杂烩(与MVC融合、全局的几个配置、跨域的应用、C/S程序充当Client和Server)

    并发编程概述   前言 说实话,在我软件开发的头两年几乎不考虑并发编程,请求与响应把业务逻辑尽快完成一个星期的任务能两天完成绝不拖三天(剩下时间各种浪),根本不会考虑性能问题(能接受范围内).但随着工 ...

  8. 利用OD破解一个简单的C语言程序

    最近在学习汇编(看的是王爽老师的<汇编语言(第三版)>),然后想尝试使用OD(Ollydbg)软件破解一个简单的C语言程序练练手. 环境: C语言编译环境:VC++6.0 系统:在Wind ...

  9. 我把阿里、腾讯、字节跳动、美团等Android性能优化实战整合成了一个PDF文档

    安卓开发大军浩浩荡荡,经过近十年的发展,Android技术优化日异月新,如今Android 11.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS. 但是,到了各大厂商手 ...

随机推荐

  1. WKInterfaceImage 无法更新图片的问题

    最近涉及到AppleWatch的相关项目,但有个奇怪问题无法解决,而且无法理解: 根据不同的用户操作,需要修改播放器的专辑图片. 不知道跟我的项目需求是不是有关系:我需要轮询共享空间,以拿取同步数据, ...

  2. 青蛙的约会 java版

    参考http://blog.csdn.net/polossk/article/details/9799735 package acm; public class FrogDate { public s ...

  3. 锋利的JQuery —— JQuery性能优化

    大图猛戳

  4. Atitit数据库层次架构表与知识点 attilax 总结

    Atitit数据库层次架构表与知识点 attilax 总结 第一阶段,大概理论(三五天 数据库的类型,网状,层次,树形数据库,kv数据库.Oodb Er模型   sql 并发控制与lock  Acid ...

  5. fir.im Weekly - 如何打造 Github 「爆款」开源项目

    最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...

  6. iOS-UICollectionView

    1--------------------------------------------------------------------------------------------------- ...

  7. android上引入七牛 上传图片或者文件 最终整理版本(可用)

    前言: 以下是引入七牛的步骤,以及在七牛中上传文件和获取文件private 私密地址. 生成上传凭证和获取下载凭证 具体如果使用过程有什么疑问可以加QQ(备注:七牛问题). 1:导入相关的包(注意是4 ...

  8. 使用uGUI制作游戏内2D动画

    在3D的游戏中制作2D的效果是一个很常见的需求,我在很早前玩过一个叫做艾尔之光的游戏,里面就大量的使用了这个技术.就像下面图片中的伤害数字,这些数字往往还是有一些动画效果在里面的,比如大小的变化,颜色 ...

  9. base64:URL背景图片与web页面性能优化

    一.base64百科 Base64是网络上最常见的用于传输8Bit字节代码的编码方式之一,可用于在HTTP环境下传递较长的标识信息. 某人: 唉,我彻底废柴了,为何上面明明是中文,洒家却看不懂嘞,为什 ...

  10. struts2获取web元素(request、session、application)

    一.Action中获取 第一种方式: 通过ActionContext,这种方式取到的对象是Map类型 import java.util.Map; import com.opensymphony.xwo ...