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

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

?? 實驗3.cpp

?? 中間代碼生成 掌握語學制導下的中間代碼生成技術
?? CPP
?? 第 1 頁 / 共 2 頁
字號:

void prior_analysis()//自下而上分析
{
    int i,j,m;
    char q,str,ch[10];   
	push('#');//設置符號棧初值
	print(0,-1);	    
u:  readvt(&a);//當前輸入符號讀入a
    if(IsVT(stack[top]))//判斷是否為終結符
        j=top;
    else
        j=top-1;
	do 
	{	
        while(big(j,a)&&strcmp(stack,"#N")!=0)//j優先級高于a
		{
            do 
			{
                q=stack[j];
                if(IsVT(stack[j-1]))//判斷是否為終結符
                    j=j-1;
                else
                    j=j-2;
			}while(!less(j,q));
			i=-1;
			while((top-j)!=0)
			{
                ch[++i]=pop();
			}
			ch[i+1]='\0';
			for (m=0;m<=5;m++)//把最左素短語歸約為某個N
			{
				if(strcmp(word[m],ch)==0)
					str='N';
			}
			push(str);
            print(1,1);
		}
        if(less(j,a))//j優先級低于a
		{         
            push(a);
			print(0,-1);
			if(stack[top]!='#')
				goto u;
		}
        else
		{
            if(equal(j,a))//j優先級等于a
			{        
                push(a);
				print(0,0);
			    if(stack[top]!='#')
					goto u;
			}
			else
			{
				error1(j);//調用錯誤分析函數
				a='#';
			}
		}
	}while(a!='#');
}

//////////////////////////////////////////////////////////////////////////////////////////

void suanfu()//算符優先語法主函數
{
    cout<<"\n******************************算符優先語法分析程序******************************"<<endl;
	cout<<" E->E+T|E-T|T"<<endl;
	cout<<" T->T*F|T/F|F"<<endl;
	cout<<" F->(E)|i"<<endl;
	cout<<" E表示算術表達式.T表示項.F表示因子.i表示變量或常數."<<endl;
	cout<<"              優先表"<<endl;
	cout<<"     +   -   *   /   (   )   i   #"<<endl;
	cout<<" +   >   >   <   <   <   >   <   >"<<endl;
    cout<<" -   >   >   <   <   <   >   <   >"<<endl;
	cout<<" *   >   >   >   >   <   >   <   >"<<endl;
	cout<<" /   >   >   >   >   <   >   <   >"<<endl;
	cout<<" (   <   <   <   <   <   =   <   e1"<<endl;
	cout<<" )   >   >   >   >   e2  >   e2  >"<<endl;
	cout<<" i   >   >   >   >   e2  >   e2  >"<<endl;
	cout<<" #   <   <   <   <   <   e3  <   ="<<endl;
	ff=fopen("預處理.txt","r");
	char ch=fgetc(ff);
	char ch1;
	while(ch!='#')
	{
	    int i=-1,j=0,m=-1;
	    while(ch!='='&&ch!='#')
		{
			ch1=ch;
			ch=fgetc(ff);
			if((ch1=='>'||ch1=='<')&&ch=='=')
				ch=fgetc(ff);
		}
		if(ch=='#')
		{
		    cout<<endl;
			fclose(ff);
		    return;
		}
	    while(ch!=' '&&ch!='#')//得到算數表達式
		{
		    ch=fgetc(ff);
            oldstrings[++i]=ch;
		}
	    oldstrings[i]='\0';
	    if(isalnum(oldstrings[j]))
	        strings[++m]='i';
	    else
		    strings[++m]=oldstrings[j];
	    j++;
	    while(oldstrings[j]!='\0')//轉換為輸入串
		{
            if(isalnum(oldstrings[j]))
			{
			    if(isalnum(oldstrings[j-1])==0)
			        strings[++m]='i';
			}
		    else
			    strings[++m]=oldstrings[j];
		    j++;
		}
	    strings[m+1]='#';
	    strings[m+2]='\0';
	    cout<<"算術表達式"<<id<<"為: "<<oldstrings<<endl;
        cout<<"轉換為輸入串: "<<strings<<endl;	
        cout<<" 步驟號 符號棧 優先關系 當前分析符 剩余輸入串 動作";
	    prior_analysis();//自下而上分析
	    n=0;
		cout<<endl;
	    cout<<"算術表達式"<<id++<<"的"<<"歸約產生式步驟號為:";
   	    while(No[n])//記錄歸約產生式步驟號
		{
		    cout<<" "<<No[n];
	        n++;
		}
		cout<<endl;
		//回歸各全局變量初值
        while(stack[0]!='\0')
		    pop();
		while(No[--n])
		{
			No[n]='\0';
		}
	    top=-1;
	    a='\0';
	    k=0;
	    step=1;
	    n=0;
	}
}

