编译原理 - 用FLEX自动构造词法分析程序

这篇博客主要介绍了如何运用Flex工具来自动构造词法分析程序,包括实验目的、实验平台、基础内容和附加任务。实验内容涉及LEX源程序的编写、编译和运行,以及在C源程序中实现行号添加、空白符压缩、关键字转大写、标识符转小写、指数常量转换等操作。
部署运行你感兴趣的模型镜像

一、实验目的

1.  学习使用词法分析程序自动构造工具Flex

2.  熟悉LEX源程序语法

3.  掌握词法分析程序的自动构造方法

二、实验平台

Windows+ Flex

 三、基础内容

1.  实现以下步骤, 掌握Flex的工作过程

i.         构造 LEX 源程序, 例如命名为 Test.Lex 

ii.        编译 LEX 源程序, 生成 C 语言词法分析程序 lex.yy.c, 步骤如下: 

在 DOS 命令提示符下执行编译  flex  Test.Lex 得到目标文件 lex.yy.c   iii. 在 VC 中编译lex.yy.c,产生可执行程序lex.yy.exe 

iv. 运行生成的可执行文件 lex.yy lex.yy  < InputFile 

2.  测试目录SRC_FLEX中的范例程序,了解其功能及实现。

 

四、附加内容

 输入一个 C 源程序文件, 用 FLex 实现以下任务

a)        添加行号。

b)        将文件中每个非空的空白符号序列替换为单个空格。

c)        将文件中所有关键字转换为大写字母。

d)        将文件中所有标识符转换为小写字母,且以下划线开头。

e)        将文件中所有指数形式的常量转换为小数形式。

 例如:        2.5e3被转换为   2500                 3.7e-2  被转换为        0.037 f) 将转换后的文件存入另一个文件。


声明部分

%%

转换规则

%%

辅助函数

 

Lex程序的每个转换规则的形式如下:

模式{动作}

 

%{%} 括号中间的所有内容将直接复制到lex.yy.c中。

一个lex程序的结构如下:

  • yytext 是一个指向词素开头的指针
  • yyleng存放刚找到的词素的长度

源代码:

Demo.lex
%{
#include<stdio.h>
FILE* f1;
int n =1;
%}

keywords auto|break|case|char|const|continue|defaultdo|double|else|enum|extern|float|for|goto|if|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|union|unsigned|void|volatile|while
id [a-zA-Z][a-zA-Z0-9]*
number [0-9]
enumber {number}+(\.{number}+)?e([+-])?{number}+
space [\ \t]+

%%

{space} {fprintf(f1," ");}

{keywords} {
		int i = 0;
		while(i<yyleng && yytext[i]>='a' && yytext[i]<='z')
		{
		yytext[i]-=32;
		i++;
	   	 }
		fprintf(f1,"%s",yytext);
		}

{id} {
	int i =0 ;
	while(i<yyleng && yytext[i]>='A' && yytext[i]<='Z')
	{
	yytext[i]+=32;
		i++;	
	}
	fprintf(f1,"_%s",yytext);
	}

{enumber} {
	float f = atof(yytext);	
	fprintf(f1,"%f",f);	
}

[^\n] {fprintf(f1,"%s",yytext);}
\n {
	fprintf(f1,"%s%5d  ",yytext,n++);
	}

%%

int yywrap(void)
{
  return 1;
}

main()
{
  f1 = fopen("demo.txt","a+");
  fprintf(f1,"%5d  ",n++);
  yylex();
  fprintf(f1,"\n");
  fclose(f1);
}


运行:


用flex编译


将生成的lex.yy.c编译

用lex.yy.exe 打开一个文件


规则化的文件:

 


您可能感兴趣的与本文相关的镜像

GPT-SoVITS

GPT-SoVITS

AI应用

GPT-SoVITS 是一个开源的文本到语音(TTS)和语音转换模型,它结合了 GPT 的生成能力和 SoVITS 的语音转换技术。该项目以其强大的声音克隆能力而闻名,仅需少量语音样本(如5秒)即可实现高质量的即时语音合成,也可通过更长的音频(如1分钟)进行微调以获得更逼真的效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值