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

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

?? ll1.cpp

?? 本程序作為計算機學院編譯原理課程試驗的一部分
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/************************************************************************/
/*		            Arther:         涂靖								*/
/*		            StudentNumber:  1050320124                          */
/*		            ClassName:      編譯原理                            */
/*		            Program:        LL1語法分析							*/
/*		            Data:			2008.4.12                           */
/*
文件說明:
	Vset.txt			  非終結符文件
	Tset.txt			  終結符文件
	Grammar.txt			  語法文件
	Sentence.txt		  句型文件
	Ana_table.txt		  分析表文件									*/
/************************************************************************/
//------------------------頭文件--------------------------------
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>

//------------------------宏定義--------------------------------
#define END_SYM      0                 //空
#define MAX_SYM_LEN  20                //符號最大長度
#define MAX_SET_NUM  100               //集合最大數量
#define MAX_BODY_LEN 100               //產生式右部最大長度
#define MAX_GRA_NUM  100               //文法最大數目
#define MAX_SEN_NUM  200               //句型中符號最大數目
#define MAX_STACK_NUM 50               //棧大小
#define MAX_GRA_BODY_LEN  6            //文法句子右部最大長度

//-----------------------函數聲明--------------------------------
void readingrammar();                  //從文件讀入文法
void outputgrammar();                  //輸出文法
void find_empty_position();            //找到空在非終結符集合中的位置
void cal_first_set();                  //計算first集函數(調用cal_first()函數)
void cal_first(int first_vn_num);      //計算每個非終結符的first集函數
void output_first_set();               //輸出first集
void cal_follow_set();                 //計算follow集函數(調用cal_follow()函數)
void cal_follow(int follow_vn_num);    //計算每一個非終結符的follow集函數
void output_follow_set();              //輸出follow函數
void construct_analyse_table();        //構建分析表
void output_analyse_table();           //輸出分析表
void readintsentence();                //從文件讀入要分析的句型
void analyse();                        //分析函數
//------------------------數據結構聲明------------------------------------

struct symbol{//每個標示符(關鍵子)的結構
	char sym[MAX_SYM_LEN];  //存儲標示符
	int code;               //存儲標示符的編碼
};

struct grammar{//每句文法的機構(注意:存儲的都是符號編碼后的數字)
	int head;               //左部
	int body[MAX_BODY_LEN]; //右部
	int body_len;           //右部長度
	int first[MAX_SET_NUM]; //本句文法的first集
	int first_len;          //本句文法的first集長度
};

struct ele{//(first or follow)集合元素(編碼)   
	int vn;                 //集合元素對應的非終結符
	int vt[MAX_SET_NUM];    //集合元素對應的終結符集合
	int vt_len;             //終結符集合個數
	int flag_empty;         //標志first集中是否含空
	int flag_cla;           //標志集合是否已經被計算過
};

struct analyse_ele{//分析表的元素(編碼)
	int head;               //對應句子的左部
	int body[MAX_BODY_LEN]; //對應句子的右部
	int body_len;           //右部長 
	int flag;               //標志該元素在分析表是否為空
};

//------------------------全局變量聲明------------------------------------
//文件指針,分別為非終結符文件,終結符文件,語法文件,句型文件和分析表文件指針
FILE *vfp, *tfp, *gfp, *sfp, *afp;         
struct symbol vset[MAX_SET_NUM];         //非終結符集合
struct symbol vtset[MAX_SET_NUM];         //終結符集合
struct symbol vtset_for_ana[MAX_SET_NUM]; //分析表中終結符集合
struct symbol sentence[MAX_SEN_NUM];      //存儲從文件讀入的要分析的句型
int vset_num;              //非終結符個數
int vtset_num;              //終結符個數
int vtset_for_ana_num;      //分析表中終結符個數
int sen_sym_num;            //要分析的句型中標示符個數
struct grammar gra_list[MAX_GRA_NUM];      //存儲文法
int gra_lis_num;            //文法句子的數目
struct ele first_set[MAX_SET_NUM];   //first集
struct ele follow_set[MAX_SET_NUM];  //follow集
int first_set_num;          //first集中元素個數
int follow_set_num;         //follow集中元素個數
int empty_position;         //空的在終結符集合中位置
struct analyse_ele analyse_table[MAX_SET_NUM][MAX_SET_NUM]; //分析表
int row_num;    //分析表的行數
int col_num;    //分析表的列數
int analyse_stack[MAX_STACK_NUM];     //分析棧
int top;        //棧頂

