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

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

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

  1. 程序员成长之旅——Delphi实现一个简单的科学计算器

    程序员成长之旅--Delphi实现一个简单的科学计算器 目标效果 组件以及开发环境 最终呈现 源码GITHUB 目标效果 组件以及开发环境 delphi7版本及以上,这里我用delphi10.4进行的 ...

  2. python运行不了程序代码_Python源码分析2 - 一个简单的Python程序的执行

    本文主要通过跟踪一个非常简单的Python程序的执行,简单讨论Python实现的基本框架和结构. 要执行Python程序如下,功能非常简单:从1加到10再打印出来 # test program sum ...

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

    目录 前言 创建MongoDB数据库和项目 创建MongoDB数据库 创建项目 预备工作 缓存查询 缓存更新.删除 缓存更新 缓存删除 前言 SpringBoot是常用开发框架,而MongoDB也是最 ...

  4. 手把手教你整合SSM实现一个简单的CRUD项目

    目录 项目笔记 一.项目简介 二.项目步骤 1.搭建数据库环境 2.dao层编写(基于mybatis框架) 3.service层编写(基于spring框架) 4.controller层编写(基于spr ...

  5. python编写一个简单的程序验证码_针对验证码,做一个简单的自动网上签到程序(一)...

    现在签到改成网络签到,比较麻烦,总是需要登陆再签,所以想着做个自动登录并签到的东西,看了看,其他的问题都不大,登录的东西很简单,就是post下就可以了. 查了查,主要问题在验证码部分,看了看,有几种途 ...

  6. python程序初学者计算器界面_Python初学者,一个简单的计算器程序的数学函数

    我正在为一门程序设计课程制作一个基本计算器,我已经读了PDF文件,但我不知道如何制作一个函数,然后用它来打印两个数相加的结果.有人能帮我吗?在def addition(intFirstOperand, ...

  7. java程序 购物车_用java代码写一个简单的网上购物车程序

    1 需求:1.写一个商品类,有商品编号.商品名称.商品分类.商品单价属性.2.写一个商品条目信息类,有商品和数量两个属性,有商品总价格方法.2 3 3.写一个购物车类,有添加商品方法.查看订单信息,删 ...

  8. 老程序员教女儿学习java从一个简单的猜数游戏开始

    为了教会女儿学习java花了三天的下班时间编写了一个java猜数字游戏,为了让她感兴趣,同时能理解编程的思路,可惜目标没有达成,现在共享给大家学习. package test; import java ...

  9. c++自底向上算符优先分析_词法分析程序的自动生成器(二)——Thompson算法

    碎碎念:我写词法分析程序的自动生成器的时候,先写的NFA-DFA和DFA化简.之后发现因为正则表达式的结构太复杂了,比如描述Pl/0程序标识符的正则表达式是 (a|-|z|A|-|Z)( a|-|z| ...

最新文章

  1. Python使用matplotlib可视化柱状图、坐标轴标签的符号(-)显示为了方框□□、设置rcParams参数配置解决
  2. VEND MASTER DATA
  3. ajax mysql项目 react_Github MIT开源银行电子支付系统(ReactJS+Nodejs+Mysql)
  4. oracle查询等于外的,Oracle 查询、更新基本操作
  5. Hyper-v Server 2012 Release Candidate 部署体验
  6. bandizip最后一个无广告版本_如果非要选择一款压缩软件的话——Bandizip
  7. guiconsole 操作命令
  8. 华为新系统鸿蒙在哪更新,暂定3月,华为新系统登场!开始切换至鸿蒙OS,37款机型支持升级...
  9. 强化学习的数学基础3---Q-Learning
  10. 移动支付--银联,支付宝,微信(android)
  11. Interesting Finds: 2007.12.19
  12. Java之数组(下)
  13. SQL 触发器 简记
  14. JS获取手机型号和系统类型
  15. simulink常用模块
  16. 达人评测 iPad Pro 2021怎么样
  17. 方差分析——单因素方差分析
  18. 从 ADNI 的 XML 文件中读取临床信息
  19. 阿里云实时计算产品经理李佳林:基于 Flink 构建大规模风控系统的技术实战
  20. buid和version之间的区别

热门文章

  1. eclipse中设定文档注释
  2. suse 10 下mysql安装
  3. Eclipse+JBoss+Seam我实在难以忍受
  4. oracle 触发器写法|oracle trigger 语法
  5. 一个程序猿必须掌握的HTML的常识
  6. 接口工具使用对比(apipost、jmeter、postman、swagger等)
  7. python基础之拆包、匿名函数、文件的初级应用
  8. 数据库-几个重要的数据库相关概念
  9. 页面滚动到某一位置吸顶_vue监听滚动事件某元素吸顶或固定位置显示详解
  10. 高响应比优先调度算法 (HRRN)例题