亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? scan.cpp

?? 本程序是實現C-的一個小型編譯器
?? CPP
字號:
#include"scan.h"

char ch,ch1;//從文件中讀取一個字符
int row=1;//正在讀取的字符的行號
int R=0;//括號匹配中用于記錄棧頂位置
char parRight[20];//棧,用與括號匹配
FILE *sourceFile;//要分析的文件
FILE *inFile;//關鍵字和保留字的文檔
FILE *keyFile;//關鍵字和保留字的文檔
symble symbleList[30];//用與存儲關鍵字和保留字的結構體數組
token currentToken;
int Token_Number=0;

/*如果輸入的符號是左括號中的一種,則將其存入數組中,如果是右括號,則進行以下的判定:\
	1:數組中元素是否為空,為空,表明不匹配
	2:數組中的元素不為空,則數組中的最后一個元素和當前的元素是否為匹配的左右元素的關系,
	若是,則將數組的最后一個元素置為'\0*/
void kuahao(char ch1)
{
	int i;
	char ch=ch1;
	if((ch=='(')||(ch=='[')||(ch=='{'))//左向括號,進入數組
	{
		parRight[R++]=ch;
		printf("\n");
	}
	if(ch==')')
	{
		i=R-1;
		if((parRight[i]=='\0')||(parRight[i]!='('))
		{
			printf("此處括號是不匹配的!     \n");
		}
		if(parRight[i]=='(')
		{
			parRight[i]='\0';
			printf("\n");
			R--;
		}
	}
	if(ch==']')
	{
		i=R-1;
		if((parRight[i]=='\0')||(parRight[i]!='['))
		{
			printf("此處括號是不匹配的!     \n");
		}
		if(parRight[i]=='[')
		{
			parRight[i]='\0';
			printf("\n");
			R--; 
		}
	}
	if(ch=='}')
	{
		i=R-1;
		if((parRight[i]=='\0')||(parRight[i]!='{'))
		{
			printf("此處括號是不匹配的!     \n");
		}
		if(parRight[i]=='{')
		{
			parRight[i]='\0';
			printf("\n");
			R--;
		}
	}
}

