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

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

写.l文件

① 新建文本文档->重命名为dd.l->保存(dd可以改)
就像这样:
编译原理:用flex编写词法分析器_第1张图片
② 输入以下代码

%{
#include 
#include 
#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
就像这样:
编译原理:用flex编写词法分析器_第2张图片
编译原理:用flex编写词法分析器_第3张图片
把刚才的dd.l也放进来,就像这样:
编译原理:用flex编写词法分析器_第4张图片
拖动dd.l到flex.exe,就像这样:
编译原理:用flex编写词法分析器_第5张图片
即可自动生成lex.yy.c

生成lex.yy.exe

新建文件夹->重命名为2->把刚才lex.yy.c和libfl.lib放入,就像这样:
编译原理:用flex编写词法分析器_第6张图片
双击文件夹2中的lex.yy.c,用vc打开
点击build:
编译原理:用flex编写词法分析器_第7张图片
选择是:
编译原理:用flex编写词法分析器_第8张图片
接下来关掉即可:
编译原理:用flex编写词法分析器_第9张图片
点击工程->设置->连接
在对象/库模块下面将光标移到最后,输入一个空格,再输入libfl.lib,就像这样:
编译原理:用flex编写词法分析器_第10张图片
确定即可,点击运行:
编译原理:用flex编写词法分析器_第11张图片
现在打开文件夹2,里面多了一个Debug文件夹,Debug文件夹里面已经生成了lex.yy.exe,就像这样:
编译原理:用flex编写词法分析器_第12张图片

编写text文件

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

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

这里面是待分析的内容
将该文件重命名为12
将该文件放在文件夹2下的Debug文件夹中,就像这样:
编译原理:用flex编写词法分析器_第13张图片

大功告成

Win + R->输入cmd即可
输入Debug所在路径,就像这样:
编译原理:用flex编写词法分析器_第14张图片
接着输入 lex.yy.exe<12.txt,回车即可,输出如下:
编译原理:用flex编写词法分析器_第15张图片

你可能感兴趣的:(编译技术)