亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
久久久精品中文字幕麻豆发布| 亚洲亚洲精品在线观看| 亚洲曰韩产成在线| 国产一区二区三区在线观看精品| 91视频免费看| 久久女同精品一区二区| 午夜精品久久久久久久久| av电影在线观看完整版一区二区| 日韩免费观看高清完整版| 亚洲成a人v欧美综合天堂| 99久久精品免费看国产免费软件| 精品三级在线观看| 亚洲尤物视频在线| 欧美一区二区三区的| 国产性色一区二区| 国产自产v一区二区三区c| 欧美酷刑日本凌虐凌虐| 亚洲男人的天堂在线aⅴ视频| 国产一区二区三区日韩 | 日韩1区2区日韩1区2区| 91网站最新地址| 久久久国产午夜精品| 美女看a上一区| 777午夜精品免费视频| 亚洲成人精品一区| 欧美视频中文字幕| 一区二区在线观看av| 91美女视频网站| 国产精品伦理一区二区| 国产91丝袜在线观看| 久久久国产综合精品女国产盗摄| 韩国欧美一区二区| 久久婷婷一区二区三区| 日本不卡一二三| 日韩三级免费观看| 精品综合免费视频观看| 精品美女一区二区三区| 精品一区二区三区久久| 精品日产卡一卡二卡麻豆| 丝袜美腿高跟呻吟高潮一区| 4438x成人网最大色成网站| 日韩—二三区免费观看av| 91精品国产一区二区三区蜜臀 | 精品亚洲成a人在线观看| 日韩欧美国产不卡| 老司机精品视频线观看86| 精品人在线二区三区| 国产精品亚洲午夜一区二区三区| 国产人妖乱国产精品人妖| 成人综合在线网站| 亚洲综合成人网| 6080亚洲精品一区二区| 国产米奇在线777精品观看| 中文欧美字幕免费| 日韩精品一区在线| 国产精华液一区二区三区| 综合久久给合久久狠狠狠97色 | 亚洲成人精品一区| 亚洲精品一区二区三区四区高清| 国产.欧美.日韩| 伊人婷婷欧美激情| 欧美大度的电影原声| 成人av手机在线观看| 亚洲综合一区二区三区| 精品国产污污免费网站入口 | 欧美精品色综合| 国产乱理伦片在线观看夜一区 | 欧美艳星brazzers| 蜜桃久久久久久| 日韩一区在线免费观看| 91精品国产综合久久精品| 成人毛片视频在线观看| 无吗不卡中文字幕| 国产精品久久久一本精品| 欧美精品丝袜久久久中文字幕| 国产精品一区在线观看乱码| 亚洲女爱视频在线| 亚洲精品一区二区三区香蕉| 欧美在线一二三| 国产不卡视频一区| 强制捆绑调教一区二区| 日韩毛片视频在线看| 精品欧美一区二区在线观看| 色综合一个色综合| 粉嫩aⅴ一区二区三区四区| 午夜av区久久| 亚洲乱码中文字幕综合| 久久精品免费在线观看| 777久久久精品| 在线观看免费一区| 白白色亚洲国产精品| 国产又黄又大久久| 青青草原综合久久大伊人精品优势 | 91麻豆成人久久精品二区三区| 美日韩黄色大片| 天天亚洲美女在线视频| 亚洲精品欧美激情| 中文字幕一区二区三区在线观看| 精品国精品国产| 欧美一区二区视频在线观看| 日本电影欧美片| 91免费国产视频网站| 成人免费高清视频在线观看| 国内精品视频666| 另类成人小视频在线| 免费欧美在线视频| 日韩成人免费在线| 日韩激情av在线| 日韩av中文字幕一区二区| 亚洲国产美国国产综合一区二区| 亚洲欧美日韩国产综合| 亚洲人精品午夜| 亚洲最大成人综合| 亚洲国产一区二区三区| 亚洲最快最全在线视频| 亚洲人成网站影音先锋播放| 日韩美女精品在线| 一区二区三国产精华液| 亚洲精品视频观看| 亚洲国产另类av| 日韩综合小视频| 男人的天堂久久精品| 免费久久精品视频| 国精产品一区一区三区mba桃花| 激情综合网最新| 国产高清在线观看免费不卡| 不卡在线视频中文字幕| 99精品国产91久久久久久| 91国产精品成人| 久久久亚洲精品一区二区三区| 国产欧美日韩在线视频| 亚洲日本一区二区| 日韩av网站在线观看| 加勒比av一区二区| av资源网一区| 欧美日韩视频第一区| 精品少妇一区二区三区在线视频 | 自拍偷拍亚洲激情| 亚洲一二三四区| 久久精品国产精品亚洲红杏| 粉嫩aⅴ一区二区三区四区五区| 91福利国产精品| 久久综合九色综合97婷婷女人| 国产午夜精品久久久久久久| 亚洲欧美激情插| 久久精品国产秦先生| 白白色亚洲国产精品| 欧美一级一区二区| 国产精品伦理在线| 蜜臀91精品一区二区三区| 99在线精品视频| 精品美女在线播放| 亚洲午夜国产一区99re久久| 国产乱码精品1区2区3区| 欧美午夜不卡视频| 国产视频一区不卡| 天堂一区二区在线| 99久久99久久精品免费看蜜桃| 欧美丰满高潮xxxx喷水动漫| 久久久久久久久99精品| 亚洲自拍欧美精品| 成人免费观看av| 精品av久久707| 亚洲高清一区二区三区| 成人丝袜高跟foot| 欧美一级欧美三级| 亚洲亚洲人成综合网络| 成人精品视频一区二区三区| 日韩欧美资源站| 亚洲444eee在线观看| jizz一区二区| 久久久久久久久伊人| 日本成人中文字幕| 日本韩国一区二区| 中文字幕制服丝袜一区二区三区 | 中文字幕一区日韩精品欧美| 裸体一区二区三区| 欧美福利电影网| 亚洲综合丁香婷婷六月香| 99vv1com这只有精品| 国产欧美日本一区视频| 精品亚洲成a人在线观看| 欧美一级高清片在线观看| 亚洲高清免费在线| 欧美午夜不卡视频| 亚洲一区视频在线| 欧美亚洲国产一区二区三区va| 亚洲精品中文在线| 91小视频免费观看| 亚洲视频1区2区| 99天天综合性| 国产精品美女一区二区在线观看| 国产麻豆成人精品| 国产亚洲欧美日韩在线一区| 国产一区二区三区免费看| 精品国产露脸精彩对白| 久久精品国产成人一区二区三区 | 久久er99精品| 精品国产污污免费网站入口| 久久se这里有精品|