/************************判定是否為數字****************************/
void IsNumber()
{
	int k=0;
	int flag=0;//用于記錄是否有小數點出現
	
	while((ch>47)&&(ch<58))//判斷當前的字符是否是數字
	{
		currentToken.name[k++]=ch;
		ch=fgetc(sourceFile);
		if(ch=='.')
		{
			flag=1;//出現了一個小數點,隨后進行是否為小數的判斷
			currentToken.name[k++]=ch;
			break;
		}
	}
	
	if(flag==1)
	{
		ch=fgetc(sourceFile);
		if((ch==',')||(ch==';'))//小數點后直接接了這兩個符號是違法的
		{
			printf("第%d行 %s :   非法數字\n",row,currentToken.name);
			fprintf(inFile,"%d  %d  %s\n",currentToken.LineofPro=row,currentToken.code=0,currentToken.name);
			Token_Number++;
			return;
		}
		
		while((ch>47)&&(ch<58))//讀入小數點后面的所有的字符
		{
			currentToken.name[k++]=ch;
			ch=fgetc(sourceFile);
		}
		if((ch==',')||(ch==';'))//正確的數字遇到間隔符,表明是正確的數字
		{
			printf("第%d行 %s :   實常數\n",row,currentToken.name);
			fprintf(inFile,"%d   %d   %s\n",currentToken.LineofPro=row,currentToken.code=28,currentToken.name);
			Token_Number++;
			return;
		}
		if(ch=='.')//出現兩個小數點,后面緊接的所有符號作為違法的符號輸出
		{
			currentToken.name[k++]=ch;
			while((ch!=' ')&&(ch!='\t')&&(ch!='\n')&&(ch!=';'))
			{
				ch=fgetc(sourceFile);
				currentToken.name[k++]=ch;
			}
			printf("第%d行 %s :   這個數字中出現了兩個小數點!\n",row,currentToken.name);
			fprintf(inFile,"%d   %d   %s\n",currentToken.LineofPro=row,currentToken.code=0,currentToken.name);
			Token_Number++;
			return;
		}
		
		if(((ch>64)&&(ch<91))||((ch>96)&&(ch<123)))//數字后面接了字母也為非法的數字
		{
			currentToken.name[k++]=ch;
			ch=fgetc(sourceFile);
			while(((ch>47)&&(ch<58))||((ch>64)&&(ch<91))||((ch>96)&&(ch<123)))//讀入所有的非法的字符
			{
				currentToken.name[k++]=ch;
				ch=fgetc(sourceFile);
			}
			printf("第%d行 %s :   非法字符\n",row,currentToken.name);
			fprintf(inFile,"%d   %s    %d\n",currentToken.LineofPro=row,currentToken.code=0,currentToken.name);
			Token_Number++;
			return;
		}
	}
	
	else//可能是整型數字
	{
		if(((ch>64)&&(ch<91))||((ch>96)&&(ch<123)))//數字后面跟了字母,屬于非法錯誤
		{
			currentToken.name[k++]=ch;
			ch=fgetc(sourceFile);
			while(((ch>47)&&(ch<58))||((ch>64)&&(ch<91))||((ch>96)&&(ch<123)))//讀入所有的非法的字母或數字
			{
				currentToken.name[k++]=ch;
				ch=fgetc(sourceFile);			
			}
			printf("第%d行 %s :   非法字符\n",row,currentToken.name);
			fprintf(inFile,"%d   %d   %s\n",currentToken.LineofPro=row,currentToken.code=0,currentToken.name);
			Token_Number++;
			return;	
		}
		else//整形數字
		{
			printf("第%d行 %s :   NUM\n",row,currentToken.name);
			fprintf(inFile,"%d   %d   %s\n",currentToken.LineofPro=row,currentToken.code=27,currentToken.name);
			Token_Number++;
		}
	}

}

/************************字符或字符串的處理*****************************/
void IsAlpha()
{
    int i=0,h=0;//h的作用與flag相似,用于判定讀入的字符串是否為關鍵字
	while(((ch>64)&&(ch<91))||((ch>96)&&(ch<123)))//判定輸入的字符是否是字母
	{
		currentToken.name[i++]=ch;
		ch=fgetc(sourceFile);
	}
	for(i=1;i<=6;i++)
	{
		h=strcmp(currentToken.name,symbleList[i].name);//與關鍵字進行比較
		if(!h)
		{
			printf("第%d行 %s :   關鍵字\n",row,currentToken.name);
			fprintf(inFile,"%d   %d   %s\n",currentToken.LineofPro=row,currentToken.code=i,currentToken.name);
			Token_Number++;
			break;
		}
	}
	if(h)
	{
		printf("第%d行 %s :   ID\n",row,currentToken.name);//關鍵字以外的字符串全部定義為標識符
		fprintf(inFile,"%d   %d   %s\n",currentToken.LineofPro=row,currentToken.code=26,currentToken.name);
		Token_Number++;
	}
}

/****************************判定是否為注釋***********************/
//注釋的情況:遇到/*就進行判定,遇到*后判定下一個字符是否為/,是則是注釋,如果不是整個
//函數都將是錯誤的
void IsAnotation()
{
	char ch1;
	ch1=ch;
	ch=fgetc(sourceFile);
	if(ch=='*')
	{
		for(;;)
		{
			ch=fgetc(sourceFile);
			if(ch==EOF)
			{
				printf("第%d行 沒有匹配的注釋符!\n",row);
				break;
			}
			if(ch=='\n' )
			{
					row++; //行號加1	
					ch=fgetc(sourceFile);
			}	
			if(ch=='*')
			{
			    ch1=ch;
				ch=fgetc(sourceFile);
				if(ch=='/')
				{
					ch=fgetc(sourceFile);
					break;
				}
			}
		}
	}
	else
	{	
		printf("第%d行 %c :   保留符\n",row,ch1);
		currentToken.name[0]=ch1;
		fprintf(inFile,"%d   %d   %s\n",currentToken.LineofPro=row,currentToken.code=10,currentToken.name);
		Token_Number++;
	}
}

