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

📄 parse.c

📁 简单的词法分析程序,识别有限的字符. 编译原理的作业,仅供参考
💻 C
字号:

/* 词法分析程序*/
/*作者:FayUo*/
/*程序名:parse.exe*/
/* 判断函数 IsDigit(char)是数字; IsLetter(char)是字母开头的; FindKeyWords(array)搜索关键字表,返回类型码; parse(FILE *fpin,FILE *fpout)词法分析主程序*/
/*BackSpace(FILE *fp,char *ch) 退格,并且使得ch为空*/
/*编译通过后在命令行下输入: parse [yourname.txt]  否则程序认为没有输入文件而退出.输出文件为C根目录下output.txt*/

#include "stdio.h"


 


#define MAX 255
#define TRUE 1
#define FALSE 0

int IsDigit(char ch)
	{
		if(ch>='0'&&ch<='9')
			return TRUE;
		else 
			return FALSE;
	}
int IsLetter(char ch)
	{
		if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
			return TRUE;
		else 
			return FALSE;
	}
BackSpace(FILE *fp,char ch)
	{ 
		fseek(fp,-1L,1);
		ch='';
	}
Cleararray(char *arr)
{
	int i=0;
	for(i=0;i<=MAX;i++)
		arr[i]='\0';
}
		 
char FindKeyWords(char *arr)
	{
		if(strcmp(arr,"while")==0)
			return '1';
		if(strcmp(arr,"if")==0)
			return '2';
		if(strcmp(arr,"else")==0)
			return '3';
		if(strcmp(arr,"switch")==0)
			return '4';
		if(strcmp(arr,"case")==0)
			return '5';
		else 
			return '6';
	}
int parse(FILE *fpin,FILE *fpout)
	{	
		char ch,arr[MAX],token;
		int i=0;
		while(1)		
		{
		ch=fgetc(fpin);
		if(ch==EOF) break;

			else if(IsDigit(ch))
			{
				while(IsDigit(ch))
				{
					
					arr[i++]=ch;
					ch=fgetc(fpin);
				}
				arr[i+1]='\0';
				BackSpace(fpin,ch);
				{
					fprintf(fpout,"(%d,%s)|",7,arr);
					
				}
				Cleararray(arr);
				i=0;
			}
				else if(IsLetter(ch))
			{
				while(IsLetter(ch)||IsDigit(ch))
				{	
					
					arr[i++]=ch;
					ch=fgetc(fpin);
					
					
				}
				arr[i+1]='\0';
				printf("++++");
				BackSpace(fpin,ch);
				token=FindKeyWords(arr);
				printf("****");
				if(token=='1')
				{
					fprintf(fpout,"(%c, )|",token);
					Cleararray(arr);
					i=0;
				}
				if(token=='2') 
				{
					fprintf(fpout,"(%c, )|",token);
					Cleararray(arr);
					i=0;
				} 
				if(token=='3') 
				{
					fprintf(fpout,"(%c, )|",token);
					Cleararray(arr);
					i=0;
				} 
				if(token=='4') 
				{
					fprintf(fpout,"(%c, )|",token);
					Cleararray(arr);
					i=0;
				} 
				if(token=='5') 
				{
					fprintf(fpout,"(%c, )|",token);
					Cleararray(arr);
					i=0;
				} 
				if(token=='6') {
															fprintf(fpout,"(%c,%s)|",token,arr);	
															Cleararray(arr);
															i=0;
														}
				
				
				
			}	
		else if(ch=='+')
			fprintf(fpout,"%c%d,%c%c|",'(',8,' ',')');
		else if(ch=='-')
			fprintf(fpout,"%c%d,%c%c|",'(',9,' ',')');
		else if(ch=='*')
			fprintf(fpout,"%c%d,%c%c|",'(',10,' ',')');
		
		else if(ch=='<')
					{
						ch=fgetc(fpin);
						if(ch=='=')
							fprintf(fpout,"%c%d,%s%c|",'(',11,"LE",')');
						else
							{fprintf(fpout,"(%d,LT)|",11); BackSpace(fpin,ch);}
					}
		
		else if(ch=='=')
					{
						ch=fgetc(fpin);
						if(ch=='=')
							fprintf(fpout,"%c%d,%c%c|",'(',11,"EQ",')');
						else
							{fprintf(fpout,"(%d, )|",12); BackSpace(fpin,ch);}
					}
		else if(ch==';')
			fprintf(fpout,"%c%d,%c%c|",'(',13,' ',')');
		else if(ch=='#')
			fclose(fpout);
		}
	}

void main(int argc,char *argv[])
{
	FILE *fpin,*fpout;
	if(argc==1)
	{	
		printf("You did not open any file, Please press any key to exit");
		getch();
		exit(0);/*正常退出*/
	}
	if((fpin=fopen(argv[1],"r"))==NULL)
	{
		printf("cannot open this file,press any key to exit\n");
		getch();
		exit(1);/*异常退出*/
	}
	if((fpout=fopen("c:\\output.txt","w"))==NULL)
	{
		printf("cannot creat %s,please press anykey to exit\n");
		getch();
		exit(1);/*异常退出*/
	}
	printf("Let's go~\n");
	parse(fpin,fpout);
	fclose(fpin);
	fclose(fpout);
	printf("OK!!  @^_^@");
}

⌨️ 快捷键说明

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