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

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

?? 語法分析程序.txt

?? 該語言的語法在《編譯原理與實踐》第九章附錄中有詳細的介紹
?? TXT
字號:
/*************************************************************************
 *                           語法分析1:遞歸子程序法
 *
 * 問題描述:設定好自己的文法
 *           從控制臺讀取文件,運用以上文法進行語法分析。
 *           將分析結果顯示在屏幕上并存入另一文件中。
 *
 * 說明:1、采用功能獨立的小函數段實現。
 *       2、使用遞歸子程序法。
 *       3、內碼對照表見《編譯方法》(馬知行,曹啟君編)P167。
 *       4、本程序實現過程未參照上述書上。
 *       5、本程序在原有詞法分析程序基礎上修改而成。
 *       6、所讀取文件和存儲文件在本工程所在目錄下。
 *       7、定義文法:(讀取文件以"#"結尾)
 *          (1)主函數:S()
 *          void main()
 *          {
 *             整型定義;
 *             整型定義;
 *             for循環;
 *             if判斷;
 *             return;
 *          }
 *          (2)整型定義或賦值(a為任一標示符):A()
 *          int a=2;
 *          或:
 *          a=3;
 *          (3)for循環:B()
 *          for(i=0;i<3;i++)(i為任一標示符)
 *          {
 *             整型賦值;
 *          }
 *          (4)if判斷:C()
 *          if(a=0)
 *          {
 *             整型賦值;
 *          }
 *
 ************************************************************************/
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include<process.h>
#include<iostream.h>
#define LENKEY 15 
#define LENSIGN 17  
#define WRITEFILE "D:\\write.txt"

struct{
	char name[31];  
	int addr;
}word[1000];                        //word[1000]: 存儲已分析單詞的名稱和內碼
char *keyword[LENKEY] = {"program","const","var","integer","long","procedure","if","then","while","do","read","write","begin","end","odd"};
char *sign[LENSIGN] = {"+","-","*","/","=","<>","<","<=",">",">=",".",",",";",":",":=","(",")"};
FILE *f,*fw;
int totalwords = 0;                 //totalwords: 當前已分析單詞的數量
int next=0;                         //next: 當前的單詞序號
char w[20];

void SaveWords(int,char *[]);       //SaveWords(): 將文件中的單詞存入word[]中
void get_w();                       //get_w(): 讀取一個單詞
void S();                           //S(): 分析main()函數
void A();                           //A(): 分析整型定義和賦值
void B();                           //B(): 分析for循環
void C();                           //C(): 分析if判斷

void OpenFile(char *,char *);       //OpenFile(): 打開文件
void ReadLine(FILE *,char []);      //ReadLine(): 讀取文件中一行
void DealLine(char []);             //DealLine(): 處理一行
bool Analyse(char []);              //Analyse(): 分析一個單詞
bool AnalyseSign(char []);          //AnalyseSign(): 分析一個符號單詞
bool AnalyseAlpha(char a[]);        //AnalyseAlpha(): 分析一個關鍵字或標示符單詞
bool AnalyseNum(char n[]);          //AnalyseNum(): 分析一個整數單詞
void DealError(char []);            //DealError(): 處理錯誤信息
void DealResult(FILE *);            //DealResult(): 輸出結果,并將結果寫入文件

/*************************************************************************
 * 主函數
 ************************************************************************/
void main(int argc,char *argv[])
{
	SaveWords(argc,argv);
	//語法分析
	get_w();
	S();
	get_w();
	if(strcmp(w,"#")!=0)
	{
		cout<<""<<endl;
		fprintf(fw,"Error!");
	}
	return;
	fclose(fw);
}
/*************************************************************************
 * 函數名稱:
 *   get_w()
 * 參數:
 *   無。
 * 返回值:
 *   空。
 * 功能:
 *   從word[]中讀取一個單詞。
 ************************************************************************/
void get_w()
{
	strcpy(w,word[next].name);
	next++;
}
/*************************************************************************
 * 函數名稱:
 *   S()
 * 參數:
 *   無。
 * 返回值:
 *   空。
 * 功能:
 *   分析主函數。
 ************************************************************************/
