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

📄 gencode.cpp

📁 完成一个简化的C语言编译程序
💻 CPP
字号:
#include "gencode.h"

static char* genLabel()
{
	char* p=new char[20];
	static int labelno=0;
	labelno++;
	sprintf(p,"%s%d","L",labelno);
    return p;
}

static void emitCode(char* s)
{
   fprintf(code,"%s\n",s);
}

void genExp(TreeNode* t,int isAddr)
{
    char codestr[CODESIZE];
   TreeNode* p;
	switch(t->kind.exp)
	{
	case ConstK:		
			switch(t->type)
			{
			case Char:
		       sprintf(codestr,"%s %c", "ldc",t->attr.valc);
			   break;
			case Integer:
				sprintf(codestr,"%s %d","ldc",t->attr.vali);
				break;
			case Float:
				sprintf(codestr,"%s %f","ldc",t->attr.valf);
				break;
			}
			emitCode(codestr);
			break;
	case IdK:
		if(isAddr)
			sprintf(codestr,"%s %s","lda",t->attr.name);
		else
			sprintf(codestr,"%s %s","lod",t->attr.name);
		emitCode(codestr);
		break;
	case ArrayK:
		    sprintf(codestr,"%s %s","lda",t->attr.name);
			emitCode(codestr);
			genExp(t->child[0],FALSE);
			switch(t->type)
			{
            case Char:
			    sprintf(codestr,"%s%d%s","ixa elem_size(",1,")");
			    break;
			case Integer:
				sprintf(codestr,"%s%d%s","ixa elem_size(",4,")");
				break;
			case Float:
				sprintf(codestr,"%s%d%s","ixa elem_size(",8,")");
				break;
			default:
				break;
			}
			emitCode(codestr);
			if(!isAddr)
			   emitCode("ind 0 ");
			break;
	case CallK:
		    emitCode("mst");
			p=t->child[0];
			while(p!=NULL)
			{
			genExp(p,FALSE);
			p=p->sibling;
			}
			sprintf(codestr,"%s %s","cup",t->attr.name);
			emitCode(codestr);
			break;
	case OpK:
		    switch(t->attr.op)
			{
            case OR:
				genExp(t->child[0],FALSE);
				genExp(t->child[1],FALSE);
				emitCode("or");
				break;
			case AND:
				genExp(t->child[0],FALSE);
				genExp(t->child[1],FALSE);
				emitCode("and");
				break;
			case NOT:
				genExp(t->child[0],FALSE);
				emitCode("not");
			case GT:
				genExp(t->child[0],FALSE);
				genExp(t->child[1],FALSE);
				emitCode("grt");
				break;
			case GE:
				genExp(t->child[0],FALSE);
				genExp(t->child[1],FALSE);
				emitCode("gre");
				break;
			case EQ:
				genExp(t->child[0],FALSE);
				genExp(t->child[1],FALSE);
				emitCode("equ");
				break;
			case LE:
				genExp(t->child[0],FALSE);
				genExp(t->child[1],FALSE);
				emitCode("le");
				break;
			case LT:
				genExp(t->child[0],FALSE);
				genExp(t->child[1],FALSE);
				emitCode("lt");
				break;
			case NE:
				genExp(t->child[0],FALSE);
				genExp(t->child[1],FALSE);
				emitCode("neq");
				break;
			case PLUS:
				genExp(t->child[0],FALSE);
				genExp(t->child[1],FALSE);
				if(t->type==Integer)
				    emitCode("add");
				else if(t->type==Float)
				    emitCode("addf");
				break;
			case MINUS:
				genExp(t->child[0],FALSE);
				genExp(t->child[1],FALSE);
				if(t->type==Integer)
				    emitCode("sub");
				else if(t->type==Float)
					emitCode("subf");
				break;
			case TIMES:
				genExp(t->child[0],FALSE);
				genExp(t->child[1],FALSE);
				if(t->type==Integer)
				  emitCode("mut");
				else if(t->type==Float)
				   emitCode("mutf");
				break;
			case OVER:
				genExp(t->child[0],FALSE);
				genExp(t->child[1],FALSE);
				if(t->type==Integer)
				  emitCode("div");
				else if(t->type==Float)
					emitCode("divf");
				break;
			default:
				break;
			}
	default:
		break;
	}
     
}