//***************************主函數**********************************
int main()
{
	//打開文件
	if ((vfp = fopen("Vset.txt","r"))==NULL)
	{
		printf("open file:vsetFile error.\n");
		return 0;
	}
	if ((tfp = fopen("Tset.txt","r"))==NULL)
	{
		printf("open file:vtsetFile error.\n");
		return 0;
	}
	if ((gfp = fopen("Grammar.txt","r"))==NULL)
	{
		printf("open file:grammarFile error.\n");
		return 0;
	}
	
	if((sfp = fopen("Sentence.txt", "r"))==NULL)
	{
		printf("open file:test_sentenceFile error.");
		return 0;
	}
	readingrammar();           //從文件讀入文法
	outputgrammar();           //把文法輸出到標準輸出	
	find_empty_position();     //找到空在終結符集合中的位置
	cal_first_set();           //計算文法的first集
	output_first_set();        //輸出文法的first集
	cal_follow_set();          //計算文法的follow集
	output_follow_set();       //輸出文法的follow集
	construct_analyse_table(); //構造文法的分析表
	output_analyse_table();    //輸出分析表到文件
	readintsentence();         //從文件讀入要分析的句型
	analyse();                 //對要分析的句型進行分析,并輸出分析要用到的文法語句序列
	
	fclose(vfp);				//關閉文件
	fclose(tfp);
	fclose(gfp);
	fclose(sfp);
	
	return 0;
}

//*****************************函數實現過程******************************

void readingrammar()	  //讀入文法
{
	int vnindex = 0;
	char ch1;
	while (!feof(vfp))    //讀入文法中的非終結符 
	{
		int v=0;
		ch1=fgetc(vfp);
		do{	
			vset[vnindex].sym[v]=ch1;
			v++;
			ch1=fgetc(vfp);
		}while(isalnum(ch1));
		vset[vnindex].sym[v]='\0';
		vset[vnindex].code = -(vnindex+1);//對非終結符編碼
 		vnindex++;
	}
	vset_num = vnindex;   //得到文法中非終結符個數
	
	int vtindex = 0;
	char ch2;
	while (!feof(tfp))    //讀入文法中的終結符 
	{
		int v=0;
		ch2=fgetc(tfp);
		do{	
			vtset[vtindex].sym[v]=ch2;
			v++;
			ch2=fgetc(tfp);
		}while(isalnum(ch2));
		vtset[vtindex].sym[v]='\0';
		vtset[vtindex].code = (vtindex+1);//對終結符編碼
		vtindex++;
	}
	vtset_num = vtindex;   //得到文法中終結符個數
	
	int grmindex = 0;      //文法句子計數
	char ch;
	char buffer[MAX_SYM_LEN]="";
	int gra_col_num=0;     //文法列計數
	while(!feof(gfp))
	{
		ch = fgetc(gfp);
		if (ch == ' ' )    //空格
			;
		else if(ch=='-' && fgetc(gfp) == '>') //->
			;
		else if (isalpha(ch))   //字母
		{
			int j = 0;
			int flag=0;
			do 
			{
				buffer[j] = ch;
				ch = fgetc(gfp);
				j++;
			} while(isalnum(ch));
			buffer[j]='\0';
			ungetc(ch,gfp);
			int i;
			for (i=0; i<vtset_num; i++)
			{
				if ((strcmp(buffer,vtset[i].sym))==0)
				{
					flag=1;
					break;
				}
			}
			if(flag==1)        //終結符
			{
				if (i<vtset_num)
				{
					if (gra_col_num == 0)
					{
						gra_list[grmindex].head = vtset[i].code;
						gra_col_num++;
					}
					else
					{
						gra_list[grmindex].body[gra_col_num-1] = vtset[i].code;
						gra_col_num++;
					}					
				}
				else
				{
					printf("vt error\n");
				}
			}
			else              //非終結符
			{
				for (i=0; i<vset_num; i++)
				{
					if ((strcmp(buffer,vset[i].sym))==0)
					{
						break;
					}
				}
				if (i<vset_num)	
				{
					if (gra_col_num == 0)
					{
						gra_list[grmindex].head = vset[i].code;
						gra_col_num++;
					}
					else
					{
						gra_list[grmindex].body[gra_col_num-1] = vset[i].code;
						gra_col_num++;
					}
				}
				else
				{
					printf("%d vn error\n",grmindex);
				}
			}		
		}
		else if (ch == '\n' || feof(gfp))  //回車或文件結束
		{
			gra_list[grmindex].body_len = gra_col_num - 1;
			grmindex ++;
			gra_col_num = 0; //列計數置0
		}
		else  //操作符
		{
			if (ch=='<'||ch=='>')  //< 或>號,有可能下個是=號
			{
				char ch1;
				ch1=fgetc(gfp);
				if (ch1=='=')
				{
					buffer[0]=ch;
					buffer[1]=ch1;
					buffer[2]='\0';
				}
				else
				{
					ungetc(ch1,gfp);
					buffer[0]=ch;
					buffer[1]='\0';
				}
			}
			else   //其他為單操作符
			{
				buffer[0] = ch;
				buffer[1] ='\0';
			}
			int i;
			for (i=0; i<vtset_num; i++)
			{
				if ((strcmp(buffer,vtset[i].sym))==0)
				{
					break;
				}
			}
			if (i<vtset_num)	
			{
				if (gra_col_num == 0)
				{
					gra_list[grmindex].head = vtset[i].code;
					gra_col_num++;
				}
				else
				{
					gra_list[grmindex].body[gra_col_num-1] = vtset[i].code;
					gra_col_num++;
				}
			}
			else
			{
				printf("%d op error\n",grmindex);
			}			
		}
	}
	gra_list[grmindex].body_len = gra_col_num - 1; //得到句子右部長度
	grmindex++;
	gra_lis_num = grmindex;   //得到文法句子數
}