void S()
{
	if(strcmp(w,"void")==0)
	{
		get_w();
		if(strcmp(w,"main")==0)
		{
			get_w();
			if(strcmp(w,"(")==0)
			{
				get_w();
				if(strcmp(w,")")==0)
				{
					get_w();
					if(strcmp(w,"{")==0)
					{
						get_w();
						A();              //定義整型變量
						get_w();
						A();              //定義整型變量
						get_w();
						B();              //判斷for循環
						get_w();
						C();              //判斷if判斷
						get_w();
						if(strcmp(w,"return")==0)
						{
							get_w();
							if(strcmp(w,";")==0)
							{
								get_w();
								if(strcmp(w,"}")==0)
								{
									cout<<"符合所定義語法"<<endl;
									fprintf(fw,"符合所定義語法");
									return;
								}
							}
						}

					}
				}
			}
		}

	}
	cout<<"不符合所定義語法"<<endl;
	fprintf(fw,"不符合所定義語法");
	return;
}
/*************************************************************************
 * 函數名稱:
 *   A()
 * 參數:
 *   無。
 * 返回值:
 *   空。
 * 功能:
 *   分析整型定義或賦值。
 ************************************************************************/
void A()
{
	if(strcmp(w,"int")==0)
	{
		get_w();
		if(word[next-1].addr==34)
		{
			get_w();
			if(strcmp(w,"=")==0)
			{
				get_w();
				if(word[next-1].addr==33)
				{
					get_w();
					if(strcmp(w,";")==0)
						return;
				}
			}
		}
	}
	else if(word[next-1].addr==34)
	{
		get_w();
		if(strcmp(w,"=")==0)
		{
			get_w();
			if(word[next-1].addr==33)
			{
				get_w();
				if(strcmp(w,";")==0)
					return;
			}
		}
	}
	cout<<"A不符合整型定義"<<endl;
	fprintf(fw,"A不符合整型定義");
	return;

}
/*************************************************************************
 * 函數名稱:
 *   B()
 * 參數:
 *   無。
 * 返回值:
 *   空。
 * 功能:
 *   分析for循環。
 ************************************************************************/
void B()
{
	if(strcmp(w,"for")==0)
	{
		get_w();
		if(strcmp(w,"(")==0)
		{
			get_w();
			A();  //i=0
			get_w();
			if(word[next-1].addr==34)
			{
				get_w();
				if(strcmp(w,"<")==0)
				{
					get_w();
					if(word[next-1].addr==33)
					{
						get_w();
						if(strcmp(w,";")==0)
						{
							get_w();
							if(word[next-1].addr==34)
							{
								get_w();
								if(strcmp(w,"+")==0)
								{
									get_w();
									if(strcmp(w,"+")==0)
									{
										get_w();
										if(strcmp(w,")")==0)
										{											
											get_w();
											if(strcmp(w,"{")==0)
											{
												get_w();
												A();
												get_w();
												if(strcmp(w,"}")==0)
												{					
													return;
												}
											}
										}
									}
								}

							}
						}
					}
				}
			}
		}
	}
	cout<<"B不符合for循環定義"<<endl;
	fprintf(fw,"B不符合for循環定義");
}
/*************************************************************************
 * 函數名稱:
 *   C()
 * 參數:
 *   無。
 * 返回值:
 *   空。
 * 功能:
 *   判斷if語句。
 ************************************************************************/
void C()//if判斷
{
	if(strcmp(w,"if")==0)
	{
		get_w();
		if(strcmp(w,"(")==0)
		{
			get_w();
			if(word[next-1].addr==34)
			{
				get_w();
				if(strcmp(w,"=")==0)
				{
					get_w();
					if(strcmp(w,"=")==0)
					{
						get_w();
						if(word[next-1].addr==33)
						{
							get_w();
							if(strcmp(w,")")==0)
							{
								get_w();
								if(strcmp(w,"{")==0)
								{
									get_w();
									A();
									get_w();
									if(strcmp(w,"}")==0)
									{					
										return;
									}
								}
							}
						}
					}
				}
			}
		}
	}
	cout<<"C不符合if循環定義"<<endl;
	fprintf(fw,"C不符合if循環定義");
}
/*************************************************************************
 * 函數名稱:
 *   SaveWords()
 * 參數:
 *   int argc2         - 控制臺輸入的參數個數;
 *   char *argv2[]     - 控制臺輸入的參數。
 * 返回值:
 *   空。
 * 功能:
 *   將文件中讀取的單詞存入word[]中。
 ************************************************************************/
