⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 constopti.cpp

📁 上课时老师用过的SNL编译器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// constOpti.cpp: implementation of the CconstOpti class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "face.h"
#include "constOpti.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CconstOpti::CconstOpti()
{
	//常量定值表:
	table = NULL;
}

CconstOpti::~CconstOpti()
{

}

/************		实用函数		**************************/ 

/********************************************************/
/* 函数名  DivBaseBlock									*/
/* 功  能  为中间代码划分基本块							*/
/* 说  明  基本块从0开始编号,若有变参传递,则相应过程  */
/*	       调用做为当前基本块的结束						*/
/********************************************************/
int  CconstOpti::DivBaseBlock(CodeFile *firstCode)
{   
	/*初始化基本块数目*/
	int blocknum = 0;
	
	CodeFile  *code = firstCode ;
    /*初始化基本块指针*/
	for (int i=0;i<100;i++)
		baseBlock[i]=NULL;

    baseBlock[blocknum++] =code;
	if (code->next != NULL)
	   code = code->next;

	while (code != NULL)
	{
	   switch(code->codeR.codekind)
	   {/*声明类的代码*/ 
	    case LABEL:
		case WHILESTART:
        case PENTRY:
		case MENTRY:
			 /*进入一个新的基本块*/
			 baseBlock[blocknum++] =code;  
			 break;
        /*跳转类的代码*/
		case JUMP:
		case JUMP0:
		case RETURNC:
		case ENDPROC:
		case ENDWHILE:

			/*从下一条语句开始,进入一个新的基本块*/
			 if (code->next!= NULL)
			 { code = code->next;
			   baseBlock[blocknum++] =code;
			 }
			 break;
		/*变参传递*/
		case VARACT: 
			 /*找到对应的过程调用语句,作为本基本块的结束*/
			 code = code->next;
			 while (code->codeR.codekind != CALL)
				 code = code->next;
			 /*从下一条语句开始,进入一个新的基本块*/
			 if (code->next!= NULL)
			 { code = code->next;
			   baseBlock[blocknum++] =code;
			 }
			 
        default : break;
	   }
       code = code->next;
	}
	return(blocknum);
}
 
/********************************************************/
/* 函数名  PrintBaseBlock								*/
/* 功  能  打印基本块第一条代码,以显示基本块的划分		*/
/* 说  明												*/
/********************************************************/  
void CconstOpti::PrintBaseBlock(int  blocknum)
{
	for (int i=0;i<blocknum ;i++)
	{ 
		PrintOneCode(baseBlock[i]);
      fprintf(listing,"\n");
	}
}


/********************************************************/
/* 函数名  PrintMidCode 								*/
/* 功  能  打印中间代码序列								*/
/* 说  明												*/
/********************************************************/
void  CconstOpti::PrintMidCode(CodeFile  *firstCode)
{   int i = 0;
	CodeFile  *code = firstCode ;
	while (code!=NULL)
	{ fprintf(listing ,"           ");
    	fprintf(listing ,"%d%s",  i, ":  ");
	  PrintOneCode(code);
	  fprintf(listing,"\n");
	  code = code ->next;
	  i++;
	}
}
/********************************************************/
/* 函数名  PrintOneCode 								*/
/* 功  能  打印一条中间代码								*/
/* 说  明  由函数PrintMidCode调用						*/
/********************************************************/
void CconstOpti::PrintOneCode(CodeFile  *code)
{ 
    PrintCodeName(code->codeR.codekind);
	fprintf(listing ,"    ");
	if (code->codeR.arg1!=NULL)
		PrintContent(code->codeR.arg1);
	else  fprintf(listing, "  ");
	fprintf(listing ,"    ");
	if (code->codeR.arg2!=NULL)
		PrintContent(code->codeR.arg2);
	else  fprintf(listing ,"  ");
	fprintf(listing ,"    ");
	if (code->codeR.arg3!=NULL)
		PrintContent(code->codeR.arg3);
	else  fprintf(listing, "  ");
}
 
