词法分析的各类用途1

news/2024/5/19 19:16:53 标签: 编译原理, gcc, flex, 词法分析

                       词法分析的各类用途1

一. 目的:

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

二. 内容:

        写一个lex程序,它读入一个文件,将该文件中的所有的单独或连续的一段空白(包括一个或多个空格、制表、换行组成的空白)都替换成一个空格。

三.要求:

     输入为一个文本文件;输出为新的文本文件,该文件在原文本文件的基础上将单独或连续的空白变成一个空格。

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

四.源代码:

        3.l:

%{
#include <stdio.h> 
#define LT					1
#define	LE					2
#define GT					3
#define	GE					4
#define	EQ					5
#define NE					6
#define WS				  17
#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);}/* 此时词法分析器没有动作,也不返回,而是继续分析。 
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 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 WS: fprintf(yyout, "", 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.p:

 while                (a>1)              a=b;          if         (a<1) a=c;
  
      处理后的t2.p:

while(a>1)a=b;if(a<1)a=c;
      输入t1.p,输出为t2,p,词法分析器将文件t1.p所有的单独或连续的一段空白(包括一个或多个空格、制表、换行组成的空白)都替换成一个空格,并在t2,p中输出。




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

相关文章

Java泛型

0 前言 本文主要是对参考资料的一些整理&#xff0c;以及一些个人见解&#xff0c;难免会有理解错误的地方&#xff0c;欢迎大家指正。 1 概述 Java语言于1995年发布第一个版本&#xff0c;自1991年Sun(1982-2009&#xff0c;被Oracle收购)成立Green项目进行开发以来&#xff0…

java.lang.NoClassDefFoundError: org/apache/tomcat/util/res/StringManager

一个比较老的web项目, IDEA 导入后不能用, 出现了各种问题, 但是, 别人用eclipse 导入就不会有问题, 我折腾了半天, 还是各种问题, 真是郁闷了. 哎, 承认很难配置吧, 遂下载了eclipse, 配置Tomcat ( Tomcat 通过eclipse 自动下载的 版本是7, 具体多少不知道 ) , 果然, 项…

词法分析的各类用途2

词法分析的各类用途2 一. 目的&#xff1a; 使我们明白词法分析的作用不仅仅在于写词法分析器&#xff0c;它还有很多其他用途。 二. 内容&#xff1a; 写一个lex程序&#xff0c;它读入一个c语言文件&#xff0c;将其中所有的float关键字都替换成double关键字。 三&#x…

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;用该文法所表示的语言写的源程序文件。 输出…