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

📄 util.cpp

📁 学习编译原理
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			case 5:
			case 6:
			case 7:
			case 8:
			case 9:
				fprintf(listing,"line:%d",tree->lineno);
				printTab(2);
				break;
			default:
				fprintf(listing,"line:%d",tree->lineno);
				printTab(1);
		}

    /* 调用函数printSpaces,打印相应的空格,进行缩进 */ 
    printSpaces();	
  
  switch ( tree->nodekind)
  {   case ProK : 
		   fprintf(listing,"%s  ","ProK"); break;
      case PheadK:
		  {fprintf(listing,"%s  ","PheadK");
		   fprintf(listing,"%s  ",tree->name[0]);
		  }
		   break;
	  case DecK:
		{  fprintf(listing,"%s  ","DecK"); 
          if (tree->attr.ProcAttr.paramt==varparamType )
			  fprintf(listing,"%s  ","var param:");
		  if (tree->attr.ProcAttr.paramt==valparamType)
			  fprintf(listing,"%s  ","value param:");
		   switch(tree->kind.dec)
		   { case  ArrayK:
		     { 
			   fprintf(listing,"%s  ","ArrayK");
               fprintf(listing,"%d  ",tree->attr.ArrayAttr.up);
			   fprintf(listing,"%d  ",tree->attr.ArrayAttr.low);
			   if (tree->attr.ArrayAttr.childtype == CharK)
				    fprintf(listing,"%s  ","Chark");
			   else if( tree->attr.ArrayAttr.childtype == IntegerK)
				    fprintf(listing,"%s  ","IntegerK");
			 };break;
		     case  CharK:
			 fprintf(listing,"%s  ","CharK");break;
			 case  IntegerK:
			 fprintf(listing,"%s  ","IntegerK");break;
			 case  RecordK:
			 fprintf(listing,"%s  ","RecordK");break;
			 case  IdK:
			 fprintf(listing,"%s  ","IdK");
			 fprintf(listing,"%s  ",tree->attr.type_name);
			 break;
			 default: 
				 fprintf(listing,"error1!");
				 Error = TRUE;
		   };
         if (tree->idnum !=0)
	       for (int i=0 ; i <= (tree->idnum);i++)
		   {
			   fprintf(listing,"%s  ",tree->name[i]);
				
		   }
		else  
			{
				fprintf(listing,"wrong!no var!\n");
				Error = TRUE;	
			}
		} break;
	  case TypeK:
		   fprintf(listing,"%s  ","TypeK");break;
	  
	  case VarK:
		   fprintf(listing,"%s  ","VarK");
		   if(tree->table[0]!=NULL)
			   fprintf(listing,"%d  %d  ",tree->table[0]->attrIR.More.VarAttr.off,tree->table[0]->attrIR.More.VarAttr.level);
		   break;
	  
	  case ProcDecK: 
			fprintf(listing,"%s  ","ProcDecK");
		    fprintf(listing,"%s  ",tree->name[0]);
			if(tree->table[0]!=NULL)
				fprintf(listing,"%d %d %d  ",tree->table[0]->attrIR.More.ProcAttr.mOff,tree->table[0]->attrIR.More.ProcAttr.nOff,tree->table[0]->attrIR.More.ProcAttr.level);
            break;
	  
	  case StmLK:
		   fprintf(listing,"%s  ","StmLk");break;
	  
	  case StmtK:
		  { fprintf(listing,"%s  ","StmtK");
            switch (tree->kind.stmt)
			{ case IfK:
    		       fprintf(listing,"%s  ","If");break;
			  case WhileK:
		           fprintf(listing,"%s  ","While");break;
			  
			  case AssignK:
		           fprintf(listing,"%s  ","Assign");
				   break;
			  
			  case ReadK:
		           fprintf(listing,"%s  ","Read");
				   fprintf(listing,"%s  " , tree->name[0]);
				   if(tree->table[0]!=NULL)
					   fprintf(listing,"%d   %d  ",tree->table[0]->attrIR.More.VarAttr.off,tree->table[0]->attrIR.More.VarAttr.level);
				   break;
			  
			  case WriteK:
		           fprintf(listing,"%s  ","Write");break;
			  
			  case CallK:
		           fprintf(listing,"%s  ","Call");
				   fprintf(listing,"%s  ", tree->name[0]);
				   break;
			  
			  case ReturnK:
		           fprintf(listing,"%s  ","Return");break;
     
			  default: 
				fprintf(listing,"error2!");
				Error = TRUE;	
			}
          };break;
	  case ExpK: 
		  { fprintf(listing,"%s  ","ExpK");
		    switch (tree->kind.exp)
			{ case OpK:
    		      { fprintf(listing,"%s  ","Op");
			        switch(tree->attr.ExpAttr.op)
					{ case EQ:   fprintf(listing,"%s  " , "="); break;
                      case LT:   fprintf(listing,"%s  " , "<"); break;      
                      case PLUS: fprintf(listing,"%s  " , "+"); break;   
                      case MINUS:fprintf(listing,"%s  " , "-"); break;
					  case TIMES:fprintf(listing,"%s  " , "*"); break;  
                      case OVER: fprintf(listing,"%s  " , "/"); break;  
                      default: 
						  fprintf(listing,"error3!");
						  Error = TRUE;
					}

					if(tree->attr.ExpAttr.varkind==ArrayMembV)
					{
						fprintf(listing,"ArrayMember  ");
						fprintf(listing,"%s  ",tree->name[0]);
					}
                  };break;
			  case ConstK:
				    fprintf(listing,"%s  ","Const");
					switch(tree->attr.ExpAttr.varkind)
					{
						case IdV:
					    fprintf(listing,"Id  ");
						fprintf(listing,"%s  ",tree->name[0]);
						break;
						case FieldMembV:
					    fprintf(listing,"FieldMember  ");
					    fprintf(listing,"%s  ",tree->name[0]);
						break;
						case ArrayMembV:
					    fprintf(listing,"ArrayMember  ");
						fprintf(listing,"%s  ",tree->name[0]);
						break;
						default: 
							fprintf(listing,"var type error!");
							Error = TRUE;
					}
					
					fprintf(listing,"%d  ",tree->attr.ExpAttr.val);
					break;
			  case VariK:
		           fprintf(listing,"%s  ","Vari");
                   switch(tree->attr.ExpAttr.varkind)
				   {
						case IdV:
					    fprintf(listing,"Id  ");
						fprintf(listing,"%s  ",tree->name[0]);
						break;
						case FieldMembV:
					    fprintf(listing,"FieldMember  ");
					    fprintf(listing,"%s  ",tree->name[0]);
						break;
						case ArrayMembV:
					    fprintf(listing,"ArrayMember  ");
						fprintf(listing,"%s  ",tree->name[0]);
						break;
						default: 
							fprintf(listing,"var type error!");
							Error = TRUE;
				   }
				   if(tree->table[0]!=NULL)
					   fprintf(listing,"%d   %d  ",tree->table[0]->attrIR.More.VarAttr.off,tree->table[0]->attrIR.More.VarAttr.level);

				   break;
              default: 
				  fprintf(listing,"error4!");
				  Error = TRUE;
			}
		  };break;
   default: 
	   fprintf(listing,"error5!");
	   Error = TRUE;
   }
   
   fprintf(listing,"\n");
   
    /* 对语法树结点tree的各子结点递归调用printTree过程 *
	 * 缩进写入列表文件listing						   */
    for (i=0;i<MAXCHILDREN;i++)
         printTree(tree->child[i]);

	/* 对语法树结点tree的兄弟节点递归调用printTree过程 *
	 * 缩进写入列表文件listing						   */ 
	tree = tree->sibling;			
  }

  /* 减量缩进宏,每次退出语法树节点时减量缩进 */
  UNINDENT;							
}



