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

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

?? step2_clae_first_follow_select.c

?? 功能基本實現
?? C
?? 第 1 頁 / 共 3 頁
字號:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define DEBUG 1

#define MAX_SETENCE_LEN  2000
#define MAX_GRAM_LEN     255
#define MAX_ELE_NUM      40
#define MAX_GRAM_ELE_NUM 300

//--IO FILES--
FILE* grammerFile,* setenceFile;
char* grammerFileName="grammer.txt";
char* setenceFileName="setence.txt";

FILE* testFile;
char* testFileName="outputData.txt";


//---GLOBAL VARIABLES---
//--GRAMMER STRUCT --
typedef struct
{
		char mSetence[MAX_GRAM_LEN];		
}grammerElement;

grammerElement GrammerSet[MAX_GRAM_ELE_NUM];
grammerElement TmpGrammerSet[MAX_GRAM_ELE_NUM];

typedef struct
{
		int  len;
		char ele[MAX_ELE_NUM];
}simpleGroup;

simpleGroup groupFirst[MAX_ELE_NUM];
simpleGroup groupFollow[MAX_ELE_NUM];
simpleGroup groupSelect[MAX_GRAM_LEN];

char analyseTable[MAX_ELE_NUM][MAX_ELE_NUM][MAX_GRAM_LEN];

char parseSetence[MAX_SETENCE_LEN];
int grammerNum;

char VTSet[MAX_ELE_NUM];
char VNSet[MAX_ELE_NUM];
int  VNProduceZ[MAX_ELE_NUM];

int vtSetLen;
int vnSetLen;

void	readInSetence();
void	readInGrammer();

//---1. ELEMINATE LEFT RECURSIVE--
void    outputGrammer();
void    outputTmpGrammer(int len);
int     hasLeftRecursive();
int     eleminateLeftRecursive();
void    bubbleSort();

//2.CAL INSIDUCE E,FIRST SET,FOLLOW SET,SELECT
void    cal_ProductE();
void    cal_first_set();
void    cal_follow_set();
void    cal_select_set();
int     checkLL1_consTable();

//3.CONSTRUCT ANALYSE DIAGRAM,YOU CAN SAVE THIS DIAGRAM FOR LATER USE

//4.PARSE THE SETENCE.
void    parsingSetence();

void    topologySort(int** inMatrix,int* topSeqArr,int row,int col);

//STARTED SIGN
char    startedSign;

void main()
{
		int i;
		//0.OPEN FILE ,READ IN SETENCE ,READING SETENCE AND REGISTER DATA.
		if((grammerFile=fopen(grammerFileName,"rb"))==NULL)
			{
				fprintf(stderr,"open file:grammerFile error.\n");
				return;	
			}
		if((setenceFile=fopen(setenceFileName,"rb"))==NULL)
			{
				fprintf(stderr,"open file:setenceFile error.\n");
				return;	
			}
		if((testFile=fopen(testFileName,"wb"))==NULL)
			{
				fprintf(stderr,"open file:testFile error.\n");
				return;	
			}
		


		readInSetence();
		readInGrammer();
		
		printf("input grammer.\n");
		outputGrammer();

		bubbleSort();
		printf("after bubble sort.\n");	
		outputGrammer();
			
		fclose(grammerFile);
		fclose(setenceFile);
	
		//1.ELEMINATE LEFT RECURSIVE
		if(hasLeftRecursive())
		{
			if(eleminateLeftRecursive()==-1)
					return;
			else
			{
				printf("\nafter eleminate left recursiv.\n");
				outputGrammer();
			}
		}
	
		//ADDED CODE
		bubbleSort();
		printf("after bubble sort.\n");	
		outputGrammer();
		for(i=0;i<grammerNum;i++)
			strcpy(TmpGrammerSet[i].mSetence,GrammerSet[i].mSetence);
		//END OF ADDED CODE

		//2.CAL INSIDUCE E,FIRST SET,FOLLOW SET,SELECT
		cal_ProductE();		//TmpGrammerSet
		cal_first_set();	//GrammerSet
		cal_follow_set();	//GrammerSet
		cal_select_set();	//GrammerSet
		//3.CONSTRUCT ANALYSE DIAGRAM,YOU CAN SAVE THIS DIAGRAM FOR LATER USE
		if(checkLL1_consTable())
		{	
			//4.PARSE THE SETENCE.
			parsingSetence();
		}
		
		
		fclose(testFile);
		getchar();
}