void SaveWords(int argc2,char *argv2[])
{
	FILE *fread,*fwrite;
	char line[200];
    //打開文件
	OpenFile(argv2[2],"w");
	fw=f;
	OpenFile(argv2[1],"r");
	fread=f;
	if(argc2<3)OpenFile(WRITEFILE,"w");
	else OpenFile(argv2[2],"w");
	fwrite=f;
	//讀取一行,處理一行
	while(!feof(fread))
	{
		ReadLine(fread,line);
		DealLine(line);
	}
	//關閉文件
	fclose(fread);
	fclose(fwrite);
}
/*************************************************************************
 * 函數名稱:
 *   OpenFile()
 * 參數:
 *   char *route       - 文件所在路徑;
 *   char *manner      - 文件打開方式。
 * 返回值:
 *   空。
 * 功能:
 *   打開文件。
 ************************************************************************/
void OpenFile(char *route,char *manner)
{
	if((f = fopen(route,manner))==NULL)
	{
		printf("connot open the file\n");
		exit(0);
	}
}
/*************************************************************************
 * 函數名稱:
 *   ReadLine()
 * 參數:
 *   FILE *f           - 所要讀取的文件;
 *   char line[]       - 讀到的一行。
 * 返回值:
 *   空。
 * 功能:
 *   讀取文件中的一行。
 ************************************************************************/
void ReadLine(FILE *f,char line[])
{
	if(feof(f))return;
	int i=0;
	char ch = fgetc(f);
	while(ch!='\n'&&!feof(f))
	{
		line[i]=ch;
		i++;
		ch = fgetc(f);
	}
	line[i] = '\0';
	return;
}
/*************************************************************************
 * 函數名稱:
 *   DealLine()
 * 參數:
 *   char line[]       - 已讀取的文件中的一行。
 * 返回值:
 *   空。
 * 功能:
 *   處理已讀取的文件中的一行。
 ************************************************************************/
void DealLine(char line[])
{
	int i=0,n=0;
	char str[30];
	while(line[i]!='\0')
	{
		//略去空格
		while(isspace(line[i]))
			i++;
		//關鍵字、標示符、無符號整數(字母、數字、下劃線的組合)
		while((line[i]!='\0')&&(isalnum(line[i])||isalpha(line[i])||line[i]=='_'))
		{
			str[n]=line[i];
			n++;
			i++;
		}
		if(n>0)
		{
			str[n]='\0';
			if(!Analyse(str))
			{
				i=i-strlen(str);
				str[0]=line[i];
				str[1]='\0';
				i++;
				Analyse(str);
			}
			n=0;
		}
		//符號、錯誤詞法
		while((line[i]!='\0')&&(!isalnum(line[i]))&&(!isalpha(line[i]))&&(line[i]!='_'))
		{
			while(isspace(line[i]))
				i++;
			if((line[i]!='\0')&&((isalnum(line[i]))||(isalpha(line[i]))||(line[i]=='_')))break;
			str[n]=line[i];
			n++;
			i++;
		}
		if(n>0)
		{
			str[n]='\0';
			if(!Analyse(str))
			{
				i=i-strlen(str);
				str[0]=line[i];
				str[1]='\0';
				i++;
				Analyse(str);
			}
			n=0;
		}
	}
	return;	
}
/*************************************************************************
 * 函數名稱:
 *   Analyse()
 * 參數:
 *   char str[]        - 在一行中提取的一個單詞。
 * 返回值:
 *   true              - 處理無異常。
 *   false             - 該單詞包含相鄰的字符,需退出重新劃分單詞。
 * 功能:
 *   分析一個單詞。
 ************************************************************************/
bool Analyse(char str[])
{
	int n=0,i=0,num=0;
	//以字母或下劃線開頭
	if((isalpha(str[0]))||(str[0]=='_'))
		AnalyseAlpha(str);
	//以數字開頭
	else if(isalnum(str[0]))
	{
		if(!AnalyseNum(str))
			DealError(str);
	}
	//其它情況
	else
	{
		//多個符號相鄰的情況
		if((strlen(str)>1)&&(strcmp(str,"<>")!=0)&&(strcmp(str,"<=")!=0)&&(strcmp(str,">=")!=0)&&(strcmp(str,":=")!=0))
			return false;
		if(!AnalyseSign(str))
			DealError(str);
	}
	return true;
}
/*************************************************************************
 * 函數名稱:
 *   AnalyseAlpha()
 * 參數:
 *   char a[]          - 待分析的字母和數字組合單詞。
 * 返回值:
 *   true              - 屬于內部碼中的單詞。
 * 功能:
 *   分析一個單詞是否是關鍵字或標示符。
 ************************************************************************/