/*************下面的函数用于中间代码生成**************************/ 

/********************************************************/
/* 函数名  NewTemp		  								*/
/* 功  能  产生一个新的临时变量的ARG结构				*/
/* 说  明  临时变量的层数为-1,偏移为编号值,访问方式由 */
/*		   参数确定										*/
/********************************************************/
ArgRecord  *NewTemp (AccessKind  access )
{  
   ArgRecord  *newTemp=(ArgRecord *)malloc(sizeof(ArgRecord)) ;
   /*填写临时变量的ARG内容*/
   
   newTemp->form = AddrForm ;
   newTemp->Attr.addr.dataLevel = -1 ;
   newTemp->Attr.addr.dataOff=TempOffset ;
   newTemp->Attr.addr.access= access;
   /*临时变量编号加1*/   
   TempOffset++;
      
   return (newTemp);
}

/********************************************************/
/* 函数名  NewLabel		  								*/
/* 功  能  产生一个新的标号值							*/
/* 说  明  通过全局变量Label加1,产生新的标号值			*/
/********************************************************/
int  NewLabel()
{  Label++;  
   return (Label);
}

/********************************************************/
/* 函数名  ARGAddr		  								*/
/* 功  能  对于给定的变量产生相应的ARG结构				*/
/* 说  明  												*/
/********************************************************/

ArgRecord  *ARGAddr(char  *id ,int level, int off, AccessKind access)
{   
	ArgRecord  *arg = (ArgRecord *)malloc(sizeof(ArgRecord));
	/*填写变量ARG结构的内容*/
    arg->form = AddrForm ;
	strcpy(arg->Attr.addr.name,id);
	arg->Attr.addr.dataLevel=level;
	arg->Attr.addr.dataOff=off;
    arg->Attr.addr.access=access;
		  
    return  (arg);
}
/********************************************************/
/* 函数名  ARGLabel		  								*/
/* 功  能  对于给定的标号产生相应的ARG结构				*/
/* 说  明  												*/
/********************************************************/
ArgRecord *ARGLabel(int  label )
{  ArgRecord  *arg = (ArgRecord *) malloc (sizeof(ArgRecord));
   arg->form = LabelForm ;
   arg->Attr.label = label ;

   return (arg);
}

/********************************************************/
/* 函数名  ARGValue		  								*/
/* 功  能  对于给定的常数值产生相应的ARG结构			*/
/* 说  明  												*/
/********************************************************/
ArgRecord  *ARGValue(int value)
{ ArgRecord  *arg = (ArgRecord *) malloc (sizeof(ArgRecord));
  arg->form = ValueForm ;
  arg->Attr.value = value ;

  return (arg);
}


/********************************************************/
/* 函数名  GenCode 		  								*/
/* 功  能  根据给定参数,构造一条中间代码				*/
/* 说  明												*/
/********************************************************/

CodeFile *GenCode (CodeKind codekind , ArgRecord *Arg1 ,ArgRecord *Arg2 ,ArgRecord *Arg3 )
{ 
    CodeFile  *newCode = (CodeFile  *) malloc (sizeof (CodeFile ));
    /*填写代码的内容*/	
	newCode->codeR.codekind = codekind ;
	newCode->codeR.arg1 = Arg1;  
	newCode->codeR.arg2 = Arg2;
	newCode->codeR.arg3 = Arg3;
	newCode->former = NULL;
	newCode->next = NULL;
    /*链入中间代码表中*/
	if  (firstCode==NULL)
		 firstCode = newCode ;
	else
	{	   lastCode->next=newCode;
		   newCode->former = lastCode;
	}
	lastCode = newCode ;

	return(newCode);
}
/********************************************************/
/* 函数名  PrintCodeName  								*/
/* 功  能  打印代码的类别								*/
/* 说  明  由函数PrintOneCode调用						*/
/********************************************************/
void  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 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;
	}
}

/********************************************************/
/* 函数名  PrintOneCode 								*/
/* 功  能  打印一条中间代码								*/
/* 说  明  由函数PrintMidCode调用						*/
/********************************************************/
void 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, "  ");
}

/********************************************************/
/* 函数名  PrintMidCode 								*/
/* 功  能  打印中间代码序列								*/
/* 说  明												*/
/********************************************************/
void  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++;
	}
}


/*************下面的函数用于中间代码优化**************************/ 

/********************************************************/
/* 函数名  DivBaseBlock									*/
/* 功  能  为中间代码划分基本块							*/
/* 说  明  基本块从0开始编号,若有变参传递,则相应过程  */
/*	       调用做为当前基本块的结束						*/
/********************************************************/
int  DivBaseBlock()
{   
	/*初始化基本块数目*/
	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:

⌨️ 快捷键说明

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