void 	readInSetence()
	{
		fscanf(setenceFile,"%s\r\n",&parseSetence);
	}
	
void readInGrammer()
{
	char tmpChar;
	char tmpStr[MAX_GRAM_LEN];
	int tmpIndex;
	int vtIndex,vnIndex;
	int i,j;
	
	tmpIndex=0;vtIndex=0;vnIndex=0;

	fscanf(grammerFile,"%c\r\n",&startedSign);

	while(!feof(grammerFile))
	{
		if(fscanf(grammerFile,"%c->%s\r\n",&tmpChar,&tmpStr)!=2)
			break;
			
		GrammerSet[tmpIndex].mSetence[0]=tmpChar;
		GrammerSet[tmpIndex].mSetence[1]='\0';
		strcat(GrammerSet[tmpIndex].mSetence,tmpStr);
		tmpIndex++;
		
		for(i=0;i<vnIndex;i++)
			if(tmpChar==VNSet[i])
				break;
		if(i==vnIndex)//new VT SIGN;
		{
				VNSet[vnIndex]=tmpChar;
				vnIndex++;
		}
		
		i=0;
		while(tmpStr[i]!='\0')
		{
			if(!(tmpStr[i]>=65&&tmpStr[i]<=90))//NOT UPCASE CHAR(NOT Vn)
				{
							for(j=0;j<vtIndex;j++)
								if(tmpStr[i]==VTSet[j])
									break;
							
							if(j==vtIndex)//new VT SIGN;
							{
								VTSet[vtIndex]=tmpStr[i];
								vtIndex++;
							}
				}
			i++;	
		}		
	}	
	
	VTSet[vtIndex]='\0';
	VNSet[vnIndex]='\0';
	vtSetLen=vtIndex;
	vnSetLen=vnIndex;
	
	grammerNum=tmpIndex;
}

void    outputGrammer()
{
	int i;
	for(i=0;i<grammerNum;i++)
		fprintf(stdout,"%s\n",GrammerSet[i].mSetence);
	
	fprintf(stdout,"%s %d\n",VTSet,vtSetLen);
	fprintf(stdout,"%s %d\n",VNSet,vnSetLen);

}

void    outputTmpGrammer(int len)
{
	int i;

	for(i=0;i<len;i++)
		fprintf(stdout,"%s\n",TmpGrammerSet[i].mSetence);
	
}

void    bubbleSort()
{
	int i,j;
	char tmpChar;
	char tmpStr[MAX_GRAM_LEN];
	int flag;

	//SORT VT
	flag=0;
	for(i=0;i<vtSetLen-1;i++)
	{
		for(j=0;j<vtSetLen-i-1;j++)
			if(VTSet[j]>VTSet[j+1])
			{
					tmpChar=VTSet[j];
					VTSet[j]=VTSet[j+1];
					VTSet[j+1]=tmpChar;
					flag=1;
			}
		if(flag==0)break;
	}

	//SORT VN
	flag=0;
	for(i=0;i<vnSetLen-1;i++)
	{
		for(j=0;j<vnSetLen-i-1;j++)//-->ADD ON startedSign's priority sort.
			if((VNSet[j]>VNSet[j+1]||(VNSet[j]!=startedSign&&VNSet[j+1]==startedSign))&&VNSet[j]!=startedSign)
			{
					tmpChar=VNSet[j];
					VNSet[j]=VNSet[j+1];
					VNSet[j+1]=tmpChar;	
					flag=1;
			}
		if(flag==0)break;
	}

	//SORT GRAMMER	
	flag=0;
	for(i=0;i<grammerNum-1;i++)
	{
		for(j=0;j<grammerNum-i-1;j++)
		if((GrammerSet[j].mSetence[0]>GrammerSet[j+1].mSetence[0]||(GrammerSet[j].mSetence[0]!=startedSign&&GrammerSet[j+1].mSetence[0]==startedSign))&&GrammerSet[j].mSetence[0]!=startedSign)
		{
			strcpy(tmpStr,GrammerSet[j].mSetence);
			strcpy(GrammerSet[j].mSetence,GrammerSet[j+1].mSetence);
			strcpy(GrammerSet[j+1].mSetence,tmpStr);
			flag=1;
		}
		if(flag==0)break;
	}
}

