博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编译原理:用flex编写词法分析器
阅读量:3931 次
发布时间:2019-05-23

本文共 1392 字,大约阅读时间需要 4 分钟。

要求:

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

写.l文件

① 新建文本文档->重命名为dd.l->保存(dd可以改)

就像这样:
在这里插入图片描述
② 输入以下代码

%{#include 
#include
#define NUM 201612345int 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,回车即可,输出如下:
在这里插入图片描述

你可能感兴趣的文章
回退 服务器 上的 git 仓库 & 删除 服务器上的 git 分支
查看>>
Qt UI布局
查看>>
Git pull 小结
查看>>
QT--组件布局:QSpinBox 和 QSlider
查看>>
使用QT布局管理器
查看>>
禁止改变窗口的大小
查看>>
QT中调用外部程序:QProcess的使用
查看>>
Qt之QProcess 和 c语言对比
查看>>
Git的Windows版本Msysgit的中文乱码解决
查看>>
多系统 grub之ubuntu的 grub
查看>>
恢复Ubuntu默认的面板
查看>>
repo的小结
查看>>
permission和uses-permission的区别
查看>>
Android项目中把bin文件夹里面的.apk文件删除,怎么让它再生成
查看>>
VC6.0的 错误解决办法 -- 小结
查看>>
shell中$*,$@,$# 的区别
查看>>
git错误解决 -- 小结
查看>>
shell里 截取字符串
查看>>
Imagemagick 对图片 大小 和 格式的 调整
查看>>
linux下如何让应用程序到我指定的目录下找库文件
查看>>