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

📄 chifayuchuli.cpp

📁 编译原理的词法预处理
💻 CPP
字号:

// 这个程序是词法分析程序
# include<stdio.h>
# include<stdlib.h>


// 错误显示
void error()
{
	printf("\nError!!");
}


//词法分析
accidence_analyse_1(char *in_file,char *out_file)
{ 
	FILE *in,*out;
	char ch,str[20];
	int i,j;
	if((in=fopen(in_file,"r"))!=NULL && (out=fopen(out_file,"w"))!=NULL)  //打开输入文件输出文件
	{
		ch=fgetc(in);
		while(!feof(in))
		{
			if(ch==32 || ch==10)   // 空格和回车的处理
			{
				ch=fgetc(in);
				continue;
			}
			if(ch==';')  //分号的处理
			{
				ch=fgetc(in);
				if(ch==10)
				{
					ch=fgetc(in);
					continue;
				}
				else
				{
                    fputc(';',out);
				    fputc(ch,out);
				    fputc('@',out);
				    ch=fgetc(in);
				    continue;
				}
			}
			if(ch=='=')  // 等号的处理
			{
				ch=fgetc(in);
				if(ch=='=')
				{
					fputc('=',out);
                    fputc('=',out);
					fputc('@',out);
					ch=fgetc(in);
					continue;
				}
				else if((ch>='a' && ch<='z') ||(ch>='A' && ch<='Z') || ch=='('||(ch>='0'&&ch<='9'))
				{
					fputc('=',out);
					fputc('@',out);
					continue;
				}
				else 
					error();
			}
			if(ch=='+') //“+”和“++”的处理
			{
				ch=fgetc(in);
				if(ch=='+')
				{
					fputc('+',out);
                    fputc('+',out);
					fputc('@',out);
					ch=fgetc(in);
					continue;
				}
				else
				{   
					fputc('+',out);
					fputc('@',out);
					continue;
				}
		
			}
			if(ch=='-') //“-”和“--”的处理
			{
				ch=fgetc(in);
				if(ch=='-')
				{
					fputc('-',out);
                    fputc('-',out);
					fputc('@',out);
					ch=fgetc(in);
					continue;
				}
                else
				{   
					fputc('-',out);
					fputc('@',out);
					continue;
				}
			}
			 if(ch=='!') //“!=”的处理
			{
				ch=fgetc(in);
				if(ch=='=')
				{
					fputc('!',out);
                    fputc('=',out);
					fputc('@',out);
					ch=fgetc(in);
					continue;
				}
				else
				{
				    error();
				}
			}
            if(ch=='>') //“>”和“>=”的处理
			{
				ch=fgetc(in);
				if(ch=='=')
				{
					fputc('>',out);
                    fputc('=',out);
					fputc('@',out);
					ch=fgetc(in);
					continue;
				}
				else
				{
					fputc('>',out);
				    fputc('@',out);
					continue;
				}
			}
			if(ch=='<')    //“<”和“<=”的处理
			{
				ch=fgetc(in);
				if(ch=='=')
				{
					fputc('<',out);
                    fputc('=',out);
					fputc('@',out);
					ch=fgetc(in);
					continue;
				}
				else
				{
					fputc('<',out);
				    fputc('@',out);
					continue;
				}
			}
			if(ch=='*'||ch=='/'||ch=='%'||ch=='('||ch==')'||ch=='{'||ch=='}'||ch==',')   //“*”、“╱”、“()”、“{}”和“%”的处理
			{
				fputc(ch,out);
				fputc('@',out);
				ch=fgetc(in);
				continue;
			}
			if(ch=='&') //“&&”(与)的处理
			{
				ch=fgetc(in);
				if(ch=='&')
				{
					fputc('&',out);
                    fputc('&',out);
					fputc('@',out);
					ch=fgetc(in);
					continue;
				}
				else
				{
				    error();
				}
			}
			if(ch=='|') //“||”(或)的处理
			{
				ch=fgetc(in);
				if(ch=='|')
				{
					fputc('|',out);
                    fputc('|',out);
					fputc('@',out);
					ch=fgetc(in);
					continue;
				}
				else
				{
				    error();
				}
			}
			//保留字、标识符的处理
            i=0;
			str[i]=ch;
			ch=fgetc(in);
			while(ch!='+' && ch!='-' && ch!='*' && ch!='/' && ch!='(' && ch!=')' && ch!=',' && ch!=';' && ch!='%'&& ch!='=' && ch!='>' && ch!='<' && ch!=32 && ch!=10 && !feof(in))
			{
				i++;
				str[i]=ch;
				ch=fgetc(in);
			}
			j=0;
			while(j<=i)
			{
				fputc(str[j],out);
				j++;
			}
			fputc('@',out);
		}
	}
	fclose(in);
    fclose(out); //关文件 
}





void main()
{
  accidence_analyse_1("c3a.txt","c3b.txt");
}



⌨️ 快捷键说明

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