int hasLeftRecursive()
{
	int i,j;
	
	for(i=0;i<grammerNum;i++)
	{
		if(GrammerSet[i].mSetence[0]==GrammerSet[i].mSetence[1])
			break;

	}
	
	if(i<grammerNum)
	{
		printf("===grammer has left recursive.===\n");
		return 1;
	}
	else
	{
		printf("===grammer has no left recursive===\n");
		for(j=0;j<grammerNum;j++)
			strcpy(TmpGrammerSet[j].mSetence,GrammerSet[j].mSetence);
		return 0;
	}
}

int 	eleminateLeftRecursive()
{
	int i,j,k,l,m,n;
	int GroupL[MAX_ELE_NUM],GroupT[MAX_ELE_NUM];
	int GroupLLen,GroupTLen;

	int GrammerSetIndex,preGrammerSetIndex;
	char tmpNewSign;
	int  tmpIndex;
	int dealed[MAX_GRAM_LEN];
	int tmpVNLen;
	int preVNSetLen;

	char tweenGrammerSet[MAX_GRAM_ELE_NUM][MAX_GRAM_LEN];
	int  tweenIndex;//tweenArrLen;

	//INIT	
	GrammerSetIndex=0;
	preGrammerSetIndex=0;
	tweenIndex=0;

	for(i=0;i<MAX_GRAM_LEN;i++)
		dealed[i]=0;

	preVNSetLen=vnSetLen;
	for(i=0;i<preVNSetLen;i++)//->Correct: for(i=0;i<vnSetLen;i++)
	{
		//To cal the Ai-> group len;
		tmpVNLen=0;
	
		for(j=preGrammerSetIndex;j<grammerNum;j++)
		{
			if(GrammerSet[j].mSetence[0]!=VNSet[i])
				break;
			else
				tmpVNLen++;
		}

		//Replace Aj in all Ai->AjBeta
		tweenIndex=0;
		for(j=0;j<i;j++)
		{
			for(k=preGrammerSetIndex;k<grammerNum;k++)
			{
				//Exit control
				if(GrammerSet[k].mSetence[0]!=VNSet[i])
					break;
				
				// if Has Ai->AjBeta ASSERT GrammerSet[k].mSetence[0]==VNSet[i]
				if(GrammerSet[k].mSetence[1]==VNSet[j])
				{
					for(l=0;l<GrammerSetIndex;l++)
						if(TmpGrammerSet[l].mSetence[0]==VNSet[j])
							break;

					//ASSERTION
					if(l==GrammerSetIndex)
					{
						printf("error in eleminate l:replace part.\n");
						return -1;
					}
					
					while(l<GrammerSetIndex&&TmpGrammerSet[l].mSetence[0]==VNSet[j])
					{
						//VNSet[i]->TmpGrammerSet[l].mSetence[1..end]+GrammerSet[i].mSetence[2..end];
						tweenGrammerSet[tweenIndex][0]=VNSet[i];
					
						m=1;
						while(TmpGrammerSet[l].mSetence[m]!='\0')
						{
							tweenGrammerSet[tweenIndex][m]=TmpGrammerSet[l].mSetence[m];
							m++;
						}

						n=2;
						while(GrammerSet[k].mSetence[n]!='\0')
						{
							//->COREECT:GrammerSet[tmpIndex] -> GrammerSet[k]
							tweenGrammerSet[tweenIndex][m]=GrammerSet[k].mSetence[n];
							m++;
							n++;
						}
						tweenGrammerSet[tweenIndex][m]='\0';	

						tweenIndex++;
						l++;	//->error correct,forget.
					}
			
					dealed[k]=1;
				}
			}
		}
	
		//-->ADDED : TO ELIMINATE THE NEW LEFT SELF RECURSIVE
		//NO NEED ,USE A TWEEN STR DB IS OK

		//if has Ai->AiBeta Ai->c,Replace it with:
		//Ai->cAi'	Ai'->BetaAi'|z;
		
		//0 GET GroupL,GroupLLen,GroupT,GroupTLen;	
	
			 //starting pos
		for(k=preGrammerSetIndex;k<grammerNum;k++)//ASSUME GRAMMER SET HAS BEEN SORTED
		{
				                        //end pos
				if(GrammerSet[k].mSetence[0]!=VNSet[i])
					break;

				if(!dealed[k])
				{
					strcpy(tweenGrammerSet[tweenIndex],GrammerSet[k].mSetence);
					tweenIndex++;
				}
		}
		
		GroupLLen=0;
		GroupTLen=0;
		
		for(k=0;k<tweenIndex;k++)//ASSUME GRAMMER SET HAS BEEN SORTED
		{
			//-->CORRECT :tweenGrammer[tweenIndex][0]
				if(tweenGrammerSet[k][0]==tweenGrammerSet[k][1])	//GROUP	L
				{
							GroupL[GroupLLen]=k;
							GroupLLen++;
				}
				else //GROUP T
				{
							GroupT[GroupTLen]=k;
							GroupTLen++;
				}
		}
		
		if(GroupTLen==0)
		{
			printf("abort: illegal grammer.\n");
			return -1;
		}

		if(GroupLLen>0)
		{
			//1.FIND NEW VN SIGN 
			for(k=65;k<=90;k++)
			{
				for(l=0;l<vnSetLen;l++)
				{
					if(VNSet[l]==k)
						break;
				}

				if(l==vnSetLen)// k is a new ascii sign.
				{
					VNSet[vnSetLen]=k;
					tmpNewSign=k;
					vnSetLen++;
					break;		//-->CORRECT FORGET THIS
				}
			}
			
			if(k==91)
			{
				printf("in ele left recursive,not enough new sign\n");
				return -1;
			}

			//2.Replace  : A->Ab ,A->a ==>A->aD ,D->bD ,D->z
			//2.0 A->aD
		

			for(k=0;k<GroupTLen;k++)
			{	//VNSet[i]->GrammerSet[GroupT[k]].mSetemce[1 to n]+newSign;
				TmpGrammerSet[GrammerSetIndex].mSetence[0]=VNSet[i];
				tmpIndex=1;

				while(tweenGrammerSet[GroupT[k]][tmpIndex]!='\0')
				{
					TmpGrammerSet[GrammerSetIndex].mSetence[tmpIndex]=tweenGrammerSet[GroupT[k]][tmpIndex];
					tmpIndex++;
				}

				TmpGrammerSet[GrammerSetIndex].mSetence[tmpIndex]=tmpNewSign;
				TmpGrammerSet[GrammerSetIndex].mSetence[tmpIndex+1]='\0';
				
				GrammerSetIndex++;
			}
		

			//2.1 D->bD
			for(k=0;k<GroupLLen;k++)
			{
				//NewSign->GrammerSet[GroupL[k]].mSetence[2 to n]+NewSign
				TmpGrammerSet[GrammerSetIndex].mSetence[0]=tmpNewSign;
				
				tmpIndex=2;
				while(tweenGrammerSet[GroupL[k]][tmpIndex]!='\0')
				{
					TmpGrammerSet[GrammerSetIndex].mSetence[tmpIndex-1]=tweenGrammerSet[GroupL[k]][tmpIndex];
					tmpIndex++;
				}

				TmpGrammerSet[GrammerSetIndex].mSetence[tmpIndex-1]=tmpNewSign;
				TmpGrammerSet[GrammerSetIndex].mSetence[tmpIndex]='\0';
				
				GrammerSetIndex++;
			}

			//2.2 D->z
			TmpGrammerSet[GrammerSetIndex].mSetence[0]=tmpNewSign;
			TmpGrammerSet[GrammerSetIndex].mSetence[1]='z';
			TmpGrammerSet[GrammerSetIndex].mSetence[2]='\0';

			GrammerSetIndex++;
		}
		else 
		{		
			//ASSERT GroupLLen==0
		
			for(k=0;k<GroupTLen;k++)
			{
				strcpy(TmpGrammerSet[GrammerSetIndex].mSetence,tweenGrammerSet[k]);		
		      	GrammerSetIndex++;	
			}
		}
	

		if(DEBUG)
		{
			printf("\n====\n");
			outputTmpGrammer(GrammerSetIndex);
		}
		//-->CORRECT preGrammerSetIndex+=GroupLLen+GroupTLen;
		preGrammerSetIndex+=tmpVNLen;
	}

	//ADDED: IF Pre Grammer can't =>e
	//After left recursive ,it should be can
	for(i=0;i<vtSetLen;i++)
	{
		if(VTSet[i]=='z')
		{
			break;
		}
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本久久a久久精品亚洲| 亚洲另类春色国产| 亚洲精品免费播放| 麻豆成人综合网| 色妹子一区二区| 久久久久久久久久久久久久久99| 亚洲精品水蜜桃| 国产高清久久久| 日韩精品一区二区三区在线| 亚洲美女免费视频| caoporen国产精品视频| 久久综合九色综合欧美就去吻| 亚洲妇女屁股眼交7| 色先锋久久av资源部| 国产精品嫩草影院av蜜臀| 精品亚洲aⅴ乱码一区二区三区| 欧美色综合久久| 亚洲精品乱码久久久久久黑人| 成人综合婷婷国产精品久久| 久久久久久麻豆| 久久成人综合网| 日韩欧美国产综合| 日韩福利视频网| 欧美蜜桃一区二区三区| 亚洲一级二级在线| 在线观看日韩电影| 一区二区在线观看不卡| 91视视频在线直接观看在线看网页在线看| 26uuu国产电影一区二区| 美腿丝袜亚洲色图| 日韩精品自拍偷拍| 韩国精品久久久| 久久久99精品久久| 从欧美一区二区三区| 最新国产成人在线观看| 97久久精品人人做人人爽 | 欧美人xxxx| 石原莉奈一区二区三区在线观看| 欧美三级视频在线观看| 天堂一区二区在线免费观看| 欧美一级精品在线| 精品一区二区免费| 国产日韩精品一区二区浪潮av | 日韩三级免费观看| 麻豆成人免费电影| 国产色爱av资源综合区| 成人天堂资源www在线| 亚洲视频一区二区在线观看| 91丝袜美女网| 视频在线在亚洲| 欧美精品一区二区三区久久久| 国产精品一二三在| 综合久久国产九一剧情麻豆| 欧美色综合影院| 国产在线国偷精品免费看| 日本一区二区三区四区| 日本高清不卡一区| 日韩国产一二三区| 国产欧美综合在线观看第十页 | 亚洲欧美怡红院| 欧美性生活一区| 激情六月婷婷久久| 亚洲欧洲性图库| 欧美一级片在线| 99精品欧美一区| 亚洲成av人片一区二区梦乃| 久久精品亚洲国产奇米99| 日本韩国一区二区| 国内外成人在线| 一区二区三区免费| 久久久久久久精| 日本高清成人免费播放| 国产东北露脸精品视频| 亚洲福利视频三区| 欧美国产精品一区| 日韩一区二区免费电影| 97成人超碰视| 国产一区二区免费在线| 亚洲综合激情网| 国产精品素人视频| 亚洲免费观看高清完整版在线观看熊 | 另类中文字幕网| 亚洲品质自拍视频网站| 久久久精品国产免费观看同学| 在线亚洲+欧美+日本专区| 国产精品亚洲第一区在线暖暖韩国| 亚洲aⅴ怡春院| 一区二区三区在线观看动漫| 国产精品乱码人人做人人爱| 日韩一区二区三区视频| 欧美伊人久久久久久午夜久久久久| 国产成人日日夜夜| 美国毛片一区二区三区| 亚洲成人精品一区| 亚洲欧美一区二区三区孕妇| 亚洲国产激情av| 欧美电影免费提供在线观看| 在线免费精品视频| 91尤物视频在线观看| bt欧美亚洲午夜电影天堂| 国产精品一区二区在线观看网站| 免费成人你懂的| 午夜精品福利视频网站| 亚洲成人免费电影| 亚洲欧美日韩成人高清在线一区| 国产精品污污网站在线观看| 久久久综合视频| 国产女人aaa级久久久级| 亚洲一区二区免费视频| 亚洲色图视频网站| 国产精品美女久久久久aⅴ| 国产色综合一区| 欧美国产精品中文字幕| 日本一区二区电影| 国产精品国产三级国产aⅴ无密码| 久久亚洲精华国产精华液| 精品久久久久久无| 精品国产一区二区精华| 精品国产91久久久久久久妲己 | 亚洲免费资源在线播放| 亚洲精品乱码久久久久久| 一区二区久久久| 亚洲综合999| 视频在线观看一区| 奇米四色…亚洲| 国产成人福利片| 色综合久久99| 在线播放日韩导航| 精品国产电影一区二区| 麻豆精品国产传媒mv男同| 日本不卡一二三| 精品一区二区三区视频| 成人免费看片app下载| 99精品热视频| 91精品综合久久久久久| 日韩久久久精品| 《视频一区视频二区| 亚洲一区二区三区四区的| 日韩福利电影在线观看| 高清不卡在线观看| 色婷婷综合久久久中文一区二区| 欧美伦理电影网| 久久久久久9999| 亚洲裸体在线观看| 蜜臀久久99精品久久久画质超高清| 另类调教123区| 色哟哟欧美精品| 欧美tk丨vk视频| 亚洲三级电影网站| 免费成人你懂的| 色哟哟日韩精品| 26uuu欧美| 午夜精品123| 成人国产一区二区三区精品| 欧美日韩成人综合天天影院 | 欧美日韩不卡视频| 精品日韩一区二区三区免费视频| 国产精品久久久久桃色tv| 午夜精品福利一区二区三区av | 美日韩一区二区| 91论坛在线播放| 日韩午夜av一区| 一区二区在线观看av| 国产精品69毛片高清亚洲| 欧美日韩国产综合一区二区| 国产日韩视频一区二区三区| 日日摸夜夜添夜夜添国产精品 | 国产精品一区二区在线观看不卡| 91福利精品第一导航| 国产亚洲精品精华液| 蜜桃免费网站一区二区三区| 91色视频在线| 欧美激情自拍偷拍| 韩国女主播一区| 亚洲精品久久久蜜桃| 国产福利91精品| 精品国产凹凸成av人导航| 天涯成人国产亚洲精品一区av| 成人av资源在线观看| 久久这里只有精品首页| 天堂va蜜桃一区二区三区 | 成人性色生活片免费看爆迷你毛片| 欧美日韩国产一级片| 亚洲人一二三区| 国产黄色精品视频| 日韩欧美精品三级| 日本大胆欧美人术艺术动态| 欧美日韩激情一区二区三区| 亚洲国产一区二区在线播放| 色哟哟精品一区| 玉米视频成人免费看| 色哟哟一区二区在线观看| 亚洲免费观看高清| 91麻豆国产在线观看| 亚洲色图制服诱惑| 色婷婷av一区二区三区软件| 亚洲丝袜美腿综合| 一本色道久久综合亚洲91| 亚洲精品高清在线| 欧美色爱综合网|