亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产日韩亚洲欧美综合| 91精品国产综合久久福利软件| 精品动漫一区二区三区在线观看| 亚洲高清免费观看高清完整版在线观看| 在线看不卡av| 亚洲第一激情av| 8v天堂国产在线一区二区| 日韩福利视频网| 久久综合色鬼综合色| 福利视频网站一区二区三区| |精品福利一区二区三区| 欧美综合一区二区三区| 日韩精品一二三四| 亚洲精品一区二区三区福利 | 国产乱码精品一区二区三区忘忧草| 久久久99久久| 91黄色在线观看| 久久精品国产在热久久| 国产三级三级三级精品8ⅰ区| 91麻豆国产福利在线观看| 亚洲韩国一区二区三区| 久久亚洲捆绑美女| 在线一区二区视频| 麻豆一区二区三| 亚洲欧美影音先锋| 91麻豆精品国产91久久久久久久久 | 欧美不卡激情三级在线观看| 国产91在线观看| 亚洲成人精品影院| 久久精品欧美一区二区三区不卡| 99视频精品在线| 乱中年女人伦av一区二区| 国产精品久久久久7777按摩| 欧美日韩大陆一区二区| 国产精品亚洲成人| 午夜精品久久久久久久蜜桃app| 久久嫩草精品久久久精品| 日本精品视频一区二区| 国产综合一区二区| 亚洲国产美女搞黄色| 中文字幕国产精品一区二区| 欧美绝品在线观看成人午夜影视| 春色校园综合激情亚洲| 蜜桃精品视频在线观看| 日韩毛片视频在线看| 精品免费视频.| 欧美色图12p| 91美女视频网站| 国产一区91精品张津瑜| 午夜精品福利一区二区蜜股av | 在线观看欧美日本| 国产乱子伦一区二区三区国色天香| 一区二区三区在线影院| 亚洲国产岛国毛片在线| 日韩一区二区三区在线观看| 色哟哟国产精品| 粉嫩嫩av羞羞动漫久久久| 久久99九九99精品| 亚洲高清免费在线| 一区二区三区四区不卡在线| 欧美激情一区二区三区全黄| 欧美一级日韩不卡播放免费| 欧美午夜片在线看| 91小视频免费看| av一本久道久久综合久久鬼色| 国产剧情在线观看一区二区| 秋霞午夜av一区二区三区| 亚洲bt欧美bt精品777| 亚洲欧美二区三区| 日韩毛片一二三区| 亚洲国产激情av| 国产精品久久毛片a| 国产精品久久久久久亚洲毛片| 欧美精品一区二区三区很污很色的 | 久久激五月天综合精品| 免费观看在线色综合| 日韩不卡在线观看日韩不卡视频| 亚洲二区在线视频| 香蕉久久一区二区不卡无毒影院| 伊人夜夜躁av伊人久久| 一级特黄大欧美久久久| 亚洲综合视频在线| 亚洲大型综合色站| 日韩成人伦理电影在线观看| 日韩国产精品久久久久久亚洲| 日韩va亚洲va欧美va久久| 日韩电影一二三区| 激情综合一区二区三区| 国产精品一区二区男女羞羞无遮挡 | 欧美一区二区成人| 日韩精品综合一本久道在线视频| www国产亚洲精品久久麻豆| 26uuu精品一区二区在线观看| 国产三级精品三级| 日韩美女视频19| 一区二区三区在线观看国产 | 欧美成人精品1314www| 久久综合九色综合97_久久久| 久久久久久久国产精品影院| 国产精品卡一卡二| 一区二区三区中文字幕| 日本少妇一区二区| 国产999精品久久久久久| 91网站最新网址| 欧美精品日韩一本| 久久久久久久久伊人| **欧美大码日韩| 日本不卡在线视频| 国产精品99久久久久久有的能看| 不卡大黄网站免费看| 欧美美女一区二区| 久久久高清一区二区三区| 亚洲欧美日韩中文播放| 日本sm残虐另类| 成人久久18免费网站麻豆| 欧美性色黄大片手机版| 精品美女一区二区| 亚洲男同性恋视频| 久久爱www久久做| 91香蕉视频黄| 26uuu久久综合| 亚洲自拍偷拍九九九| 国产成人免费视频网站高清观看视频| 在线亚洲一区二区| 精品日韩成人av| 亚洲一区二区不卡免费| 国产精品一区二区免费不卡| 欧美偷拍一区二区| 欧美国产乱子伦| 日韩国产精品91| 色婷婷综合久色| 欧美国产在线观看| 麻豆久久一区二区| 欧美亚洲综合另类| 欧美激情一区二区三区| 久久99精品久久久久| 欧美日韩免费在线视频| 欧美国产日韩在线观看| 久久精品国产在热久久| 欧美性色aⅴ视频一区日韩精品| 国产日韩欧美麻豆| 欧美a级理论片| 欧美视频一区在线观看| 国产精品久久久久婷婷| 国产精品亚洲第一区在线暖暖韩国| 欧美二区三区91| 亚洲综合视频网| 日本高清无吗v一区| 国产日本亚洲高清| 精品一区二区精品| 日韩一区二区免费在线电影| 亚洲午夜精品网| 91国内精品野花午夜精品| 自拍偷拍亚洲综合| www.欧美精品一二区| 亚洲国产精品成人久久综合一区| 精品一区二区三区久久久| 欧美一卡二卡在线观看| 首页国产丝袜综合| 欧美日韩国产在线播放网站| 亚洲综合成人在线| 91久久精品网| 亚洲激情图片qvod| 一本一道综合狠狠老| 1区2区3区欧美| 色婷婷久久一区二区三区麻豆| 成人免费在线视频观看| 97久久精品人人做人人爽| 中文字幕一区二区三中文字幕| 高潮精品一区videoshd| 欧美激情在线一区二区三区| 成人性生交大片免费看在线播放| 久久久久99精品一区| 国产精品18久久久久久vr| 久久先锋资源网| 国产精品88av| 中文字幕在线观看不卡| 91色porny在线视频| 亚洲综合视频在线观看| 欧美日韩黄视频| 精品亚洲porn| 欧美国产一区视频在线观看| 99精品视频在线观看免费| 一区二区三区精密机械公司| 91国偷自产一区二区使用方法| 亚洲一区在线观看免费观看电影高清| 91在线高清观看| 亚洲国产成人91porn| 日韩一本二本av| 国产精品1024久久| 亚洲日本免费电影| 欧美人伦禁忌dvd放荡欲情| 欧美aaa在线| 久久精品人人做人人综合| 色综合色综合色综合色综合色综合 | 欧美日韩国产首页| 麻豆精品一区二区三区| 国产午夜亚洲精品不卡| 色婷婷一区二区三区四区| 日韩高清国产一区在线|