bool AnalyseAlpha(char a[])
{
	int i=0;
	for(i=0;i<LENKEY;i++)
	{
		if(!strcmp(a,keyword[i]))
		{
			strcpy(word[totalwords].name,keyword[i]);
			word[totalwords].addr = i+1;
			totalwords++;
			return true;
		}
	}
	strcpy(word[totalwords].name,a);
	word[totalwords].addr = 34;
	totalwords++;
	return true;
}
/*************************************************************************
 * 函數名稱:
 *   AnalyseNum()
 * 參數:
 *   char n[]          - 待分析的符號單詞。
 * 返回值:
 *   true              - 屬于內部碼中的單詞。
 *   false             - 不屬于內部碼中的無符號整數。
 * 功能:
 *   分析一個單詞是否是內部碼中的無符號整數。
 ************************************************************************/
bool AnalyseNum(char n[])
{
	int i=0;
	for(i=0;i<(int)strlen(n);i++)
		if(n[i]<'0'||n[i]>'9')
			return false;
	strcpy(word[totalwords].name,n);
	word[totalwords].addr = 33;
	totalwords++;
	return true;
}
/*************************************************************************
 * 函數名稱:
 *   AnalyseSign()
 * 參數:
 *   char s[]          - 待分析的符號單詞。
 * 返回值:
 *   true              - 屬于內部碼中的單詞。
 *   false             - 不屬于內部碼中的符號單詞。
 * 功能:
 *   分析一個單詞是否是內部碼中的符號單詞。
 ************************************************************************/
bool AnalyseSign(char s[])
{
	int i=0;
	for(i=0;i<LENSIGN;i++)
	{
		if(!strcmp(s,sign[i]))
		{
			strcpy(word[totalwords].name,s);
			word[totalwords].addr = i+16;
			totalwords++;
			return true;
		}
	}
	if(!strcmp(s,"#"))
	{
		strcpy(word[totalwords].name,s);
		word[totalwords].addr = 35;
		totalwords++;
		return true;
	}
	return false;
}
/*************************************************************************
 * 函數名稱:
 *   DealError()
 * 參數:
 *   char str[]        - 錯誤的單詞。
 * 返回值:
 *   空。
 * 功能:
 *   處理錯誤單詞。
 ************************************************************************/
