📄 constopti.cpp
字号:
// 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 + -