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

📄 scanner.c

📁 北京航空航天大学计算机系要求的编译器大作业。大概6000行代码。
💻 C
字号:
/***************************************
By BHU 35060122 Peng Hui;
2008.02
description:
A small compiler to translate a C program to 80X80 Assembly Code
***************************************/

#include"Global.h"

void scan()
{
	char readin[len];
	int i = 0;
	char c;
	int lineNo = 1;
	

	int  j = 0;

	c = fgetc(fin);
	

	//fprintf(fout,"LineNo\tCat:\tID\n\n");

	while(!feof(fin))
	{
		// 处理空格
		if(isspace(c))
		{
			if(c == '\n')
				lineNo++;
			c = fgetc(fin);
		}

		//处理注释//
		else if(c == '/')
		{
			c = fgetc(fin);
			if( c == '/')
			{
				while(c != '\n')
					c = fgetc(fin);
			}

			else if(c == '*')
			{
				c = fgetc(fin);
				while(!feof(fin))
				{
					if(c == '\n')
						lineNo++;
					else if(c == '*')
					{
						c = fgetc(fin);
						if(c == '/')
						{
							c = fgetc(fin);
							break;		
						}
					}
					c = fgetc(fin);
				}
			}
			else
			{
				fprintf(fout,"%d\tDIV_OP\t/\n",lineNo);
				fprintf(temp,"DIV_OP\t/\n");
				//fprintf(errlog,"@%d Illegal character %c\n",lineNo,c);
				//c = fgetc(fin);
			}
		}

		//处理整数
		else if(isdigit(c))
		{
			if(c != '0')
			{
				readin[i++] = c;
				c = fgetc(fin);
				while(isdigit(c) && !feof(fin))
				{
					readin[i++] = c;
					c = fgetc(fin);
				}
			}

			else if(c == '0')
			{
				readin[i++] = c;
				c = fgetc(fin);
			}
			readin[i] = '\0';
			fprintf(fout,"%d\tINTEGER\t%s\n",lineNo,readin);
			fprintf(temp,"INTEGER\t%s\n",readin);
			i = 0;
		}

		/*
		*处理关键字和标识符
		*/

		else if(isalpha(c) || c == '_')
		{
			if(isalpha(c))
				readin[i++] = tolower(c);
			else
				readin[i++] = c;
			c = fgetc(fin);
			while(1)
			{
				if(feof(fin) || !(isalpha(c) || c == '_' || isdigit(c)) )
					break;
				if(isalpha(c))
					readin[i++] = tolower(c);
				else
					readin[i++] = c;
				c = fgetc(fin);
			}
			readin[i]='\0';
			
			for(j = 0; j < 10; j++)
			{
				if(strcmp(readin,keywords[j]) == 0)
				{
					fprintf(fout,"%d\t%s\t%s\n",lineNo,keywords[j],readin);
					fprintf(temp,"%s\t%s\n",keywords[j],readin);
					break;
				}
			}

			if(j == 10)
			{
				fprintf(fout,"%d\tID\t%s\n",lineNo,readin);
				fprintf(temp,"ID\t%s\n",readin);
			}

			i = 0;
		}

		/*
		* 处理字符串
		*/

		else if(c == '\"')
		{
			//readin[i++] = c;
			c = fgetc(fin);
			while(c!= '\"' && !feof(fin))
			{
				readin[i++] = c;
				c = fgetc(fin);
			}
			
			c = fgetc(fin);
			readin[i] = '\0';
			
			fprintf(fout,"%d\tSTRING\t%s\n",lineNo,readin);
			fprintf(temp,"STRING\t%s\n",readin);
			i = 0;
		}
		

		/*
		*乘号
		*/
		else if(c == '*')
		{
			fprintf(fout,"%d\tMUL_OP\t%c\n",lineNo,c);
			fprintf(temp,"MUL_OP\t%c\n",c);
			c = fgetc(fin);
		}	
		/*
		*除号
		*/
		else if(c == '/')
		{
			fprintf(fout,"%d\tDIV_OP\t%c\n",lineNo,c);
			fprintf(temp,"DIV_OP\t%c\n",c);
			c = fgetc(fin);
		}	

		/*
		*加号
		*/

		else if(c == '+')
		{
			fprintf(fout,"%d\tADD_OP\t%c\n",lineNo,c);
			fprintf(temp,"ADD_OP\t%c\n",c);
			c = fgetc(fin);
		}
		
		/*
		*减号
		*/

		else if(c == '-')
		{
			fprintf(fout,"%d\tSUB_OP\t%c\n",lineNo,c);
			fprintf(temp,"SUB_OP\t%c\n",c);
			c = fgetc(fin);
		}
		/*
		*赋值和等于号
		*/
		else if(c == '=')
		{
			c = fgetc(fin);
			if(c == '=')
			{
				fprintf(fout,"%d\tROP\t==\n",lineNo);
				fprintf(temp,"ROP\t==\n");
				c = fgetc(fin);
			}

			else
			{
				fprintf(fout,"%d\tASSIGN\t=\n",lineNo);
				fprintf(temp,"ASSIGN\t=\n");
			}
			
		}
		/*
		*		大于 && 大于等于
		*/
		else if(c == '>')
		{
			c = fgetc(fin);
			if(c == '=')
			{
				fprintf(fout,"%d\tROP\t>=\n",lineNo);
				fprintf(temp,"ROP\t>=\n");
				c = fgetc(fin);
			}
			else
			{
				fprintf(fout,"%d\tROP\t>\n",lineNo);
				fprintf(temp,"ROP\t>\n");
			}
		}
		

		/*
		*	小于 && 小于等于
		*/
		else if(c == '<')
		{
			c = fgetc(fin);
			if(c == '=')
			{
				fprintf(fout,"%d\tROP\t<=\n",lineNo);
				fprintf(temp,"ROP\t<=\n");
				c = fgetc(fin);
			}
			else
			{
				fprintf(fout,"%d\tROP\t<\n",lineNo);
				fprintf(temp,"ROP\t<\n");
			}
		}
		

		/*
		*不等于
		*/
		else if(c == '!')
		{
			c = fgetc(fin);
			if(c = '=')
			{
				fprintf(fout,"%d\tNE\t!=\n",lineNo);
				fprintf(temp,"NE\t!=\n");
				c = fgetc(fin);
			}
			else
			{
				fprintf(fout,"@%d Illegal character   !\n",lineNo);
				fprintf(temp,"Illegal character !\n");
				fprintf(errlog,"@%d Illegal character   !\n",lineNo);
			}
		}
		
		/*
		*	{
		*/
		else if(c == '{')
		{
			fprintf(fout,"%d\tLBrace\t{\n",lineNo);
			fprintf(temp,"LBrace\t{\n");
			c = fgetc(fin);
		}
			
		/*
		*    }
		*/

		else if(c == '}')
		{
			fprintf(fout,"%d\tRBrace\t}\n",lineNo);
			fprintf(temp,"RBrace\t}\n");
			c = fgetc(fin);
		}

		/*
		*	(
		*/


		else if(c == '(')
		{
			fprintf(fout,"%d\tLParen\t(\n",lineNo);
			fprintf(temp,"LParen\t(\n");
			c = fgetc(fin);
		}
			
		/*
		*     )
		*/

		else if(c == ')')
		{
			fprintf(fout,"%d\tRParen\t)\n",lineNo);
			fprintf(temp,"RParen\t)\n");
			c = fgetc(fin);
		}

		/*
		*   ; && ,
		*/

		else if(c == ';' || c == ',')
		{
			if(c == ';')
			{
				fprintf(fout,"%d\tSEMIC\t%c\n",lineNo,c);
				fprintf(temp,"SEMIC\t%c\n",c);
			}
			else
			{
				fprintf(fout,"%d\tCOLOM\t%c\n",lineNo,c);
				fprintf(temp,"COLOM\t%c\n",c);
			}
			c = fgetc(fin);
		}

		/*
		* 出现非法字符!
		*/
		else
		{
			fprintf(fout,"@%d Illegal character %c\n",lineNo,c);
			fprintf(temp,"Illegal character %c\n",c);
			fprintf(errlog,"@%d Illegal character %c\n",lineNo,c);
			c = fgetc(fin);
		}
	}
	fclose(fin);
}


int NextSym(FILE * finn)
{
	//static char sym[len];
	int ll;
	if(!feof(finn))
	{
		fgets(Sym,len,finn);
		split(Sym);
		ll = strlen(Symbol[2]);
		Symbol[2][ll-1] = '\0';
		return 1;
	}
	else
	{
		Sym[0] = '\0';
		return 0;
	}
	
}




void split(char *string)
{
	Symbol[0] = strtok(string,sep);
	Symbol[1] = strtok(NULL,sep);
	Symbol[2] = strtok(NULL,sep);
}

void Error(int k)  	
{
	fprintf(errlog,"Syntax error @ %s:%s\n",Symbol[0],errmsg[k]);
	printf("Syntax error @ %s:%s\n",Symbol[0],errmsg[k]);
	error = 1;
}

⌨️ 快捷键说明

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