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

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

?? cgen.cpp

?? 學習編譯原理
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
/****************************************************/
/* 文件 cgen.cpp				  					*/
/* 說明 類PASCAL語言編譯器代碼生成程序  			*/
/* 主題 編譯器結構:原理和實例						*/	
/****************************************************/

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

#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;           /*臨時變量區的偏移*/

static void genStmt(TreeNode * t);  


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

	/*處理過程體部分*/

	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);
			/*待過程處理完成,回填指令執行地址*/
			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");
	/*******注:此處的數字應該為0,而不是1*******/
	emitRM("LDA",pc,0,ac2," return old procedure");

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



/*************************************************************/
/* 函數名  genStmt                                           */
/* 功  能  該函數生成一個語句節點的代碼                      */
/* 說  明  根據不同的語法樹節點產生不同的語句代碼            */
/*************************************************************/
void genStmt(TreeNode * t)
{  
	/*用于控制轉移display表的各項sp值*/
	int ss;
				  
	/*用于存儲語法樹的各個節點*/
	TreeNode * p0 = NULL;
	TreeNode * p1 = NULL;
	TreeNode * pp = NULL;
	TreeNode * p2 = NULL;
	SymbTable * entry = NULL;

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

	/*用于記錄跳轉回填時的地址*/
	int  savedLoc1,savedLoc2,currentLoc;

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

	/*指向實參的指針*/
	ParamTable * curParam = NULL;

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

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

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

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

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

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

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

			currentLoc = emitSkip(0);

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

			/* 如果條件表達式為假,則跳轉至while語句結束   *
			/* 此處為地址回填預留一個指令空間              */
			savedLoc1 = emitSkip(1);

			emitComment(" while : jump out while ");

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

			/*跳到條件表達式處,進入下一次循環*/
			emitRM("LDC",pc,currentLoc,0," jump to start ");
			
			emitComment(" return to condition exp");
			
			/*條件為假時,跳出while循環*/
			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];  /*賦值號左側的部分*/

			p1 = t->child[1];  /*賦值號右側的部分*/
			
			FindAdd(p0);
			/*ac中存為賦值號左側變量的絕對偏移*/
			
			/*先把ac存到ac2中*/
			emitRM("LDA",ac2,0,ac,"save ac");
			
			cGen(p1);          /*處理賦值號右側的表達式部分*/
			/*結果存入ac中*/

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

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

			/*計算變量的絕對偏移,ac中存為變量的絕對偏移*/
			FindAdd(t);
               
			if(t->table[0]->attrIR.More.VarAttr.access==dir)
			{
				/*直接存*/
				/*最后生成存儲指令*/
				emitRM("ST",ac2,0,ac," var read : store value");
			}
			else
			{
				/*以ac內容作為地址找變量單元,再存*/
				/*ac內容放入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語句部分的表達式部分*/

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

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

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

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

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

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

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

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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久国产精品人| 欧美色视频一区| ...av二区三区久久精品| 欧美日韩综合不卡| 丁香激情综合国产| 麻豆久久久久久久| 亚洲观看高清完整版在线观看| 国产亚洲一区二区三区| 欧美日韩国产小视频| 91亚洲大成网污www| 国产精一品亚洲二区在线视频| 日韩成人精品在线观看| 亚洲乱码国产乱码精品精98午夜 | 777xxx欧美| 波多野结衣中文一区| 精品一区二区在线视频| 五月婷婷久久丁香| 一区二区三区不卡在线观看| 国产精品―色哟哟| 国产日韩精品一区二区浪潮av | 国产精品白丝在线| 久久久.com| 欧美精品一区二区三区四区| 欧美日韩久久久一区| 欧美在线高清视频| 91日韩在线专区| av在线不卡电影| 成人网页在线观看| 国产福利精品导航| 国产精品99久久久久久有的能看| 免费日韩伦理电影| 蜜臀精品一区二区三区在线观看| 亚洲国产欧美另类丝袜| 一区二区三区免费网站| 亚洲视频一二三| 亚洲精品成a人| 亚洲欧美一区二区三区极速播放| 成人欧美一区二区三区黑人麻豆| 国产精品女上位| 国产精品久久毛片a| 国产精品第一页第二页第三页| 国产精品久久久久影视| 亚洲欧美视频一区| 一区二区三区日韩欧美| 午夜久久久久久电影| 日韩中文字幕不卡| 免费观看在线综合| 国内久久婷婷综合| 丰满亚洲少妇av| 色婷婷综合久久久中文字幕| 在线观看区一区二| 欧美一区二区在线视频| 日韩视频免费观看高清完整版在线观看| 8x8x8国产精品| 精品国产百合女同互慰| 亚洲国产高清不卡| 亚洲精品国产无天堂网2021| 丝袜脚交一区二区| 国产一区美女在线| 成人免费精品视频| 欧美在线你懂得| 欧美大白屁股肥臀xxxxxx| 久久久久97国产精华液好用吗| 亚洲无线码一区二区三区| 日韩和欧美一区二区三区| 狠狠久久亚洲欧美| 99re热这里只有精品视频| 欧美日韩国产精选| 久久精品亚洲精品国产欧美| 亚洲三级在线播放| 日本在线不卡视频| 成人精品免费视频| 欧美猛男超大videosgay| 精品国产99国产精品| 国产精品久久毛片av大全日韩| 亚洲国产精品久久久久婷婷884 | 91精品欧美福利在线观看 | 亚洲一区在线观看免费观看电影高清| 日韩国产欧美在线视频| 国产69精品一区二区亚洲孕妇| 一本在线高清不卡dvd| 91麻豆精品国产自产在线 | 色综合一区二区| 日韩欧美中文一区| 中文字幕一区二区三区蜜月| 日韩av午夜在线观看| 不卡视频免费播放| 日韩美女一区二区三区| 亚洲激情自拍视频| 国产精品88888| 欧美三级欧美一级| 国产精品麻豆欧美日韩ww| 美女视频黄免费的久久| 色综合色综合色综合色综合色综合| 日韩小视频在线观看专区| 亚洲女女做受ⅹxx高潮| 国产精品一区二区在线看| 欧美一区二视频| 一区二区三区高清| 99久久精品国产一区二区三区 | 欧美视频在线不卡| 国产精品女人毛片| 激情亚洲综合在线| 欧美区一区二区三区| 亚洲人被黑人高潮完整版| 国产福利不卡视频| 精品久久久久av影院| 亚洲综合在线电影| 不卡av电影在线播放| 久久久综合视频| 精品一区二区三区影院在线午夜| 欧美日韩卡一卡二| 亚洲综合区在线| 91网上在线视频| 中文成人av在线| 懂色av中文字幕一区二区三区| 亚洲一区二区av电影| 成人性生交大片免费看在线播放 | 亚洲18影院在线观看| 一本到不卡免费一区二区| 国产精品美女久久福利网站| 国产精品中文字幕日韩精品 | 欧美综合一区二区| 亚洲激情自拍视频| 色老汉一区二区三区| 亚洲美女屁股眼交3| 91理论电影在线观看| 亚洲乱码中文字幕| 91丨porny丨中文| 亚洲色图20p| 91久久国产最好的精华液| 一区二区三区蜜桃| 欧美视频一区在线| 亚洲国产精品久久久男人的天堂 | 国产乱妇无码大片在线观看| 久久影视一区二区| 国产乱一区二区| 国产日韩欧美激情| caoporn国产精品| 亚洲欧美视频一区| 欧美专区日韩专区| 日日夜夜免费精品| 日韩三级视频在线观看| 久久97超碰国产精品超碰| 亚洲精品一区二区在线观看| 国产精品一区免费在线观看| 中文欧美字幕免费| 一本大道久久a久久精品综合| 亚洲激情第一区| 555夜色666亚洲国产免| 久久av老司机精品网站导航| 26uuu亚洲婷婷狠狠天堂| 国产成人鲁色资源国产91色综 | 久久久99精品免费观看| 成人午夜免费av| 亚洲美女偷拍久久| 777色狠狠一区二区三区| 黄色日韩三级电影| 国产欧美在线观看一区| 91麻豆国产自产在线观看| 香蕉加勒比综合久久| 久久新电视剧免费观看| 成人网男人的天堂| 亚洲.国产.中文慕字在线| 久久久午夜精品理论片中文字幕| 99免费精品在线| 日韩精品色哟哟| 欧美国产精品中文字幕| 欧美性videosxxxxx| 久久国产剧场电影| 亚洲私人影院在线观看| 日韩欧美国产电影| 91小视频免费看| 久久精品国产99国产| 综合色天天鬼久久鬼色| 亚洲免费观看在线观看| 8v天堂国产在线一区二区| 成人午夜精品在线| 日韩一区欧美二区| 国产精品视频一二| 日韩视频在线一区二区| 91网站最新地址| 久久99国产精品麻豆| 亚洲另类一区二区| 国产欧美一区二区三区网站| 欧美日韩一卡二卡三卡 | 日韩一级大片在线| 不卡一卡二卡三乱码免费网站| 天天免费综合色| 中文字幕一区二区三区乱码在线 | 亚洲午夜电影在线| 欧美国产国产综合| 日韩欧美一区中文| 91黄色免费观看| 国产福利精品一区二区| 免费高清不卡av| 亚洲精品高清在线观看| 国产精品欧美久久久久无广告| 日韩视频在线一区二区| 欧美色区777第一页|