编译原理:用flex编写词法分析器

本文详细介绍了一种使用Lex进行文本分析的方法,包括如何构建词法分析器、统计字符和数字数量、跟踪行数,并通过具体实例展示了整个过程,从编写.l文件、生成lex.yy.c和lex.yy.exe,到最后运行分析文本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求:
1)每遇到你的学号,就输出你的名字,对于其他的串原样输出。
2)统计输入文件中字母的数目。
3)统计输入文件中数字的数目。
4)统计输入文件之中的行数
建议:接下来提到的文件和文件夹都放到桌面

写.l文件

① 新建文本文档->重命名为dd.l->保存(dd可以改)
就像这样:
在这里插入图片描述
② 输入以下代码

%{
#include <stdlib.h>
#include <stdio.h>
#define NUM 201612345
int num_chars = 0;
int num_ids=0;
int num_lines=1;
%}
delim [ ]
letter [A-Za-z]
digit [0-9]
number {digit}+
id {letter}+

%%
\n {num_lines++;printf("\n");}
{number} {int r=atoi(yytext);if(r==NUM) printf("夏天的鼻涕怪 ");	
		else printf("%s ",yytext);
		num_ids++;
	 }
{delim} {printf(" ");}
{id} {printf("%s ",yytext);num_chars+=yyleng;num_ids++;}


%%
main()
{
	yylex();

	printf("\n# of ids = %d ,# of chars = %d ,# of lines = %d ",num_ids , num_chars,num_lines);
}



③代码解释

  • 注意到有两个%%,第一个%%之前的是一些声明和正规式定义
  • 第一个%%和第二个%%之间的是匹配成功后对应的操作
  • 第二个%%之后的是main函数
  • int yylex(void) 调用扫描器,返回标记
  • 变量yytext是指向所匹配的字符串的指针(以NULL结尾)而yyleng是这个字符串的长度
  • atoi是把字符串转换成整型数的一个函数 (表示 ascii to integer)

生成lex.yy.c

新建一个文件夹->重命名为1->放入flex.exe
就像这样:
在这里插入图片描述
在这里插入图片描述
把刚才的dd.l也放进来,就像这样:
在这里插入图片描述
拖动dd.l到flex.exe,就像这样:
在这里插入图片描述
即可自动生成lex.yy.c

生成lex.yy.exe

新建文件夹->重命名为2->把刚才lex.yy.c和libfl.lib放入,就像这样:
在这里插入图片描述
双击文件夹2中的lex.yy.c,用vc打开
点击build:
在这里插入图片描述
选择是:
在这里插入图片描述
接下来关掉即可:
在这里插入图片描述
点击工程->设置->连接
在对象/库模块下面将光标移到最后,输入一个空格,再输入libfl.lib,就像这样:
在这里插入图片描述
确定即可,点击运行:
在这里插入图片描述
现在打开文件夹2,里面多了一个Debug文件夹,Debug文件夹里面已经生成了lex.yy.exe,就像这样:
在这里插入图片描述

编写text文件

新建一个text文件,输入如下内容:

201612345 hello world
wo ai tian an men
hello world i love
201612345

这里面是待分析的内容
将该文件重命名为12
将该文件放在文件夹2下的Debug文件夹中,就像这样:
在这里插入图片描述

大功告成

Win + R->输入cmd即可
输入Debug所在路径,就像这样:
在这里插入图片描述
接着输入 lex.yy.exe<12.txt,回车即可,输出如下:
在这里插入图片描述

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值