词法分析程序 LEX和VC6整合使用的一个简单例子
词法分析的理论知识不少,包括了正规式、正规文法、它们之间的转换以及确定的有穷自动机和不确定的有穷自动机等等。。。
要自己写一个词法分析器也不会很难,只要给出了最简的有穷自动机,就能很方便实现了,用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整合使用的一个简单例子相关推荐
- 程序员成长之旅——Delphi实现一个简单的科学计算器
程序员成长之旅--Delphi实现一个简单的科学计算器 目标效果 组件以及开发环境 最终呈现 源码GITHUB 目标效果 组件以及开发环境 delphi7版本及以上,这里我用delphi10.4进行的 ...
- python运行不了程序代码_Python源码分析2 - 一个简单的Python程序的执行
本文主要通过跟踪一个非常简单的Python程序的执行,简单讨论Python实现的基本框架和结构. 要执行Python程序如下,功能非常简单:从1加到10再打印出来 # test program sum ...
- SpringBoot整合MongoDB(实现一个简单缓存)
目录 前言 创建MongoDB数据库和项目 创建MongoDB数据库 创建项目 预备工作 缓存查询 缓存更新.删除 缓存更新 缓存删除 前言 SpringBoot是常用开发框架,而MongoDB也是最 ...
- 手把手教你整合SSM实现一个简单的CRUD项目
目录 项目笔记 一.项目简介 二.项目步骤 1.搭建数据库环境 2.dao层编写(基于mybatis框架) 3.service层编写(基于spring框架) 4.controller层编写(基于spr ...
- python编写一个简单的程序验证码_针对验证码,做一个简单的自动网上签到程序(一)...
现在签到改成网络签到,比较麻烦,总是需要登陆再签,所以想着做个自动登录并签到的东西,看了看,其他的问题都不大,登录的东西很简单,就是post下就可以了. 查了查,主要问题在验证码部分,看了看,有几种途 ...
- python程序初学者计算器界面_Python初学者,一个简单的计算器程序的数学函数
我正在为一门程序设计课程制作一个基本计算器,我已经读了PDF文件,但我不知道如何制作一个函数,然后用它来打印两个数相加的结果.有人能帮我吗?在def addition(intFirstOperand, ...
- java程序 购物车_用java代码写一个简单的网上购物车程序
1 需求:1.写一个商品类,有商品编号.商品名称.商品分类.商品单价属性.2.写一个商品条目信息类,有商品和数量两个属性,有商品总价格方法.2 3 3.写一个购物车类,有添加商品方法.查看订单信息,删 ...
- 老程序员教女儿学习java从一个简单的猜数游戏开始
为了教会女儿学习java花了三天的下班时间编写了一个java猜数字游戏,为了让她感兴趣,同时能理解编程的思路,可惜目标没有达成,现在共享给大家学习. package test; import java ...
- c++自底向上算符优先分析_词法分析程序的自动生成器(二)——Thompson算法
碎碎念:我写词法分析程序的自动生成器的时候,先写的NFA-DFA和DFA化简.之后发现因为正则表达式的结构太复杂了,比如描述Pl/0程序标识符的正则表达式是 (a|-|z|A|-|Z)( a|-|z| ...
最新文章
- Python使用matplotlib可视化柱状图、坐标轴标签的符号(-)显示为了方框□□、设置rcParams参数配置解决
- VEND MASTER DATA
- ajax mysql项目 react_Github MIT开源银行电子支付系统(ReactJS+Nodejs+Mysql)
- oracle查询等于外的,Oracle 查询、更新基本操作
- Hyper-v Server 2012 Release Candidate 部署体验
- bandizip最后一个无广告版本_如果非要选择一款压缩软件的话——Bandizip
- guiconsole 操作命令
- 华为新系统鸿蒙在哪更新,暂定3月,华为新系统登场!开始切换至鸿蒙OS,37款机型支持升级...
- 强化学习的数学基础3---Q-Learning
- 移动支付--银联,支付宝,微信(android)
- Interesting Finds: 2007.12.19
- Java之数组(下)
- SQL 触发器 简记
- JS获取手机型号和系统类型
- simulink常用模块
- 达人评测 iPad Pro 2021怎么样
- 方差分析——单因素方差分析
- 从 ADNI 的 XML 文件中读取临床信息
- 阿里云实时计算产品经理李佳林:基于 Flink 构建大规模风控系统的技术实战
- buid和version之间的区别