/***********************************判定是否為保留字***********************************/
void IsOther()
{
	char ch1;
	ch1=ch;
	int i;
	ch=fgetc(sourceFile);
	
	for(i=0;i<30;i++)
		currentToken.name[i]='\0';
	switch(ch1)
	{
		case '+':currentToken.code=7;
			     currentToken.name[0]='+';
				 printf("第%d行 %c :   保留符\n",row,currentToken.name[0]);
				 fprintf(inFile,"%d   %d   %c\n",currentToken.LineofPro=row,currentToken.code,currentToken.name[0]);
			   	 Token_Number++;
				 break;
		
		case '-':currentToken.code=8;
				 currentToken.name[0]='-';
				 printf("第%d行 %c :   保留符\n",row,currentToken.name[0]);
				 fprintf(inFile,"%d   %d   %c\n",currentToken.LineofPro=row,currentToken.code,currentToken.name[0]);
			   	 Token_Number++;
				 break;
		
		case '*':currentToken.code=9;
				 currentToken.name[0]='*';
				 printf("第%d行 %c :   保留符\n",row,currentToken.name[0]);
				 fprintf(inFile,"%d   %d   %c\n",currentToken.LineofPro=row,currentToken.code,currentToken.name[0]);
				 Token_Number++;
				 break;
		
		case '/':currentToken.code=10;
				 currentToken.name[0]='/';
				 printf("第%d行 %c :   保留符\n",row,currentToken.name[0]);
				 fprintf(inFile,"%d   %d   %c\n",currentToken.LineofPro=row,currentToken.code,currentToken.name[0]);
			 	 Token_Number++;
				 break;
        
		case ',':currentToken.code=19;
				 currentToken.name[0]=',';
				 printf("第%d行 %c :   保留符\n",row,currentToken.name[0]);
				 fprintf(inFile,"%d   %d   %c\n",currentToken.LineofPro=row,currentToken.code,currentToken.name[0]);
				 Token_Number++;
				 break;
		
		case ';':currentToken.code=18;
				 currentToken.name[0]=';';
				 printf("第%d行 %c :   保留符\n",row,currentToken.name[0]);
				 fprintf(inFile,"%d   %d   %c\n",currentToken.LineofPro=row,currentToken.code,currentToken.name[0]);
		    	 Token_Number++;		 
				 break;
        
		case '<':if(ch=='=')
				 {
					 currentToken.code=12;
					 currentToken.name[0]='<';
					 currentToken.name[1]='=';
					 ch=fgetc(sourceFile);
				 }
			     else
				 {
					 currentToken.code=11;
					 currentToken.name[0]='<';
				 }
				 printf("第%d行 %s :   保留符",row,currentToken.name);
				 fprintf(inFile,"%d   %d   %s\n",currentToken.LineofPro=row,currentToken.code,currentToken.name);
				 Token_Number++;
				 break;
		
		case '>':if(ch=='=')
				 {
					 currentToken.code=14;
					 currentToken.name[0]='>';
					 currentToken.name[1]='=';
					 ch=fgetc(sourceFile);
				 }
			     else
				 {
					 currentToken.code=11;
					 currentToken.name[0]='>';
				 }
				 printf("第%d行 %s :   保留符",row,currentToken.name);
		         fprintf(inFile,"%d   %d   %s\n",currentToken.LineofPro=row,currentToken.code,currentToken.name);
				 Token_Number++;
				 break;
		
		case '=':if(ch=='=')
				 {
					 currentToken.code=15;
					 currentToken.name[0]='=';
					 currentToken.name[1]='=';
					 ch=fgetc(sourceFile);		
				 }
			     else
				 {
					 currentToken.code=17;
					 currentToken.name[0]='=';
				 }
				 printf("第%d行 %s :   保留符\n",row,currentToken.name);
		         fprintf(inFile,"%d   %d   %s\n",currentToken.LineofPro=row,currentToken.code,currentToken.name);
				 Token_Number++;
				 break;

		case '!':if(ch=='=')
				 {
					 currentToken.code=16;
					 currentToken.name[0]='!';
					 currentToken.name[1]='=';
				   	 printf("第%d行 %c :   保留符\n",row,currentToken.name);
				     fprintf(inFile,"%d   %d   %s\n",currentToken.LineofPro=row,currentToken.code,currentToken.name);
					 Token_Number++;
					 ch=fgetc(sourceFile);
				 }
	        	else
				{
					printf("第%d行 此處為一個錯誤!\n",row);
					fprintf(inFile,"%d   %d   %s\n",currentToken.LineofPro=row,currentToken.code=0,currentToken.name);
					Token_Number++;
				}
				break;

		case '(':currentToken.code=20;
			     currentToken.name[0]='(';
				 printf("第%d行 %c :   保留符",row,currentToken.name[0]);
		         fprintf(inFile,"%d   %d   %c\n",currentToken.LineofPro=row,currentToken.code,currentToken.name[0]);
				 Token_Number++;
				 kuahao(ch1);
				 break;

		case ')':currentToken.code=21;
			     currentToken.name[0]=')';
				 printf("第%d行 %c :   保留符",row,currentToken.name[0]);
		         fprintf(inFile,"%d   %d   %c\n",currentToken.LineofPro=row,currentToken.code,currentToken.name[0]);
				 Token_Number++;				 
				 kuahao(ch1);
				 break;

		case '[':currentToken.code=22;
			     currentToken.name[0]='[';
				 printf("第%d行 %c :   保留符",row,currentToken.name[0]);
				 fprintf(inFile,"%d   %d   %c\n",currentToken.LineofPro=row,currentToken.code,currentToken.name[0]);
				 Token_Number++;
				 kuahao(ch1);
				 break;

		case ']':currentToken.code=23;
			     currentToken.name[0]=']';
				 printf("第%d行 %c :   保留符",row,currentToken.name[0]);
		         fprintf(inFile,"%d   %d   %c\n",currentToken.LineofPro=row,currentToken.code,currentToken.name[0]);
				 Token_Number++;
				 kuahao(ch1);
				 break;

		case '{':currentToken.code=24;
			     currentToken.name[0]='{';
				 printf("第%d行 %c :   保留符",row,currentToken.name[0]);
		         fprintf(inFile,"%d   %d   %c\n",currentToken.LineofPro=row,currentToken.code,currentToken.name[0]);
				 Token_Number++;
				 kuahao(ch1);
				 break;
	
		case '}':currentToken.code=25;
			     currentToken.name[0]='}';
				 printf("第%d行 %c :   保留符",row,currentToken.name[0]);
		         fprintf(inFile,"%d   %d   %c\n",currentToken.LineofPro=row,currentToken.code,currentToken.name[0]);
			   	 Token_Number++; 
				 kuahao(ch1);
				 break;
    }
}