/***********************************以下是語義分析部分***********************************/

//////////////////////////////////////////////////////////////////////////////////////////

void error(char *strError)//輸出掃描發現的錯誤
{
	fprintf(fw,"錯誤: %s\n",strError);
	printf("錯誤: %s\n",strError);
	return;
}

//////////////////////////////////////////////////////////////////////////////////////////

int Match(char syn,char *strError)//匹配當前識別出的單詞
{
	if(syn==uWord.syn&&(strcmp(strError,uWord.value.T1)==0)||strError[0]==uWord.value.T3)
	{
		Scaner();
		return 1;
	}
	else 
	{
		error(strError);
	    return 0;
	}
}

//////////////////////////////////////////////////////////////////////////////////////////

void gen(char *op,char *argv1,char *argv2,char *result)//生成一個四元式
{
	sprintf(pQuad[nNXQ].op,op);
	sprintf(pQuad[nNXQ].argv1,argv1);
	sprintf(pQuad[nNXQ].argv2,argv2);
	sprintf(pQuad[nNXQ].result,result);
	nNXQ++;
	return;
}

//////////////////////////////////////////////////////////////////////////////////////////

void PrintQuaternion()//打印四元式數組
{
	int nLoop;
	printf("********************************中間代碼生成程序********************************");
	for(nLoop=1;nLoop<nNXQ;nLoop++)
	{
		fprintf(fw,"\n%d:(%s,\t%s,\t%s,\t%s)",
			nLoop,pQuad[nLoop].op,pQuad[nLoop].argv1,
			pQuad[nLoop].argv2,pQuad[nLoop].result);
		printf("\n%d:(%s,\t%s,\t%s,\t%s)",
			nLoop,pQuad[nLoop].op,pQuad[nLoop].argv1,
			pQuad[nLoop].argv2,pQuad[nLoop].result);
	}
}

//////////////////////////////////////////////////////////////////////////////////////////

char *Newtemp()//產生一個臨時變量
{
	char *strTempID=(char *)malloc(MAXLENGTH);
	sprintf(strTempID,"T%d",++nSuffix);
	return strTempID;
}

//////////////////////////////////////////////////////////////////////////////////////////

int merge(int p1,int p2)//合并p1和p2
{
	int p,nResult;
	if(p2==0)
		nResult=p1;
	else
	{
		nResult=p=p2;
		while(atoi(pQuad[p].result))
		{
			p=atoi(pQuad[p].result);
			sprintf(pQuad[p].result,"%d",p1);
		}
	}
	return nResult;
}

//////////////////////////////////////////////////////////////////////////////////////////

void backpatch(int p,int t)//將t回填到以p為首的四元式中
{
	int w,q=p;
	while(q)
	{
		w=atoi(pQuad[q].result);
		sprintf(pQuad[q].result,"%d",t);
		q=w;
	}
}

//////////////////////////////////////////////////////////////////////////////////////////

char *Expression()//分析算術表達式函數
{
	char opp[MAXLENGTH],*eplace,*eplace1,*eplace2;		
	eplace=eplace1=Term();
	while(uWord.syn=='O'&&(strcmp(uWord.value.T1,"+")==0||strcmp(uWord.value.T1,"-")==0))
	{
		sprintf(opp,"%s",uWord.value.T1);
		Scaner();
		eplace2=Term();
		eplace=Newtemp();
		gen(opp,eplace1,eplace2,eplace);
		eplace1=eplace;
	}
	return eplace;
}

//////////////////////////////////////////////////////////////////////////////////////////

char *Term()//分析項函數
{
	char opp[2],*eplace1,*eplace2,*eplace;
	eplace=eplace1=Factor();
	while(uWord.syn=='O'&&(strcmp(uWord.value.T1,"*")==0||strcmp(uWord.value.T1,"/")==0))
	{
		sprintf(opp,"%s",uWord.value.T1);
		Scaner();
		eplace2=Factor();
		eplace=Newtemp();
		gen(opp,eplace1,eplace2,eplace);
		eplace1=eplace;
	}
	return eplace;
}

//////////////////////////////////////////////////////////////////////////////////////////

char *Factor()//分析因子函數
{
	char *eplace=(char *)malloc(MAXLENGTH);
	if(uWord.syn=='I'||uWord.syn=='C')
	{
		if(uWord.syn=='I')
			sprintf(eplace,"%s",uWord.value.T1);
		else
			sprintf(eplace,"%d",uWord.value.T2);
		Scaner();
	}
	else
	{
		Match('P',"(");
		eplace=Expression();
		Match('P',")");
	}
	return eplace;
}

//////////////////////////////////////////////////////////////////////////////////////////

void Condition(int *etc,int *efc)//分析布爾表達式函數
{
	char opp[3],*eplace1,*eplace2;
	char strTemp[4];
	eplace1=Expression();
	if(uWord.syn=='O'&&(strcmp(uWord.value.T1,"+")!=0&&strcmp(uWord.value.T1,"-")!=0
		&&strcmp(uWord.value.T1,"*")!=0&&strcmp(uWord.value.T1,"/")!=0))
	{
		sprintf(opp,"%s",uWord.value.T1);
		Scaner();
		eplace2=Expression();
		*etc=nNXQ;
		*efc=nNXQ+1;
		sprintf(strTemp,"j%s",opp);
		gen(strTemp,eplace1,eplace2,"0");
		gen("j","","","0");
	}
	else
		error("關系運算符");
}

//////////////////////////////////////////////////////////////////////////////////////////

void Statement(int nChain)//語句分析函數
{
	char strTemp[MAXLENGTH],eplace[MAXLENGTH];
	int nChainTemp=0,nChainTemp1=0,nWQUAD,Temp,tag2;
	switch(uWord.syn)
	{
	    case 'I'://賦值語句分析
			strcpy(strTemp,uWord.value.T1);
			Scaner();
			Match('O',"=");
			strcpy(eplace,Expression());
			gen("=",eplace,"",strTemp);
			nChain=0;
			break;
		case 'L'://帶標號的賦值語句分析
			Scaner();
			Match('P',":");
			strcpy(strTemp,uWord.value.T1);
			Scaner();
			Match('O',"=");
			tag1=nNXQ;
		    strcpy(eplace,Expression());
			gen("=",eplace,"",strTemp);
			nChain=0;
			break;
		case 'K':
			if(strcmp(uWord.value.T1,"IF")==0)//IF-THEN條件語句分析
			{
			    Match('K',"IF");
			    Match('P',"(");
			    Condition(&ntc,&nfc);
			    backpatch(ntc,nNXQ);
			    Match('P',")");
				Match('K',"THEN");
			    Statement(nChainTemp);			
				if(strcmp(uWord.value.T1,"ELSE")!=0)
				    backpatch(nfc,nNXQ);
			    nChain=merge(nChainTemp,nfc);
			}
		    if(strcmp(uWord.value.T1,"ELSE")==0)//IF-THEN-ELSE條件語句分析
			{
				gen("j","","","0");
			    nWQUAD=nNXQ;
				tag2=nNXQ-1;
				backpatch(nfc,nWQUAD);
				Temp=merge(nWQUAD,nChainTemp);				
				Match('K',"ELSE");
                Statement(nChainTemp);
				backpatch(tag2,nNXQ);
                nChain=merge(Temp,nChainTemp1);
			}
			if(strcmp(uWord.value.T1,"GOTO")==0)//轉移語句分析
			{
			    Match('K',"GOTO");
				nWQUAD=nNXQ;
				gen("j","","","0");
				backpatch(nWQUAD,tag1);
                nChain=0;
			}		
            break;
	}
}

//////////////////////////////////////////////////////////////////////////////////////////

void Statement_Sequence(int nChain)//語句串分析函數
{
	Statement(nChain);
	while((uWord.syn=='I'||uWord.syn=='L'
		||(uWord.syn=='K'&&strcmp(uWord.value.T1,"IF")==0)
		||(uWord.syn=='K'&&strcmp(uWord.value.T1,"ELSE")==0)
		||(uWord.syn=='K'&&strcmp(uWord.value.T1,"GOTO")==0))&&strcmp(uWord.value.T1,"end")!=0)
	{
		Statement(nChain);
	}
}

//////////////////////////////////////////////////////////////////////////////////////////

void Parse()//分析生成中間代碼
{
	int nChain=0;
	str=fgetc(fp);
	Scaner();
	Statement_Sequence(nChain);
	if(strcmp(uWord.value.T1,"end")!=0)
	{		
		printf("\n源程序非正常結束");
		fprintf(fw,"\n源程序非正常結束");
	}
	suanfu();//調用算符優先語法主函數
	PrintQuaternion();//打印四元式數組
}

/************************************以下是主函數部分************************************/

//////////////////////////////////////////////////////////////////////////////////////////

void main()//主函數
{
	pQuad=(QUATERNION *)malloc(4*MAXLENGTH);
	nSuffix=0;
	nfc=ntc=nNXQ=1;
	char buf[4048]={'\0'};
	int i=0;  
    out=fopen("二元式表.txt","w");
	in=fopen("預處理.txt","w");
	printf("請輸入源文件路徑及名稱:");
	scanf("%s",filename);	
    if ((fp=fopen(filename,"rt"))==NULL)        
	{
		printf("源文件無法打開!\n");
		system("pause");
	    exit(0);
	}
    else
	{
		printf("**********************************詞法分析程序**********************************\n");
	    printf("K:關鍵字 I:標識符 C:常數 O:運算符 P:界符 L:標號\n");
		pro_process(buf);//生成預處理文件
		while (buf[i]!='#')
		{
			fputc(buf[i],in);
			i++;
		}
		fputc('#',in);
		fclose(in);
		fp=fopen("預處理.txt","r");
	}		
	fw=fopen("四元式表.txt","w");	
	Parse();//分析生成中間代碼
	cout<<endl;
	fclose(fw);
	fclose(fp);
    cout<<"輸出結果保存在二元式表.txt和四元式表.txt文件中,請打開查看。"<<endl;
	system("pause");
	exit(0);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久精品国产99久久精品芒果| 欧美亚洲自拍偷拍| 日韩视频一区在线观看| 亚洲在线视频网站| 99久久免费精品高清特色大片| 欧美精品一区二区三| 麻豆成人91精品二区三区| 欧美精品久久久久久久多人混战 | 中文字幕欧美激情| 国产乱人伦偷精品视频免下载 | 欧美日韩视频在线观看一区二区三区| 中文字幕在线不卡一区| 国产成人啪免费观看软件| 国产亚洲精品aa午夜观看| 国内精品国产成人| 久久免费的精品国产v∧| 久久91精品久久久久久秒播| 欧美va天堂va视频va在线| 极品少妇一区二区三区精品视频| 日韩欧美一二三| 狠狠色丁香久久婷婷综合_中| 欧美精品一区男女天堂| 国产一区二区美女| 国产日韩精品一区二区三区在线| 国产高清一区日本| 国产精品欧美久久久久无广告| 成人av影院在线| 亚洲人成网站色在线观看| 91久久精品一区二区二区| 亚洲一区二区免费视频| 欧美日本一区二区| 蜜臀av亚洲一区中文字幕| 精品成a人在线观看| 国产.欧美.日韩| 国产精品国产三级国产有无不卡| 91小视频免费观看| 亚洲一区二区三区四区在线免费观看| 欧美日韩精品三区| 蜜臀精品久久久久久蜜臀| 久久嫩草精品久久久久| 91首页免费视频| 午夜国产精品影院在线观看| 日韩亚洲电影在线| 国产风韵犹存在线视精品| 中文字幕日韩一区| 欧美日韩一区中文字幕| 精油按摩中文字幕久久| 中文一区二区在线观看| 日本韩国一区二区三区视频| 日韩—二三区免费观看av| 久久综合久久久久88| 99re热这里只有精品视频| 午夜视频在线观看一区二区| 久久综合久久综合九色| 91精品福利在线| 美洲天堂一区二卡三卡四卡视频| 久久这里都是精品| 色婷婷精品久久二区二区蜜臀av| 午夜精品一区二区三区电影天堂| 久久综合色鬼综合色| 色婷婷综合久久久久中文一区二区| 午夜精品成人在线| 欧美韩日一区二区三区四区| 欧美伊人久久大香线蕉综合69| 久久99精品久久久| 亚洲日本一区二区| 欧美电影免费观看完整版| 91在线码无精品| 久久国产精品99久久久久久老狼 | 久久综合精品国产一区二区三区| 99re这里只有精品视频首页| 免费高清在线一区| 中文字幕字幕中文在线中不卡视频| 欧美卡1卡2卡| 99久久er热在这里只有精品66| 日韩黄色免费网站| 国产精品欧美精品| 欧美大片一区二区| 91麻豆国产福利在线观看| 久久99久久精品欧美| 亚洲精品高清视频在线观看| 精品国产一区二区亚洲人成毛片| 91同城在线观看| 激情久久五月天| 亚洲一区自拍偷拍| 国产日韩亚洲欧美综合| 欧美日韩大陆在线| 成人av免费在线| 欧美aa在线视频| 亚洲黄网站在线观看| 久久久久久久久免费| 777午夜精品免费视频| 99久久久国产精品| 国产乱码精品一区二区三| 午夜久久久久久| 亚洲美腿欧美偷拍| 欧美国产精品一区| 日韩精品一区二区三区中文精品| 在线亚洲一区二区| 国产精品系列在线观看| 青娱乐精品视频在线| 亚洲国产视频一区二区| 亚洲视频在线一区二区| 国产婷婷色一区二区三区四区| 欧美一区在线视频| 欧美日韩一区中文字幕| 日本精品一区二区三区高清 | 久久奇米777| 日韩一区二区免费在线观看| 在线中文字幕一区| 91视频91自| 99久久久国产精品免费蜜臀| 国产suv精品一区二区三区| 久久国产精品72免费观看| 日日骚欧美日韩| 亚洲综合在线电影| 亚洲激情图片qvod| 成人免费一区二区三区在线观看| 久久亚区不卡日本| 欧美videos中文字幕| 日韩一区二区在线播放| 欧美美女一区二区三区| 欧美日韩久久一区二区| 欧美色网一区二区| 欧美性xxxxx极品少妇| av在线这里只有精品| 成人午夜视频在线| 高清日韩电视剧大全免费| 国产黄色精品视频| 韩国女主播一区二区三区| 久久国产精品99精品国产| 久久国产日韩欧美精品| 久久aⅴ国产欧美74aaa| 久久99精品久久只有精品| 久久99九九99精品| 国产精品影视在线观看| 国产精品18久久久久| 国产精品一色哟哟哟| 国产福利91精品一区| 成人永久看片免费视频天堂| 成人免费高清视频在线观看| 高清国产一区二区| 99精品久久久久久| 91麻豆国产在线观看| 在线精品视频一区二区三四| 欧美在线免费观看亚洲| 精品视频1区2区| 777久久久精品| 精品不卡在线视频| 国产欧美日韩久久| 日韩一区中文字幕| 亚洲一区二区三区视频在线| 亚洲bdsm女犯bdsm网站| 免费观看成人鲁鲁鲁鲁鲁视频| 久久精品国产99国产| 精品无码三级在线观看视频 | 国产精品一区在线| 成人免费高清在线观看| 色综合一区二区| 色吧成人激情小说| 欧美精品1区2区| 精品国产第一区二区三区观看体验| 久久久国产精品不卡| 中文字幕日韩av资源站| 亚洲另类中文字| 午夜精品福利一区二区三区av| 久久精品国产亚洲一区二区三区 | 精品一区二区三区免费观看| 国产一区在线精品| 成人av网站大全| 欧美日韩高清不卡| 久久午夜国产精品| 综合久久久久久久| 日韩国产精品久久| 高清成人在线观看| 色吧成人激情小说| 精品国产污网站| 1024成人网| 日韩高清在线观看| 成人做爰69片免费看网站| 91久久线看在观草草青青| 日韩免费一区二区三区在线播放| 国产欧美日韩在线观看| 一区二区三区成人| 男人的天堂久久精品| 国产成人免费视频精品含羞草妖精| 91丨porny丨最新| 欧美一区二区国产| 国产欧美精品一区二区色综合| 亚洲精品久久7777| 精品一区二区三区免费| 色综合天天性综合| 日韩美女一区二区三区四区| 中文字幕欧美日韩一区| 亚洲丰满少妇videoshd| 国产黄色91视频| 欧美军同video69gay| 国产精品久99| 蜜桃av一区二区三区电影| 97超碰欧美中文字幕|