void outputgrammar()		  //輸出文法
{
	printf("==============================\n");
	printf("grammar:\n------------------------------\n");
	for (int i=0; i<gra_lis_num;i++)
	{
		printf("%s-> ",vset[-gra_list[i].head-1].sym);
		for (int j=0; j<gra_list[i].body_len; j++)
		{
			if(gra_list[i].body[j]<0)
				printf("%s ",vset[-gra_list[i].body[j]-1].sym);
			else
				printf("%s ",vtset[gra_list[i].body[j]-1].sym);
		}
		printf("\n");
	}
	printf("==============================\n");
}


void readintsentence()			//讀入句型
{
	char ch='\0';
	sen_sym_num=0;  
	while(!feof(sfp)&&ch!='#')
	{
		ch = fgetc(sfp);
		if(ch==' '||ch=='\n'||ch=='\t')
			;
		else if(isalpha(ch))  //字母
		{
			int i=0;
			int flag=0;
			do
			{
				sentence[sen_sym_num].sym[i]=ch;
				i++;
				ch = fgetc(sfp);
			}while(isalnum(ch));
			ungetc(ch,sfp);
			if (ch=='#')
			{
				ch='\0';
			}
			sentence[sen_sym_num].sym[i]='\0';
			for(int j=0; j<vtset_for_ana_num; j++)
			{
				if((strcmp(sentence[sen_sym_num].sym,vtset_for_ana[j].sym))==0)
				{
					sentence[sen_sym_num].code=vtset_for_ana[j].code;
					flag=1;
					break;
				}
			}
			sen_sym_num++;
			if(flag==0)
			{
				printf("the sentence is not belong to this grammar\n");
				exit(0);
			}
		}
		else //非字母
		{
			int flag=0;
			sentence[sen_sym_num].sym[0]=ch;
			sentence[sen_sym_num].sym[1]='\0';
			for(int j=0; j<vtset_for_ana_num; j++)
			{
				if((strcmp(sentence[sen_sym_num].sym,vtset_for_ana[j].sym))==0)
				{
					sentence[sen_sym_num].code=vtset_for_ana[j].code;
					flag=1;
					break;
				}
			}
			sen_sym_num++;
			if(flag==0)
			{
				printf("the sentence is not belong to this grammar\n");
				exit(0);
			}
		}
	}
}