/************************************ 主函數*******************************************/
void main()
{
	char filename[20];
	int i,flag=0;

	
	/**********************************初始化************************************/
	if((keyFile=fopen("symble.txt","r"))==NULL)//打開關鍵字和保留字的文件,把他讀入到結構體數組中
	{
		printf("打不開文件symble.txt!\n");
		exit(0);
	}

	if((inFile=fopen("token.txt","w"))==NULL)
	{
		printf("打不開文件token.txt!\n");
		exit(0);
	}

	for(i=1;i<=29;i++)
		fscanf(keyFile,"%d%s",&symbleList[i].code,symbleList[i].name);
	
    
	printf("       *****************************************************************\n");
	printf("                               詞法分析器\n");
	printf("       *****************************************************************\n");
   	while(flag==0)
	{ 
		printf("請輸入您要分析的文件名稱:");
		scanf("%s",filename);//sa.txt
		if((sourceFile=fopen(filename,"r"))==NULL)
		{
			printf("無法打開文件!\n");	
			printf("請輸入正確的文件名!\n");
		}
		else
		{
			flag=1;
		}
	}
	ch=fgetc(sourceFile);
	for(i=0;i<20;i++)
		parRight[i]='\0';
	
	while(ch!=EOF)
	{
		if((ch==' ')||(ch=='\t'))
			ch=fgetc(sourceFile);
		if(ch=='\n')
		{
			ch=fgetc(sourceFile);
			row++;//行號加1
		}
		for(i=0;i<30;i++)
			currentToken.name[i]='\0';
		if((ch>47)&&(ch<58))//是否為數字的判定
			IsNumber();
		else 
			if(((ch>64)&&(ch<91))||((ch>96)&&(ch<123)))
				IsAlpha();//是否為字母或字符串的判定
			else
				if(ch=='/')//是否為注釋的判定
					IsAnotation();
				else
					IsOther();//是否為保留字的判定
	}
	if(parRight[0]!='\0')//若所有程序都分析完成,數組中仍有括號沒有完成匹配,則程序的括號也是不匹配的
	{
		printf("您的程序的括號是不匹配的,請改正錯誤后在進行詞法分析!\n");
	}
	fclose(inFile);
	printf("%d",Token_Number);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久一区二区三区国产精品| 国产精品视频线看| 亚洲成a人v欧美综合天堂下载 | 午夜久久久影院| 一本久久精品一区二区| 国产精品久久久一区麻豆最新章节| 国产精品99久久久| 久久免费视频色| 国产一区二区三区四区在线观看| 欧美成人性福生活免费看| 乱中年女人伦av一区二区| 欧美一级精品在线| 免费高清在线视频一区·| 91精品久久久久久久91蜜桃| 蜜臀久久久99精品久久久久久| 欧美肥妇free| 免费一级片91| 精品国产成人在线影院| 国产麻豆视频精品| 久久久av毛片精品| 国产不卡一区视频| 国产精品二三区| 91福利区一区二区三区| 五月天网站亚洲| 日韩精品一区二区三区三区免费| 久久激情五月激情| 久久久蜜桃精品| 成人国产精品免费观看动漫| 亚洲手机成人高清视频| 欧美性生活一区| 18成人在线观看| 制服丝袜国产精品| 成人亚洲一区二区一| 视频在线在亚洲| 亚洲狼人国产精品| 亚洲精品国久久99热| 夜夜揉揉日日人人青青一国产精品| 日韩av成人高清| 亚洲成a人片在线观看中文| 日韩视频一区二区| 国产精品亚洲人在线观看| 亚洲夂夂婷婷色拍ww47| 精品国产91洋老外米糕| 91一区二区三区在线观看| 青草av.久久免费一区| 综合久久久久久| 精品乱人伦小说| 色老综合老女人久久久| 国产最新精品免费| 亚洲午夜精品在线| 欧美国产一区在线| 欧美日韩精品欧美日韩精品 | 成人精品免费视频| 视频一区国产视频| 日韩伦理av电影| 26uuu亚洲| 欧美日韩国产123区| 波多野结衣精品在线| 久久99精品网久久| 亚洲超碰97人人做人人爱| 国产精品久久久久久久裸模| 日韩精品中文字幕一区| 欧美午夜在线观看| 成人av网站免费观看| 久久99国产精品久久99| 亚洲超碰97人人做人人爱| 中文字幕一区二区三区在线不卡 | 亚洲欧美另类图片小说| 久久久久久97三级| 欧美一区三区二区| 在线影视一区二区三区| 免费在线一区观看| 欧美日韩中文精品| 久久久久88色偷偷免费| 午夜视频在线观看一区二区三区| 9久草视频在线视频精品| 在线播放中文一区| 国产精品二三区| 国产一区在线观看麻豆| 欧美一三区三区四区免费在线看 | 亚洲国产精品ⅴa在线观看| 久久久噜噜噜久久中文字幕色伊伊 | 99精品欧美一区二区三区小说 | 国内成人精品2018免费看| 亚洲妇熟xx妇色黄| 亚洲天堂福利av| 中文字幕av一区二区三区高| www亚洲一区| 日韩欧美国产成人一区二区| 欧美一区午夜视频在线观看| 在线电影欧美成精品| 欧美三级韩国三级日本三斤| 一本久道久久综合中文字幕| 99精品欧美一区二区三区综合在线| 成人免费看黄yyy456| 国产高清无密码一区二区三区| 久久99精品国产麻豆不卡| 免费成人性网站| 免费日韩伦理电影| 毛片一区二区三区| 青青青伊人色综合久久| 美国精品在线观看| 精品在线免费视频| 精久久久久久久久久久| 国产美女精品在线| 国产高清不卡一区| 成人免费视频国产在线观看| 国产成人综合亚洲91猫咪| 国产经典欧美精品| 国产成人福利片| 成人av影视在线观看| 大美女一区二区三区| 成人h动漫精品一区二区| 99久久免费精品高清特色大片| 99久久精品国产毛片| 91偷拍与自偷拍精品| 色久优优欧美色久优优| 欧美性猛交xxxx黑人交| 欧美日韩国产123区| 日韩视频123| 欧美精品一区二区久久婷婷| 久久久精品人体av艺术| 国产精品美女久久久久aⅴ| 中文字幕一区免费在线观看| 亚洲女与黑人做爰| 午夜精品久久久久久久蜜桃app | 石原莉奈一区二区三区在线观看 | 黄页网站大全一区二区| 国产高清成人在线| 91网站最新网址| 欧美日韩免费在线视频| 欧美一级片在线看| 国产亚洲欧美色| 亚洲色图一区二区三区| 亚洲国产欧美在线人成| 青草av.久久免费一区| 国产精品亚洲综合一区在线观看| 99久久99久久久精品齐齐| 欧美影院一区二区| 日韩一区国产二区欧美三区| 久久久777精品电影网影网 | 亚洲成人精品一区| 看片网站欧美日韩| 大白屁股一区二区视频| 91搞黄在线观看| 欧美一区二区播放| 国产日韩精品视频一区| 亚洲美女视频在线| 秋霞电影一区二区| 国产91富婆露脸刺激对白| 色婷婷精品久久二区二区蜜臀av| 正在播放亚洲一区| 欧美韩日一区二区三区四区| 性感美女久久精品| 国产一区二区三区四| 91丨国产丨九色丨pron| 91精品国产综合久久久蜜臀图片| 欧美国产精品一区二区三区| 一区二区三区免费看视频| 久久电影网电视剧免费观看| av色综合久久天堂av综合| 9191久久久久久久久久久| 国产日韩欧美综合在线| 亚洲成人免费电影| 高清国产午夜精品久久久久久| 在线国产亚洲欧美| 国产亚洲欧美日韩日本| 亚洲成a人v欧美综合天堂| 国产精品一区免费视频| 欧美吞精做爰啪啪高潮| 欧美不卡视频一区| 中文字幕巨乱亚洲| 久久精品水蜜桃av综合天堂| 亚洲成人免费av| 欧美日韩精品电影| 欧美日韩不卡视频| 日韩一区二区电影| 欧美一区二区免费| 欧美大尺度电影在线| 日韩欧美一区二区不卡| 精品久久久久久无| 欧美国产欧美综合| 亚洲欧美日韩系列| 一区二区三区欧美日| 亚洲丰满少妇videoshd| 亚洲激情男女视频| 国产精品资源站在线| 欧美肥胖老妇做爰| 亚洲美女免费在线| 国产91精品一区二区麻豆亚洲| 777精品伊人久久久久大香线蕉| 国产精品欧美一区二区三区| 韩国精品久久久| 91精品免费观看| 亚洲一区二区三区视频在线播放| 成人午夜av电影| 久久日韩精品一区二区五区| 午夜免费欧美电影| 色婷婷国产精品| 国产精品久久网站|