词法分析程序 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 浏览器内核(navigator.appName显示的不是内核信息!!)。

    浏览器内核(navigator.appName显示的不是内核信息!!)。前言:今天用navigator.appName命令时,发现Chrome和FireFox都是”Netscape”。于是有疑问,怎么回事网景公司的浏览起名字呢!(IE是”MicrosoftInternetExplorer”)(Presto是”Opera”)上网调查了一下,最开始以为和浏览器内核有关,但其实关系不大。Trident:IE以Triden…

    2022年9月12日
    3
  • 登录页面的代码

    登录页面的代码开发工具与关键技术:MVC/JavaScript作者:邱慧敏撰写时间:2019/06/25在把页面和数据库做好之后,我的登录页面只需要用户名和密码,所以代码比较简单。先找到登录按钮,给一个点击事件,然后再获取他们的表单值,然后对用户名和密码进行判断,判断是否填写了资料和是否是正确的账户和密码,在这之前还要检查登录页面是否是属于外层页面。dataValidationFo…

    2022年4月4日
    55
  • live555源代码概述「建议收藏」

    live555源代码概述「建议收藏」
    live555源代码概述2010年01月29日星期五13:03liveMedia项目(http://www.live555.com/)的源代码包括四个基本的库,各种测试代码以及MediaServer。四个基本的库分别是:UsageEnvironment&TaskScheduler,groupsock,liveMedia和BasicUsageEnvironment。 

    UsageEnvironment和TaskScheduler类用于事件的调度,实现异步读取事件的

    2022年7月16日
    20
  • 要想混得好,必须认识21个人!

    要想混得好,必须认识21个人!

    2022年1月18日
    63
  • python提示AttributeError: ‘NoneType’ object has no attribute ‘append’

    python提示AttributeError: ‘NoneType’ object has no attribute ‘append’在写python脚本时遇到AttributeError:’NoneType’objecthasnoattribute’append’a=[]b=[1,2,3,4]a=a.append(b)执行一次后发现a的类型变为了NoneType。下次执行时就会出现如题所示的错误。把a=a.append(b)改为a.append(b)后问题解决。原因:append

    2025年6月5日
    3
  • printwriter报错_java输出print和println

    printwriter报错_java输出print和println我是一位长期读者,但是第一次写作.我目前正在尝试在代码库中使用AspectJ实现一个记录器.AspectJ似乎运行良好,但我遇到了非常奇怪的Java错误.我是一个长期的C和.Net开发人员,他仍然适应Java的世界,所以如果这是一个愚蠢的问题我很抱歉.我的代码试图捕获异常,并将相关信息记录到文本文件中.陷阱工作正常,但我注意到,当我部署时,我没有得到任何数据.我在Java反编译器中打开了我的类文…

    2022年8月10日
    8

发表回复

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

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