void DealError(char str[])
{
	strcpy(word[totalwords].name,str);
	word[totalwords].addr = 36;
	totalwords++;
	return;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国一区二区视频| 欧美日韩国产另类不卡| 国产高清不卡一区| 精品一区二区免费看| 美腿丝袜在线亚洲一区| 日韩中文字幕区一区有砖一区| 亚洲激情五月婷婷| 一区二区成人在线视频| 亚洲综合色视频| 午夜精品成人在线| 三级影片在线观看欧美日韩一区二区| 亚洲自拍偷拍九九九| 亚洲国产一区视频| 日韩国产欧美在线播放| 免费日韩伦理电影| 国内成人精品2018免费看| 激情六月婷婷综合| 成人国产精品免费| 色综合久久九月婷婷色综合| 欧美性videosxxxxx| 欧美一激情一区二区三区| 欧美一区二区视频在线观看2022| 日韩一区二区免费在线观看| 精品国产亚洲在线| 国产婷婷精品av在线| 国产精品成人一区二区艾草| 亚洲人成在线观看一区二区| 亚洲曰韩产成在线| 日韩av一二三| 国产精品99久| 91国偷自产一区二区开放时间 | 亚洲国产精品久久艾草纯爱| 午夜伊人狠狠久久| 激情五月激情综合网| av福利精品导航| 欧美视频自拍偷拍| 精品精品国产高清一毛片一天堂| 国产色91在线| 亚洲一区视频在线观看视频| 日韩精品亚洲一区二区三区免费| 国产精品一二一区| 色婷婷国产精品| 日韩欧美高清一区| 亚洲国产精品传媒在线观看| 亚洲免费观看高清完整版在线 | 青娱乐精品在线视频| 国产精品小仙女| 欧美羞羞免费网站| 久久精品网站免费观看| 久久不见久久见免费视频7| 国产精品一二三在| 欧美绝品在线观看成人午夜影视| 国产日产欧美精品一区二区三区| 亚洲另类春色校园小说| 久久se精品一区精品二区| 色综合色狠狠天天综合色| 2021国产精品久久精品| 亚洲国产精品天堂| 成人一区二区视频| 欧美精品视频www在线观看 | 开心九九激情九九欧美日韩精美视频电影| 国产凹凸在线观看一区二区| 欧美精品丝袜中出| 亚洲人成精品久久久久久| 久久不见久久见免费视频1| 欧美综合一区二区| 国产精品天美传媒沈樵| 久久精品国产亚洲5555| 欧美午夜精品久久久| 国产精品理伦片| 国产在线视频精品一区| 3atv在线一区二区三区| 亚洲精选视频在线| 国产a精品视频| 精品少妇一区二区三区在线播放 | 一区二区三区四区中文字幕| 国产一区二区免费视频| 欧美久久久久久蜜桃| 日韩理论片一区二区| 国产盗摄视频一区二区三区| 日韩欧美国产综合| 亚洲一区二区不卡免费| 91麻豆免费观看| 国产精品九色蝌蚪自拍| 懂色中文一区二区在线播放| 欧美变态口味重另类| 舔着乳尖日韩一区| 日本韩国精品在线| 亚洲国产精品黑人久久久| 久久99精品久久久久久动态图| 欧美人动与zoxxxx乱| 亚洲综合一区在线| 91免费视频大全| 亚洲人成网站色在线观看| 成人免费视频免费观看| 日本一区二区三区视频视频| 蜜桃一区二区三区四区| 欧美日韩1234| 亚洲一区在线播放| 欧美体内she精高潮| 亚洲一区精品在线| 欧美午夜精品电影| 天堂一区二区在线免费观看| 日本道在线观看一区二区| 国产精品第五页| 色综合久久综合网欧美综合网| 亚洲视频免费观看| 91在线视频网址| 亚洲蜜桃精久久久久久久| aaa亚洲精品| 一区二区三区久久久| 日本二三区不卡| 亚洲福利视频导航| 欧美一区二区三区免费| 美女看a上一区| www亚洲一区| 大胆欧美人体老妇| 亚洲日本丝袜连裤袜办公室| 一道本成人在线| 亚洲第一在线综合网站| 欧美精品日韩一区| 六月婷婷色综合| 精品国产一区二区三区久久久蜜月 | 午夜精品福利在线| 91精品国产黑色紧身裤美女| 久久精品国产网站| 亚洲国产精品二十页| 欧美最猛黑人xxxxx猛交| 日韩av午夜在线观看| 久久免费精品国产久精品久久久久| 国产99久久久精品| 综合电影一区二区三区| 欧美午夜一区二区三区| 久久国产人妖系列| 国产精品短视频| 欧美日韩国产美| 国产一区二区在线观看免费| 国产精品久久久久久户外露出 | 国产精品免费av| 日本韩国视频一区二区| 三级在线观看一区二区| 久久日一线二线三线suv| 99精品视频在线播放观看| 日韩国产一二三区| 国产精品你懂的在线| 欧美日韩一级二级| 国产成人综合在线播放| 一区二区免费视频| 久久色视频免费观看| 欧美天天综合网| 国产一区二区三区电影在线观看 | 麻豆成人免费电影| 中文字幕一区三区| 91精品在线观看入口| 成人免费视频免费观看| 日本不卡不码高清免费观看| 国产免费成人在线视频| 欧美精选午夜久久久乱码6080| 国产美女在线精品| 亚洲一级二级在线| 久久久久9999亚洲精品| 精品视频在线视频| 国产精品1024| 免费的国产精品| 一区二区三区在线视频观看| 国产色综合一区| 不卡的电影网站| 欧美日韩亚洲综合| 精品日韩一区二区| 久久网站热最新地址| 国产精品久久久久一区| 亚洲综合免费观看高清完整版| 一区av在线播放| 国产福利一区二区三区| 欧美区视频在线观看| 国产亚洲精品aa午夜观看| 亚洲成人午夜电影| 成人一级视频在线观看| 555夜色666亚洲国产免| 欧美激情一区二区三区在线| 亚洲综合视频网| 风流少妇一区二区| 欧美电影免费观看高清完整版在| 国产麻豆午夜三级精品| 日韩成人av影视| 中文字幕在线一区| 欧美mv和日韩mv的网站| 色av一区二区| jvid福利写真一区二区三区| 国产一区 二区 三区一级| 久久精品国产亚洲a| 图片区日韩欧美亚洲| 亚洲精品国产无天堂网2021 | 亚洲欧美一区二区在线观看| 久久久久久久久久久电影| 日韩精品最新网址| 日韩一区国产二区欧美三区| 欧美日韩国产一二三| 欧洲国产伦久久久久久久| 91国在线观看|