//函數:找到空在終結符集合(數組)中的位置
void find_empty_position()
{
	int i;
	for (i=0; i<vtset_num; i++)
		if ((strcmp("#", vtset[i].sym))==0)
			break;
	empty_position = i;
}
//函數:計算first集
void cal_first_set()
{
	for (int i=0; i<vtset_num; i++) //初始化
	{
		first_set[i].vn=vset[i].code;
		first_set[i].flag_cla=0;
		first_set[i].flag_empty=0;
		first_set[i].vt_len=0;
		for (int j=0; j<gra_lis_num; j++)
			if (gra_list[j].head==first_set[i].vn)
				if (gra_list[j].body[0]==vtset[empty_position].code)
					first_set[i].flag_empty=1;
	}
	first_set_num=vset_num;
	for (int k=0; k<vtset_num; k++)  //如果first集沒計算完
		if (first_set[k].flag_cla==0)//如果該first集沒有計算過
			cal_first(k);   //遞歸計算該非終結符的first集
}

//函數:計算每個非終結符的first集的遞歸函數
void cal_first(int first_vn_num)
{
	for(int i=0; i<gra_lis_num; i++)//對文法的每個句子
	{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女视频黄免费的久久 | 美国三级日本三级久久99| 色哟哟国产精品免费观看| 亚洲女人小视频在线观看| 色综合激情五月| 婷婷久久综合九色国产成人| 欧美一区二区免费观在线| 免费在线观看日韩欧美| 久久精品免费在线观看| 99re这里只有精品6| 亚洲大型综合色站| 欧美大胆一级视频| 粉嫩欧美一区二区三区高清影视| 亚洲欧洲色图综合| 欧美视频一区二区三区| 久久69国产一区二区蜜臀| 国产精品视频一二三| 欧美色中文字幕| 国产一区亚洲一区| 亚洲蜜桃精久久久久久久| 日韩一区二区三区av| 国产传媒久久文化传媒| 洋洋成人永久网站入口| 日韩免费一区二区三区在线播放| 国产成人在线视频网站| 亚洲国产日韩av| 国产亚洲午夜高清国产拍精品| 91蜜桃网址入口| 久久国产夜色精品鲁鲁99| 国产精品久久久久久久久晋中| 3atv在线一区二区三区| 成人黄色电影在线| 免费观看久久久4p| 亚洲美女电影在线| 日韩欧美亚洲国产精品字幕久久久| 国产黄色精品网站| 天堂影院一区二区| 综合自拍亚洲综合图不卡区| 日韩欧美亚洲一区二区| 91久久人澡人人添人人爽欧美| 精品亚洲porn| 亚洲福利国产精品| ...av二区三区久久精品| 日韩一级大片在线观看| 色婷婷精品大在线视频| 国产成人免费视频精品含羞草妖精| 亚洲国产视频在线| 中文字幕在线视频一区| 精品三级在线观看| 欧美综合一区二区| 国产·精品毛片| 久久国产日韩欧美精品| 五月婷婷另类国产| 玉米视频成人免费看| 久久久久久久国产精品影院| 欧美一区二区三区在线观看| 色乱码一区二区三区88| 国产精品白丝av| 久久国产精品72免费观看| 一级女性全黄久久生活片免费| 国产精品乱人伦| 久久蜜桃一区二区| 精品粉嫩超白一线天av| 欧美一区二区国产| 7799精品视频| 在线播放一区二区三区| 欧美一a一片一级一片| 91色乱码一区二区三区| 波多野结衣91| 99视频热这里只有精品免费| 福利一区二区在线观看| 国产成人亚洲综合a∨猫咪| 国产一区二区在线电影| 久久疯狂做爰流白浆xx| 国内外精品视频| 国内久久精品视频| 国产毛片精品国产一区二区三区| 精品一区二区三区在线播放视频| 精品亚洲国内自在自线福利| 美女视频网站久久| 美国三级日本三级久久99| 蜜桃视频一区二区| 国内精品嫩模私拍在线| 国产成人av电影在线| youjizz久久| 91片在线免费观看| 欧美日韩不卡一区二区| 日韩一区和二区| 久久婷婷综合激情| 国产精品第13页| 亚洲精品福利视频网站| 日韩制服丝袜av| 久热成人在线视频| 国产v日产∨综合v精品视频| av电影一区二区| 欧美视频你懂的| 欧美一级日韩免费不卡| 久久午夜免费电影| 亚洲视频一区在线观看| 亚洲第一激情av| 久久精品二区亚洲w码| 成人性生交大合| 欧美日韩一区二区三区免费看| 欧美电影一区二区三区| 精品播放一区二区| 国产婷婷精品av在线| 一区二区三区**美女毛片| 麻豆一区二区三| 99免费精品视频| 6080国产精品一区二区| 国产日产精品1区| 一区二区免费看| 国产一区二区三区四区在线观看 | 国产精品免费视频观看| 亚洲精品国产品国语在线app| 日韩国产在线观看一区| 国产精品主播直播| 欧美色图12p| 久久精品一区二区| 亚洲国产日韩a在线播放性色| 国产一区二区三区香蕉| 在线观看成人小视频| 久久综合999| 亚洲国产综合色| 国产999精品久久久久久绿帽| 欧美日韩亚州综合| 国产欧美1区2区3区| 日本aⅴ免费视频一区二区三区| www.一区二区| 精品国产一区a| 亚洲一区在线视频观看| 高清不卡在线观看| 欧美tickling挠脚心丨vk| 亚洲欧美日韩中文播放| 国产一区二区在线观看免费| 欧美精品v国产精品v日韩精品 | 国产精品 欧美精品| 欧美日韩免费高清一区色橹橹| 久久久99久久| 美日韩一区二区| 欧美性视频一区二区三区| 国产精品天美传媒| 激情深爱一区二区| 欧美一区二区三区在线看| 亚洲一区二区免费视频| 成人永久免费视频| 久久精品网站免费观看| 麻豆精品在线观看| 欧美二区三区的天堂| 亚洲美女少妇撒尿| 91视频在线观看| 国产精品久久久久久久久免费桃花| 精品亚洲国内自在自线福利| 欧美一区二区高清| 免费人成网站在线观看欧美高清| 91福利社在线观看| 中文字幕永久在线不卡| 福利视频网站一区二区三区| 国产日韩精品一区二区浪潮av| 久久草av在线| 精品久久久久久综合日本欧美 | 亚洲永久精品国产| 色综合网站在线| 亚洲尤物在线视频观看| 一本到不卡免费一区二区| 亚洲同性同志一二三专区| aaa欧美大片| 亚洲人精品午夜| 在线亚洲高清视频| 亚洲妇熟xx妇色黄| 91精品国产一区二区三区| 亚洲五码中文字幕| 欧美日韩国产电影| 日韩在线一区二区| 欧美一级免费大片| 久久电影网站中文字幕| 久久久亚洲高清| 成人av第一页| 一区二区三区在线视频观看58 | 人人狠狠综合久久亚洲| 日韩午夜精品视频| 国产综合色视频| 国产精品视频看| 日本道精品一区二区三区| 五月婷婷综合在线| 欧美tickling挠脚心丨vk| 国产凹凸在线观看一区二区| 亚洲人成人一区二区在线观看| 欧美怡红院视频| 看片网站欧美日韩| 国产精品美女久久福利网站| 色老汉一区二区三区| 五月综合激情婷婷六月色窝| 精品福利一二区| 99精品国产99久久久久久白柏| 亚洲国产精品欧美一二99| 精品日韩欧美在线| 97se亚洲国产综合自在线观| 亚州成人在线电影| 久久久不卡网国产精品一区|