/********************************************************/
/* 函数名  PrintCodeName  								*/
/* 功  能  打印代码的类别								*/
/* 说  明  由函数PrintOneCode调用						*/
/********************************************************/
void  CconstOpti::PrintCodeName(CodeKind kind)
{
  switch(kind)
  {	case	ADD:		fprintf(listing ,"ADD");     break;
    case    SUB:		fprintf(listing ,"SUB");	 break;
	case	MULT:       fprintf(listing ,"MULT");    break;
	case	DIV:		fprintf(listing ,"DIV");     break;
	case	EQC:		fprintf(listing ,"EQ");      break;
	case	LTC:		fprintf(listing ,"LT");      break;
	case	READC:		fprintf(listing ,"READ");    break;
	case	WRITEC:		fprintf(listing ,"WRITE");	 break;
	case	RETURNC:	fprintf(listing ,"RETURN");  break;
	case	ASSIG:		fprintf(listing ,"ASSIG");   break;
	case    AADD:		fprintf(listing ,"AADD");    break;
	case    LABEL:		fprintf(listing ,"LABEL");   break;
	case    JUMP0:		fprintf(listing ,"JUMP0");   break;
	case    JUMP:		fprintf(listing ,"JUMP");    break;
	case    CALL:		fprintf(listing ,"CALL");    break;
	case    VARACT:		fprintf(listing ,"VARACT");  break;
	case    VALACT:		fprintf(listing ,"VALACT");  break;
	case    PENTRY:		fprintf(listing ,"PENTRY");  break;
	case    ENDPROC:	fprintf(listing ,"ENDPROC"); break;
	case    MENTRY:		fprintf(listing ,"MENTRY");  break;
	case    WHILESTART: fprintf(listing ,"WHILESTART");break;
	case    ENDWHILE:   fprintf(listing ,"ENDWHILE");  break;
	default:  break;
  }
}

/********************************************************/
/* 函数名  PrintCotent  								*/
/* 功  能  打印ARG结构的内容							*/
/* 说  明  由函数PrintOneCode调用						*/
/********************************************************/
void CconstOpti::PrintContent(ArgRecord  *arg)
{
	switch(arg->form)
	{case  LabelForm : fprintf(listing ,"%d",arg->Attr.label); break;
	 case  ValueForm : fprintf(listing ,"%d",arg->Attr.value); break;
	 case  AddrForm: 
		 //d:fprintf(listing ,"(");
		 if (arg->Attr.addr.dataLevel!=-1)
		      fprintf(listing ,arg->Attr.addr.name);
		 else 
		 { fprintf(listing ,"temp");
		        fprintf(listing ,"%d",arg->Attr.addr.dataOff);
		 }
		 /*
		 fprintf(listing ," , ");
		 fprintf(listing ,"%d",arg->Attr.addr.dataLevel);
		 fprintf(listing ," , ");
		 fprintf(listing ,"%d",arg->Attr.addr.dataOff);
		 fprintf(listing ," , ");
		 switch( arg->Attr.addr.access)
		 { case dir :  fprintf(listing ,"dir");   break;
		   case indir: fprintf(listing ,"indir"); break;
		   default  : break;
		  }
		 fprintf(listing ,")");
	     */
		 break;
	 default:  break;
	}
}


/**********			常量表达式优化的函数实现	****************/

/****************************************************/
/* 函数名  ConstOptimize							*/
/* 功  能  常表达式优化主函数      					*/
/* 说  明  循环对各个基本块进行常表达式优化		    */
/****************************************************/
Cglobal::CodeFile  *CconstOpti::ConstOptimize(CodeFile *firstCode)
{    
	//常量定值表:
	table = NULL;

	/*用于释放空间*/
	ConstDefT  * freeTemp = NULL;

	/*调用划分基本块函数*/
	int blocknum = DivBaseBlock(firstCode);

	fprintf(listing, ">>基本块划分:(显示每个基本块的第一条语句以表示划分)\n");
    PrintBaseBlock(blocknum);
    //getchar( );

	//fprintf(listing,">>常量定值表的变化过程:\n");

    /*循环对每个基本块进行常表达式优化*/
	for (int i=0 ; i<blocknum ;i++)
	{  /*基本块入口处置常量定值表为空*/
	   table = NULL;
	   /*基本块的常表达式优化*/
       OptiBlock(i);
	   /*释放此基本块的常量定值表空间*/
	   while (table!=NULL)
	   {  freeTemp = table;
	      table = freeTemp->next;
		  free(freeTemp);
	   }
	}
	/*返回优化后的中间代码*/
	return(firstCode);
}

/****************************************************/
/* 函数名  OptiBlock								*/
/* 功  能  对一个基本块进行常表达式优化				*/
/* 说  明										    */
/****************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -