词法分析的各类用途2

news/2024/5/19 18:18:38 标签: gcc, C++, flex, cygwin, 词法分析

                        词法分析的各类用途2

一.  目的:

   使我们明白词法分析的作用不仅仅在于写词法分析器,它还有很多其他用途。

二.  内容:

   写一个lex程序,它读入一个c语言文件,将其中所有的float关键字都替换成double关键字。

三.要求:

    输入为一个C语言源文件;输出为新的C语言源文件,该文件在原输入的基础上将float关键字替换成double关键字。

        注意:必须是float关键字,如果是afloat或者floata这样的id不可以被替换为adouble和doublea。

        在cygwin下用flexgcc工具将实验调试通过,并写出测试例测试正确性。

四.源代码:

        4.l:

%{
#include <stdio.h> 
#define LT					1
#define	LE					2
#define GT					3
#define	GE					4
#define	EQ					5
#define NE					6
#define WS			    15
<strong>#define DOUBLE			16
#define FLOAT			  17</strong>
#define WHILE				18
#define	DO					19
#define ID          20
#define NUMBER      21
#define RELOP       22
#define NEWLINE     23
#define ERRORCHAR   24

int yylval;
%}

delim		[ \t \n]
ws			{delim}+
letter	[A-Za-z]
digit		[0-9]
id			{letter}({letter}|{digit})*
number	{digit}+(\.{digit}+)?(E[+-]?{digit}+)?
%%
{ws}	          {return (WS);/* 此时词法分析器没有动作,也不返回,而是继续分析。 
<strong>float           {return (FLOAT);}
double          {return (DOUBLE);}</strong>
while	          {return (WHILE);}
do		          {return (DO);}
{id}	          {yylval = installID (); return (ID);}
{number}	      {yylval = installNum (); return (NUMBER);}
"<"	            {yylval = LT; return (RELOP);}
"<="	          {yylval = LE; return (RELOP);}
"="	            {yylval = EQ; return (RELOP);}
"<>"	          {yylval = NE; return (RELOP);}
">"	            {yylval = GT; return (RELOP);}
">="	          {yylval = GE; return (RELOP);}
.								{yylval = ERRORCHAR; return ERRORCHAR;}
 /*.匹配除换行之外的任何字符,一般可作为最后一条翻译规则。*/
%%
int installID () {
  /* 把词法单元装入符号表并返回指针。*/
	return ID;
}
int installNum () {
	/* 类似上面的过程,但词法单元不是标识符而是数 */
  return NUMBER;
}
int yywrap (){
  return 1;
}
void writeout(int c){
  switch(c){
  	case ERRORCHAR: fprintf(yyout, "%s", yytext);break;
  	case WS: fprintf(yyout, "%s", yytext);break;
  	<strong>case DOUBLE: fprintf(yyout, "%s", yytext);break; 
    case FLOAT: fprintf(yyout, "double", yytext);break;</strong> 
  	case RELOP: fprintf(yyout, "%s", yytext);break;  	  
    case WHILE: fprintf(yyout, "%s", yytext);break;
    case DO: fprintf(yyout, "%s", yytext);break;
    case NUMBER: fprintf(yyout, "%s", yytext);break;
    case ID: fprintf(yyout, "%s", yytext);break;
    case NEWLINE: fprintf(yyout, "\n");break;
    default:break;
  }
  return;
}

int main (int argc, char ** argv){
	int c,j=0;
	if (argc>=2){
	  if ((yyin = fopen(argv[1], "r")) == NULL){
	    printf("Can't open file %s\n", argv[1]);
	    return 1;
	  }
	  if (argc>=3){
	    yyout=fopen(argv[2], "w");
	  }
	}
	while (c = yylex()){
		writeout(c);
		j++;
		if (j%5 == 0) writeout(NEWLINE);
	}
	if(argc>=2){
	  fclose(yyin);
	  if (argc>=3) fclose(yyout);
	}
	return 0;
}<strong>
</strong>

五.结果及分析:

       处理前的t1.c:

#include<stdio.h>
void main()
{
	  int i,j;
	  <strong>float a,b;
	 double c;
	 int afloat,floatb;</strong>
	  i=1;
	  j=i;
	  a=b=0;
	  while((j+i)<100)
	  {
		a+=b;
		b++;
	  }
}

       处理后的t2.c:

#include<stdio.h>
void main()
{
	int i,j;
	<strong>double a,b;
	double c;
	int afloat,floatb;</strong>
	i=1;
	j=i;
a=b=0;
	while((j+i)<100)
{
		a+=b;
b++;
	} 
}

         输入t1.c,输出为t2,c,词法分析器将文件t1.c文件中的float关键字替换成double关键字,并在t2,p中输出。注意上述t2.c中的输出结果:t1.c中的float关键字在t2.c中变为double关键字,而ID  afloat,floatb中的float则未被替换。


http://www.niftyadmin.cn/n/835286.html

相关文章

WPF ListBoxItem模板中添加CheckBox选中问题

原文:WPF ListBoxItem模板中添加CheckBox选中问题是这样的,需要一个ListBox来展示照片,并添加一个选中的CheckBox.这就需要对ListBox的ItemTemplate的DataTemplate进行定制.添加一个Image和一个CheckBox. 大概是这样子的.<Setter Property"ItemTemplate"><S…

Fescar 发布 0.3.0 版本, 支持 Eureka 注册中心

百度智能云 云生态狂欢季 热门云产品1折起>>> Fescar 是一款开源的分布式事务解决方案&#xff0c;提供高性能和简单易用的分布式事务服务。 本次更新内容如下&#xff1a; 特性 [#510] 新增 Eureka 注册中心支持[#498] 实现带全局锁的本地事务模式并解决本地事务隔…

验证Yacc的使用

验证Yacc的使用 一. 目的&#xff1a; 熟悉语法分析器生成工具Yacc的使用&#xff0c;并学会在cygwin下使用bison工具编译Yacc文法说明文件。学习如何使用lex和yacc合作进行语法分析。 二. 内容&#xff1a; 根据给出的calculator例子&#xff08;calculator0,calculator1,cal…

在线运行python代码-python代码运行助手

https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432523496782e0946b0f454549c0888d05959b99860f000转载于:https://www.cnblogs.com/Gaoqiking/p/10560295.html

基于Appel-Tiger编译器前端的简易语法分析器

基于Appel-Tiger编译器前端的简易语法分析器 说明&#xff1a; 本例修改自Appel的Tiger编译器前端。 本例给出某文法的一个简单的语法分析器。它是在parser0的基础上添加语义动作而得到的。 输入&#xff1a;用该文法所表示的语言写的源程序文件。 输出…

Matlab图像处理函数汇总

Matlab图像处理函数汇总 1.图像的变换: ① fft2&#xff1a;fft2函数用于数字图像的二维傅立叶变换&#xff0c;如&#xff1a;iimread(104_8.tif);jfft2(i);</span>② ifft2: ifft2函数用于数字图像的二维傅立叶反变换&#xff0c;如&#xff1a; iimread(104_8.tif);jf…

Consul集群部署

Consulconsul是一种提供服务发现的工具,类似于zookeeper和etcd。但是它也有一些自己的一些特性&#xff1a;1:service discovery&#xff1a;consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易&#xff0c;一些外部服务&#xff0c;例如saas提供的也可以一样注册。2:he…

图像频域变换及应用

图像频域变换及应用 1.名词解释&#xff1a; &#xff08;1&#xff09;空间域&#xff1a;英文&#xff1a;spatial domain。释文&#xff1a;又称图像空间(imagespace)。由图像像元组成的空间。在图像空间中以长度(距离)为自变量直接对像元值进行处理称为空间域处理。 &#…