⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 by1.cpp

📁 一个词法分析器的程序
💻 CPP
字号:
#include<stdio.h>
#include<ctype.h>
#include<string.h>

#define BEGIN 1
#define END 2
#define IF 3
#define THEN 4
#define ELSE 5
#define FOR 6
#define DO 7
#define WHILE 8
#define AND 9
#define OR 10
#define NOT 11
#define ID 12
#define INT 13
#define PLUS 14		//+
#define MINUS 15	//-
#define MULT  16    //*
#define FEN   17    //;
#define LK 18		//(
#define RK 19       //)
#define LT 20		//<
#define LE 21		//<=
#define EQ 22		//=
#define NE 23		//<>
#define GT 24		//>
#define	GE 25		//>=
#define MH 26		//:
#define FZ 27		//:=
#define XIE 28		///
#define ZHX 29		///*


char token[30];
int exp_flag=0;
FILE *fpwr;

int lookup(char *pt){
	int i,j;
	int flag=0;
	char low[6];
	//字符串数组
    char str[11][6]={{"begin"},{"end"},{"if"},{"then"},{"else"},{"for"},{"do"},{"while"},{"and"},{"or"},{"not"}};
    
	for(j=0;j<5;j++){
       low[j]=tolower(*(pt+j));
    }
	low[j]='\0';		//对前五个字符进行小写处理
	
	for(i=0;i<11;i++){
	if(strcmp(low,str[i])==0)
		flag=i+1;
	}
	return flag;

}

void out(int bianma,char *ptoken){
	if(exp_flag==0){
		fputc('(',fpwr);
		fprintf(fpwr,"%d,%s",bianma,ptoken);
		fputc(')',fpwr);
	}

}



void scanner_ex(FILE *fp){
char ch;
char cht;
int i,c;

ch=fgetc(fp);

while(ch!='#'){
if(isalpha(ch))		//字母
{
	token[0]=ch;
    ch=fgetc(fp);
    i=1;
	while(isalnum(ch))		//字母或数字
	{token[i]=ch;  i++;
     ch=fgetc(fp);
	}
	token[i]='\0';
	fseek(fp,-1,1);		//retract
	c=lookup(token);    //lookup
	if(c==0)            //没查到
		out(ID,token);
	else out(c," ");    //已查到
}
else if(isdigit(ch))
{
	token[0]=ch;
	ch=fgetc(fp);
	i=1;
    while(isdigit(ch))
	{
		token[i]=ch; i++;
        ch=fgetc(fp);
	}
	token[i]='\0';
    fseek(fp,-1,1);		//retract
	out(INT,token);
}
else
   switch(ch)
{
	case'<': ch=fgetc(fp);
		     if(ch=='=')
				 out(LE," ");
			 else if(ch=='>')
				 out(NE," ");
			     else
				 {fseek(fp,-1,1);
				 out(LT," ");
				 }
			 break;
	case'=':out(EQ," ");
		    break;
    case'>':ch=fgetc(fp);
            if(ch=='=')
				 out(GE," ");
			else
				 {fseek(fp,-1,1);
				 out(GT," ");
				 }
			break;
	case':':ch=fgetc(fp);
            if(ch=='=')
				 out(FZ," ");
			else
				 {fseek(fp,-1,1);
				 out(MH," ");
				 }
			break;
    case'/':ch=fgetc(fp);
            if(ch=='*')
				 exp_flag=1;
			else
				 {fseek(fp,-1,1);
				 out(XIE," ");
				 }
			break;
	case'+':out(PLUS," ");
		    break;
	case'-':out(MINUS," ");
		    break;
	case'*':
			out(MULT," ");
			if(exp_flag==1){
			cht=fgetc(fp);
			if(cht=='/')
				exp_flag=0;}
		    break;
	case';':out(FEN," ");
		    break;
	case'(':out(LK," ");
		    break;
	case')':out(RK," ");
		    break;

//	default: report_error();
		    // break;
}//switch
ch=fgetc(fp);

}//while

}

void main(){
FILE *fpt;

if((fpt=fopen("test.txt","r"))==NULL)
  printf("cannot open file\n");
else{
  if((fpwr=fopen("write.txt","w"))==NULL)
	printf("cannot open file write\n");
  else
  scanner_ex(fpt);
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -