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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? cgen.cpp

?? 編譯原理學(xué)習(xí)使用的代碼 內(nèi)容有從詞法分析到中間代碼生成的代碼 并且含有注釋
?? CPP
?? 第 1 頁 / 共 2 頁
字號(hào):
/****************************************************/
/* 文件 cgen.cpp				  					*/
/* 說明 類PASCAL語言編譯器代碼生成程序  			*/
/* 主題 編譯器結(jié)構(gòu):原理和實(shí)例						*/	
/****************************************************/

/***********  該文件所包含的頭文件  ****************/

#include "globals.h"	

#include "util.h"

#include "symbTable.h"		

#include "scanner.h"	

#include "parse.h"

#include "analyze.h"		

#include "string.h"

#include "cgen.h"

#include "code.h"



static int tmpOffset = 0;           /*臨時(shí)變量區(qū)的偏移*/

static void genStmt(TreeNode * t);  


/*************************************************************/
/* 函數(shù)名  genProc                                           */
/* 功  能  該函數(shù)生成過程節(jié)點(diǎn)的代碼                          */
/* 說  明  該函數(shù)處理過程聲明部分的代碼生成,在過程信息表中填 */
/*         寫過程入口地址,結(jié)束是在pc中存入返回地址           */
/*************************************************************/
void genProc(TreeNode * t)
{
	int savedLoc1;         /*處理過程入口時(shí)所需的代碼地址*/

	/*處理過程體部分*/

	int currentLoc = emitSkip(0);

	/*在過程信息表中填寫過程入口地址*/
	t->table[0]->attrIR.More.ProcAttr.procEntry = currentLoc;

	/*初始化寄存器displayOff*/
	emitRM("LDC",displayOff,t->table[0]->attrIR.More.ProcAttr.nOff,0,"noff value");

	/*提示信息,過程處理部分開始*/
	if(TraceCode)  emitComment("->procedure");

	TreeNode * p1 = t->child[1];

	TreeNode * p2 = t->child[2];

	while(p1!=NULL)
	{
		/*處理過程聲明部分*/
		if(p1->nodekind==ProcDecK)
		{
			savedLoc1 = emitSkip(1);
			genProc(p1);
			/*待過程處理完成,回填指令執(zhí)行地址*/
			currentLoc = emitSkip(0);
			emitBackup(savedLoc1);
			emitRM("LDC",pc,currentLoc,0," procedure entry");
			//emitRM_Abs("JEQ",ac,currentLoc," jump to outside procedure");
			emitRestore();
		}
		p1 = p1->sibling;
	}

	if(p2!=NULL)
		p2 = p2->child[0];
	/*處理語句部分*/
	while (p2!=NULL)
	{
		genStmt(p2);
		p2 = p2->sibling;
	}
	
	/*指令寄存器pc的值置為返回地址*/
	emitRM("LD",ac2,1,sp," fetch return address");
	/*******注:此處的數(shù)字應(yīng)該為0,而不是1*******/
	emitRM("LDA",pc,0,ac2," return old procedure");

	/*提示信息,當(dāng)前過程處理部分結(jié)束*/
	if(TraceCode)  emitComment("<-procedure");
}



/*************************************************************/
/* 函數(shù)名  genStmt                                           */
/* 功  能  該函數(shù)生成一個(gè)語句節(jié)點(diǎn)的代碼                      */
/* 說  明  根據(jù)不同的語法樹節(jié)點(diǎn)產(chǎn)生不同的語句代碼            */
/*************************************************************/
void genStmt(TreeNode * t)
{  
	/*用于控制轉(zhuǎn)移display表的各項(xiàng)sp值*/
	int ss;
				  
	/*用于存儲(chǔ)語法樹的各個(gè)節(jié)點(diǎn)*/
	TreeNode * p0 = NULL;
	TreeNode * p1 = NULL;
	TreeNode * pp = NULL;
	TreeNode * p2 = NULL;
	SymbTable * entry = NULL;

	/*用于記錄形參地址*/
	int FormParam;

	/*用于記錄跳轉(zhuǎn)回填時(shí)的地址*/
	int  savedLoc1,savedLoc2,currentLoc;

	/*指向域變量的指針*/
	fieldChain * fieldMem = NULL;

	/*指向?qū)崊⒌闹羔?/
	ParamTable * curParam = NULL;

	switch(t->kind.stmt)
	{
		/*處理if語句*/
		case IfK:
			if(TraceCode)  emitComment("->if");

			p0 = t->child[0]; /*條件表達(dá)式部分*/
			p1 = t->child[1]; /*then語句序列部分*/
			p2 = t->child[2]; /*else語句序列部分*/
			
			cGen(p0);         /*產(chǎn)生測(cè)試表達(dá)式的代碼*/
			
			/* savedLoc1賦值為當(dāng)前指令的tm地址號(hào)(emitLoc),emitLoc加1,       *
			/* 為if條件表達(dá)式為假時(shí),產(chǎn)生跳轉(zhuǎn)地址回填所留一代碼空位         */
			savedLoc1 = emitSkip(1);
            
			/* 指令回填地址savedLoc1記錄當(dāng)前生成代碼寫入地址,				*
		     * 再將當(dāng)前生成代碼寫入地址emitLoc加1							*
             * 為條件表達(dá)式為假的跳轉(zhuǎn)指令留一條指令寫入空位,用于代碼回填	*
		     * 將注釋寫入目標(biāo)代碼文件code,此處為向else跳轉(zhuǎn)指令位置			*/
			emitComment("if: jump to else belongs here");
			
			/*產(chǎn)生then語句部分的代碼*/
			cGen(p1);
			
			/* 指令回填地址savedLoc2記錄當(dāng)前生成代碼寫入地址,				*
		     * 再將當(dāng)前生成代碼寫入地址emitLoc加1							*
		     * 為跳轉(zhuǎn)到判斷語句結(jié)束位置的指令留一條代碼空位,用于代碼回填	*
		     * 將注釋寫入目標(biāo)代碼文件code,此處為向end跳轉(zhuǎn)指令位置	        */	
			savedLoc2 = emitSkip(1);
			
			emitComment("if: jump to end belongs here");
			
			/* 指令回填地址currentLoc為當(dāng)前生成代碼寫入地址	*
		     * 當(dāng)前地址為條件為假的處理指令開始地址			*/
			currentLoc = emitSkip(0);
			
			/*退回到指令回填地址savedLoc1,此處已經(jīng)預(yù)留了一個(gè)指令空位*/
			emitBackup(savedLoc1);
			
			/* 寫入跳轉(zhuǎn)到else的指令,此時(shí)跳轉(zhuǎn)位置currentLoc已經(jīng)得到 *
		     * 指令的跳轉(zhuǎn)地址為相對(duì)地址							   */
			emitRM_Abs("JEQ",ac,currentLoc,"if : jmp to else");

			/* 恢復(fù)當(dāng)前生成代碼寫入地址emitLoc為指令回填地址currentLoc,	*
		     * 恢復(fù)后地址為條件為假處理指令開始地址,即else開始位置		*/
			emitRestore();

			/* 處理else語句部分的代碼 */
			cGen(p2);
			
			/* 指令回填地址currentLoc作為當(dāng)前生成代碼寫入地址	*
    	     * 當(dāng)前地址為判斷語句結(jié)束位置						*/
			currentLoc = emitSkip(0);
			
			/* 回退到指令回填地址savedLoc2,此處已經(jīng)預(yù)留了一個(gè)指令空間 */
			emitBackup(savedLoc2);
			
			/* 寫入跳轉(zhuǎn)到end的指令,此時(shí)跳轉(zhuǎn)位置currentLoc已經(jīng)得到地址 */
			emitRM_Abs("LDA",pc,currentLoc,"jmp to end");

			/* 恢復(fù)當(dāng)前生成代碼寫入地址emitLoc為指令回填地址currentLoc,	*
		     * 恢復(fù)后地址為判斷語句結(jié)束地址,即end位置	    			*/
			emitRestore();
			
			if (TraceCode) emitComment("<- if");            /*if語句結(jié)束*/
			break;
		
		/*處理while語句*/
		case WhileK:

			if ( TraceCode )   emitComment("->while");

			p0 = t->child[0];  /*p0為while語句的條件表達(dá)式部分*/
			p1 = t->child[1];  /*p1為while語句的語句序列部分*/

			currentLoc = emitSkip(0);

			cGen(p0);          /*生成條件表達(dá)式部分代碼*/

			/* 如果條件表達(dá)式為假,則跳轉(zhuǎn)至while語句結(jié)束   *
			/* 此處為地址回填預(yù)留一個(gè)指令空間              */
			savedLoc1 = emitSkip(1);

			emitComment(" while : jump out while ");

			cGen(p1);     /*生成語句序列部分代碼*/

			/*跳到條件表達(dá)式處,進(jìn)入下一次循環(huán)*/
			emitRM("LDC",pc,currentLoc,0," jump to start ");
			
			emitComment(" return to condition exp");
			
			/*條件為假時(shí),跳出while循環(huán)*/
			currentLoc = emitSkip(0);

			emitBackup(savedLoc1);

			emitRM_Abs("JEQ",ac,currentLoc," jump out while ");

			emitRestore();
			
			if(TraceCode)  emitComment("<-while");

			break;

		/*處理賦值語句*/
		case AssignK:
			if(TraceCode)  emitComment("->assign");

			p0 = t->child[0];  /*賦值號(hào)左側(cè)的部分*/

			p1 = t->child[1];  /*賦值號(hào)右側(cè)的部分*/
			
			FindAdd(p0);
			/*ac中存為賦值號(hào)左側(cè)變量的絕對(duì)偏移*/
			
			/*先把a(bǔ)c存到ac2中*/
			emitRM("LDA",ac2,0,ac,"save ac");
			
			cGen(p1);          /*處理賦值號(hào)右側(cè)的表達(dá)式部分*/
			/*結(jié)果存入ac中*/

			if(p0->table[0]->attrIR.More.VarAttr.access==dir)
			/*賦值*/
				emitRM("ST",ac,0,ac2,"var assign : store value");
			else
			{
				/*ac2中為該變量的實(shí)際存儲(chǔ)位置*/
				emitRM("LD",ac2,0,ac2," indir var assign");
				emitRM("ST",ac,0,ac2," store value");
			}
			
			/* 如果代碼生成追蹤標(biāo)志TraceCode為TRUE,寫入注釋,assign語句結(jié)束 */
            if (TraceCode)  emitComment("<- assign") ;
            break; 

		/*處理輸入語句*/
		case ReadK:
			
			/*生成讀指令,該指令完成讀入外部數(shù)值到累加器ac的動(dòng)作*/
			emitRO("IN",ac,0,0,"read integer value");
			emitRM("LDA",ac2,0,ac,"save ac");

			/*計(jì)算變量的絕對(duì)偏移,ac中存為變量的絕對(duì)偏移*/
			FindAdd(t);
               
			if(t->table[0]->attrIR.More.VarAttr.access==dir)
			{
				/*直接存*/
				/*最后生成存儲(chǔ)指令*/
				emitRM("ST",ac2,0,ac," var read : store value");
			}
			else
			{
				/*以ac內(nèi)容作為地址找變量單元,再存*/
				/*ac內(nèi)容放入ac1中*/
				emitRM("LD",ac1,0,ac,"");
				emitRM("ST",ac2,0,ac1," var read : store value");
			}
			break;

		/* 處理write語句類型 */
		case WriteK:

			p0 = t->child[0];
			cGen(p0);             /*處理write語句部分的表達(dá)式部分*/

			emitRO("OUT",ac,0,0,"write ac");
			break;

		/* 處理過程調(diào)用語句 */
		case CallK:
			
		    p0 = t->child[0];    /*過程名*/
			p1 = t->child[1];    /*過程的實(shí)參*/

			pp = p0;
			if(TraceCode)  emitComment("->procedure call");

			/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*
			 *@@@@@@           參數(shù)傳遞          @@@@@@@@*/
			
			/*curParam是指向該過程形參表的指針*/
			curParam = p0->table[0]->attrIR.More.ProcAttr.param;
			
			while ((curParam!=NULL)&&(p1!=NULL))/*p1是實(shí)參*/
			{
				
				/*該形參的偏移*/
				FormParam = curParam->entry->attrIR.More.VarAttr.off;
				
				/*形參是變參時(shí)有三種情況*/
				if(curParam->entry->attrIR.More.VarAttr.access==indir)
				//{
				    /*實(shí)參是非形參,第一種*/
					//if(!p1->table[0]->attrIR.More.VarAttr.isParam)
					//{
						/*計(jì)算該實(shí)參的絕對(duì)地址*/
					//	FindAdd(p1);
						/*ac中現(xiàn)在存放的是實(shí)參的絕對(duì)地址*/
			
						/*將實(shí)參地址送入currentAR的行參單元中*/

						/*參數(shù)傳遞*/
					//	emitRM("ST",ac,FormParam,top," store actParam");
					//}
					/*實(shí)參是形參,分為兩種情況:dir,indir處理*/
					//else
					//{
						/*實(shí)參是值參*/
						if(p1->table[0]->attrIR.More.VarAttr.access==dir)
						{
							FindAdd(p1);
							/*ac中為實(shí)參的絕對(duì)地址*/
							/*將實(shí)參地址入currentAR的行參單元中*/
							
							/*參數(shù)傳遞*/
							emitRM("ST",ac,FormParam,top," store actParam");

						}
						/*實(shí)參是變參*/
						else
						{
							/*此時(shí)將實(shí)參的單元內(nèi)容傳送入currentAR的行參單元中*/
							FindAdd(p1);
							/*ac中為p1的絕對(duì)偏移*/

							/******ac中存的是實(shí)參單元地址******/
							emitRM("LD",ac,0,ac," ActParam value");
							/******ac中存的是實(shí)參單元內(nèi)容******/
						
							/*參數(shù)傳遞*/
							emitRM("ST",ac,FormParam,top," formal and act link ");

						}
					//}
				//}
				/*形參是值參時(shí)有四種情況*/
				else
				{
					switch(p1->kind.exp)
					{
					/*第一種,數(shù)值或表達(dá)式,直接送值*/
					case OpK:
					case ConstK:
						/*ac中存有表達(dá)式的值*/
						genExp(p1);
						emitRM("ST",ac,FormParam,top," formal and act link");
						break;
					
					case VariK:
						/*該函數(shù)使ac中存儲(chǔ)為實(shí)參的絕對(duì)地址*/
						FindAdd(p1);
						
						/*該形參的偏移*/
						FormParam = curParam->entry->attrIR.More.VarAttr.off;
						
						/*該實(shí)參是形參,不能是a.b或a[b]的形式*/
						//if(p1->table[0]->attrIR.More.VarAttr.isParam)
						//{
							/*第二種,值參,送值*/
							if(p1->table[0]->attrIR.More.VarAttr.access==dir)
							{
								/*以ac中的值作為絕對(duì)地址,找出其對(duì)應(yīng)的存儲(chǔ)單元,*
								 *取出其內(nèi)容,作為實(shí)參                       */
								emitRM("LD",ac2,0,ac,"");
								/*ac2中存放的是該變量?jī)?nèi)容*/
								emitRM("ST",ac2,FormParam,top," Act and Formal link");
						
							}
							/*第三種,變參,取內(nèi)容作為地址,再取內(nèi)容送入*/
							else
							{
								/*以ac中的內(nèi)容作為絕對(duì)地址*/
								emitRM("LD",ac2,0,ac,"");
								/*以ac2中的內(nèi)容作為絕對(duì)地址*/
								emitRM("LD",ac2,0,ac2,"");
								/*以ac2中的內(nèi)容作為實(shí)參*/
								emitRM("ST",ac2,FormParam,top," Act and Formal link");
							}
						//}
						/*該實(shí)參是普通變量*/
						//else
						//{	
							/*以ac中的值作為絕對(duì)地址*/
						//	emitRM("LD",ac2,0,ac,"");
							/*以ac2的內(nèi)容作為實(shí)參*/
						//	emitRM("ST",ac2,FormParam,top," Act and Formal link");
						//}
						break;
					}
				}
				curParam = curParam->next;
				p1 = p1->sibling;
			

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美丰满嫩嫩电影| 日韩欧美中文一区| 国产主播一区二区| 亚洲欧美色图小说| 国产偷国产偷精品高清尤物 | 国产在线播放一区| 亚洲乱码中文字幕| 久久精品亚洲乱码伦伦中文| 欧美日韩小视频| 91在线一区二区三区| 精品一区二区在线看| 亚洲国产视频一区二区| 国产精品久久久久久久久图文区| 欧美一区午夜视频在线观看| 欧美性一区二区| 99re热视频精品| 大胆欧美人体老妇| 国内成人精品2018免费看| 日韩国产精品91| 一区二区三区国产精华| 亚洲欧洲av色图| 国产亚洲欧美日韩俺去了| 日韩女优av电影| 91麻豆精品国产自产在线观看一区| 99在线热播精品免费| 国产乱码一区二区三区| 九九**精品视频免费播放| 日韩av在线播放中文字幕| 亚洲国产裸拍裸体视频在线观看乱了| 国产精品麻豆视频| 国产精品入口麻豆原神| 欧美国产日韩亚洲一区| 日本一区二区免费在线观看视频| 久久亚洲捆绑美女| 精品国产乱码久久久久久浪潮| 欧美一区二区日韩| 日韩一区二区在线看| 欧美一级夜夜爽| 欧美一级高清片| 日韩欧美一区在线观看| xf在线a精品一区二区视频网站| 国产精品久久久久aaaa| 国产午夜久久久久| 中文字幕av一区二区三区| 国产精品福利一区| 亚洲欧美另类小说视频| 亚洲线精品一区二区三区八戒| 亚洲国产视频一区| 日韩中文字幕麻豆| 美日韩一级片在线观看| 国产一区二区三区久久久| 国产成人亚洲综合色影视| 成人av免费在线| 色综合天天在线| 欧美日产在线观看| 26uuu精品一区二区三区四区在线| 久久久精品免费观看| 国产精品久久久久一区| 亚洲综合男人的天堂| 天天av天天翘天天综合网色鬼国产 | 欧美日韩一级片网站| 欧美疯狂性受xxxxx喷水图片| 日韩欧美在线网站| 国产免费久久精品| 亚洲另类春色校园小说| 欧美96一区二区免费视频| 国产成人午夜精品5599| 色婷婷久久久综合中文字幕| 欧美日本韩国一区二区三区视频| 日韩精品一区二区三区在线观看| 国产免费观看久久| 亚洲国产综合色| 国产精品一二三在| 欧美制服丝袜第一页| 26uuu精品一区二区三区四区在线| 国产精品久久久久久户外露出 | 日本午夜精品视频在线观看| 国产在线精品一区在线观看麻豆| 99在线精品免费| 欧美日本一区二区| 国产精品视频你懂的| 亚洲va欧美va人人爽| 国产精品一卡二卡在线观看| 91久久精品一区二区三区| 日韩一区二区不卡| 1000部国产精品成人观看| 日av在线不卡| 91玉足脚交白嫩脚丫在线播放| 欧美一区二区视频在线观看2020| 国产精品乱码久久久久久| 日本中文字幕一区二区视频| 波多野结衣在线一区| 91精品国产色综合久久ai换脸| 中文字幕一区二区三区在线观看| 蜜桃在线一区二区三区| 中文字幕亚洲精品在线观看 | 精品国产3级a| 中文字幕一区二区三区不卡在线| 美女在线一区二区| 日本韩国欧美一区| 久久精品一区二区三区四区| 婷婷久久综合九色综合绿巨人| 成人福利在线看| 亚洲精品日日夜夜| 国内一区二区视频| 91精品国产色综合久久久蜜香臀| 亚洲激情自拍偷拍| 高清不卡在线观看av| 精品美女在线播放| 婷婷夜色潮精品综合在线| 色屁屁一区二区| 国产日韩精品久久久| 久久精品国产网站| 欧美日本高清视频在线观看| 亚洲自拍偷拍综合| 99久久久无码国产精品| 中文字幕欧美三区| 国产盗摄一区二区| 久久久久久影视| 国产主播一区二区| 亚洲精品一线二线三线| 免费成人av在线| 91精品欧美福利在线观看| 亚洲国产va精品久久久不卡综合| 91小宝寻花一区二区三区| 欧美国产在线观看| 成人国产精品免费观看动漫| 国产女主播在线一区二区| 国产99久久久久久免费看农村| 精品免费视频一区二区| 国产一区在线观看视频| 精品99一区二区| 国产精品系列在线观看| 国产日韩欧美麻豆| 成人性色生活片| 中文在线资源观看网站视频免费不卡| 国产精品99久久久久| 久久久久久一级片| 成人免费的视频| 自拍偷拍欧美精品| 91国偷自产一区二区使用方法| 亚洲最大的成人av| 欧美日韩高清不卡| 日韩国产在线观看| 日韩欧美国产小视频| 国产精品一区二区三区四区| 国产亚洲成年网址在线观看| 成人永久免费视频| 日韩毛片高清在线播放| 在线视频一区二区三区| 亚洲影视资源网| 91麻豆精品国产无毒不卡在线观看| 日本不卡高清视频| 久久综合av免费| 成人国产免费视频| 亚洲成a人片在线不卡一二三区 | 26uuu欧美日本| 成人免费av网站| 亚洲免费资源在线播放| 精品视频色一区| 国产自产v一区二区三区c| 中文字幕一区二区三区四区 | 精品国产一区二区三区久久影院| 国产福利一区二区三区| 亚洲激情在线激情| 欧美一区二区啪啪| 成人av在线影院| 亚洲国产裸拍裸体视频在线观看乱了 | 成人黄页毛片网站| 亚洲制服丝袜在线| 精品国产一区二区国模嫣然| 99精品久久免费看蜜臀剧情介绍| 亚洲第一激情av| 久久久久久久久久久久久女国产乱 | 青青草91视频| 国产精品久久久久久久久久久免费看| 欧美亚洲禁片免费| 激情深爱一区二区| 一区二区三区免费| 欧美videos大乳护士334| 99精品偷自拍| 久久精品国产999大香线蕉| 亚洲欧洲另类国产综合| 日韩三级免费观看| 色综合久久综合网| 国产乱人伦偷精品视频不卡| 亚洲国产日韩a在线播放| 国产午夜精品一区二区| 欧美日韩国产综合一区二区| 成人激情免费电影网址| 蜜臀av在线播放一区二区三区| 自拍偷拍亚洲激情| 久久久久久久久蜜桃| 制服丝袜中文字幕一区| 91香蕉视频在线| 国产高清成人在线| 久久国产精品72免费观看| 亚洲综合色成人| 中文字幕一区二区三区四区不卡| av激情成人网|