void genStmt(TreeNode* t,char* label)
{
    char codestr[CODESIZE];
	char* lab1,*lab2;
	if(t!=NULL)
	{
	switch(t->kind.stmt)
	{
	case IfK:
		genExp(t->child[0],FALSE);
		lab1=genLabel();
		sprintf(codestr,"%s %s","fjp",lab1);
		emitCode(codestr);
		genStmt(t->child[1],label);
		if(t->child[2]!=NULL)
		{
		   lab2=genLabel();
		   sprintf(codestr,"%s %s","ujp",lab2);
		   emitCode(codestr);
		   sprintf(codestr,"%s %s","lab",lab1);
		   emitCode(codestr);
		   if(t->child[2]!=NULL)
		   {
			   genStmt(t->child[2],label);
			   sprintf(codestr,"%s %s","lab",lab2);
			   emitCode(codestr);
		   }
		}
		else
		{
		   sprintf(codestr,"%s %s","lab",lab1);
		   emitCode(codestr);
		}
		break;
	case WhileK:
		lab1=genLabel();
		sprintf(codestr,"%s %s","lab",lab1);
		emitCode(codestr);
		genExp(t->child[0],FALSE);
		lab2=genLabel();
		sprintf(codestr,"%s %s","fjp",lab2);
		emitCode(codestr);
		genStmt(t->child[1],lab2);
		sprintf(codestr,"%s %s","ujp",lab1);
		emitCode(codestr);
		sprintf(codestr,"%s %s","lab",lab2);
		emitCode(codestr);
		break;
	case BreakK:
		sprintf(codestr,"%s %s","ujp",label);
		emitCode(codestr);
		break;
	case ExpStmtK:
		genExp(t->child[0],FALSE);
		break;
	case CompoundK:
		t=t->child[0];
		while(t->nodekind==DeclK)
		{
			t=t->sibling;
			if(t==NULL)
				break;
		}
		while(t!=NULL)
		{
		genStmt(t,label);
		t=t->sibling;
		}
		break;
	case AssignK:
		genExp(t->child[0],TRUE);
		genExp(t->child[1],FALSE);
		emitCode("sto");
		break;
	case ReturnK:
		if(t->child[0]!=NULL)
		{
			genExp(t->child[0],FALSE);
		}
		sprintf(codestr,"%s %s","ujp",label);
		emitCode(codestr);
		break;

	}
	}
}

void genDecl(TreeNode* t)
{
	char codestr[CODESIZE];
	char* lab1;
      if(t->kind.decl==FuncVarK)
	  {
	      sprintf(codestr,"%s %s","ent",t->attr.name);
		  emitCode(codestr);
		  lab1=genLabel();
		  genStmt(t->child[1],lab1);
		  sprintf(codestr,"%s %s","lab",lab1);
		  emitCode(codestr);
		  emitCode("ret");
	  }
}

void genCode(TreeNode* tree)
{
	char label[20];
	sprintf(label,"L1");
	switch(tree->nodekind)
	{
	case DeclK:
		genDecl(tree);
	default:
		break;
	}
	if(tree->nodekind==DeclK)
	{
		if(tree->kind.decl!=FuncVarK)
		{
	    if(tree->child[0]!=NULL)
			genCode(tree->child[0]);
		if(tree->child[1]!=NULL)
			genCode(tree->child[1]);
		if(tree->child[2]!=NULL)
			genCode(tree->child[2]);
		}
	}
	if(tree->sibling!=NULL)
    	genCode(tree->sibling);
                  
}

⌨️ 快捷键说明

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