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

📄 cffx.cpp

📁 编译原理词法分析的一个小代码
💻 CPP
字号:
#include <stdio.h>
#include <string.h>
#include <iostream.h>
void outprint(int a,char ch[20]);
			
main()
{
	
	FILE *in;
	char ch,infile[10],ah[20],bh[20];
	int k,m,h=1;
	for(int i=0;i<20;i++)
	{
		ah[i]='\0';
	}
	for(i=0;i<20;i++)
	{
		bh[i]='\0';
	}
	printf("请输入源文件的名称: \n");
	scanf("%s",infile);
	if((in=fopen(infile,"r"))==NULL)
	{
		printf("不能打开源文件!\n");
		return 0;
	}
	printf("\n对%s源文件进行词法分析所得结果如下:\n\n",infile);
	cout<<"第一行程序的语法分析如下:"<<endl;
	ch=fgetc(in);
	while(ch!=EOF)
	{
		switch(ch)
		{
		case '\n':cout<<"第"<<++h<<"行程序的词法分析如下:"<<endl;
			  
				  ch=fgetc(in);
			  break;
		case ' ':ch=fgetc(in);break;//删除空格;
		case '(':outprint(28,"(");ch=fgetc(in);break;//识别左括号
		case ')':outprint(29,")");ch=fgetc(in);break;//识别右括号
		case ';':outprint(18,";");ch=fgetc(in);break;//识别分号
		case '+':outprint(13,"+");ch=fgetc(in);break;//识别加号
		case '-':outprint(14,"-");ch=fgetc(in);break;//识别-号
		case '*':outprint(15,"*");ch=fgetc(in);break;//识别*号
		case '/':outprint(16,"/");ch=fgetc(in);break;//识别/号
		case '=':outprint(25,"=");ch=fgetc(in);break;//识别等号
        case ',':outprint(29,",");ch=fgetc(in);break;//识别逗号
		case '#':outprint(0,"#");ch=fgetc(in);break;//识别#号
        case '.':outprint(28,".");ch=fgetc(in);break;//识别句号
		case '{':
			do{
				ch=fgetc(in);
				if(ch=='\n')++h;
				}
			while(ch!='}'); 
			ch=fgetc(in);
			break;
		case '<':                                 //该case语句识别<=,<>,<
			ch=fgetc(in);
			     
			if(ch=='>') 
				 {
					 outprint(21,"<>");
					 ch=fgetc(in);
				 }
		    else if(ch=='=')
				 {
					 outprint(22,"<=");
					 ch=fgetc(in);
				 }
								   
			else outprint(20,"<");
								   break;
		case '>':
			ch=fgetc(in);
			if(ch=='=') 
			{
				outprint(24,">=");
				ch=fgetc(in);
			}
			                  
			else outprint(23,">");
							  
			break;
		case ':': //对:=与:的识别
			ch=fgetc(in);
			if(ch=='=') 
			{
				outprint(17,":=");
				ch=fgetc(in);
			}
			else outprint(10,":");
			break;

//其中,保留字有if,then,else,end,repeat,until,read,write
		default:if(ch>='0'&&ch<='9')
				{
					k=0;
					do
					{
						ah[k++]=ch;
						ch=fgetc(in);
					}
					while(ch>='0'&&ch<='9');
					outprint(11,ah);//如果识别到一串数字,则标志为11
					/*for(int i=0;i<20;i++)
					{
						ah[i]='\0';
					}*/
				}
				else 
				{
					if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
					{
						m=0;
						bh[m++]=ch;
						ch=fgetc(in);
						while(ch>='0'&&ch<='9'||ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
						{
							bh[m++]=ch;
							ch=fgetc(in);
						}
						strlwr(bh);
						if(strcmp(bh,"if")==0) outprint(1,"if");
						else if(strcmp(bh,"then")==0) outprint(2,"then");
						else if(strcmp(bh,"else")==0) outprint(3,"else");
						else if(strcmp(bh,"end")==0) outprint(4,"end");
						else if(strcmp(bh,"repeat")==0) outprint(5,"repeat");
						else if(strcmp(bh,"until")==0) outprint(6,"until");
						else if(strcmp(bh,"read")==0) outprint(7,"read");
						else if(strcmp(bh,"write")==0) outprint(8,"write");
						else if(strcmp(bh,"iostream")==0) outprint(9,"iostream");
						else outprint(10,bh);
						for(i=0;i<20;i++)
						{
						bh[i]='\0';
						}
					}
					else 
					{
						printf("%c is Error!\n",ch);
						ch=fgetc(in);
					}
				}
		}
	}
	fclose(in);
	return 0;
}

void outprint(int a,char *ch)
{
	printf("(%d,%s)\n",a,ch);
}

⌨️ 快捷键说明

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