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

📄 gencode.cpp

📁 pascal的编译器 交作业没问题
💻 CPP
字号:
#include "GenCode.h"
#include "string.h"

void GenCode::Init(FILE *file,Analyze *analyze)
{
    codefile=file;
	IP=0;
	this->analyze=analyze;
	MP=this->analyze->location;          //初始化内存指针为符号表的locaion(符号的个数).
	codes=new Instruction[MAXINSTRLEN];
}
void GenCode::genStmt( TreeNode * tree)
{
  TreeNode * p1, * p2, * p3;
  int Loc,Loc2;
  switch (tree->kind.stmt) {

      case IfK :
         p1 = tree->child[0] ;
         p2 = tree->child[1] ;
         p3 = tree->child[2] ;
		 cGen(p1);               //生成条件表达式代码
		 emitCode("JTU",RX,IP+2);
		 Loc=IP;                 //记录但前指令地址,要回填.
		 emitCode("JMP",NL,0);		
		 cGen(p2);
		 Loc2=IP;                 //记录但前指令地址,要回填.
		 emitCode("JMP",NL,0);
		 backPatch(Loc);          //用当前IP回填地址为Loc的跳转指令参数.
		 cGen(p3);
		 backPatch(Loc2);         //用当前IP回填地址为Loc2的跳转指令参数.
         break; 

      case RepeatK:
         p1 = tree->child[0] ;
         p2 = tree->child[1] ; 
		 Loc=IP;
		 cGen(p1);
		 cGen(p2);
		 emitCode("JTU",RX,IP+2);
		 emitCode("JMP",Loc,0);
         break;  

      case AssignK:
         cGen(tree->child[0]);
         Loc =analyze->st_lookup(tree->attr.name);
		 emitCode("MOV",Loc,RX);
         break;  

      case ReadK:
		 Loc =analyze->st_lookup(tree->attr.name);
         emitCode("IN",Loc,0);
         break;
      case WriteK:
         cGen(tree->child[0]);
         emitCode("OUT",RX,0);
         
         break;
      default:
         break;
    }
}  

void GenCode::genExp( TreeNode * tree)
{ 
  TreeNode * p1, * p2;
  int loc,MP_SAVE;
  switch (tree->kind.exp) {

    case ConstK :
	  emitCode("LOD",MP++,tree->attr.val);   //用LOD指令把常数移到地址为MP的内存单元
	  emitCode("MOV",RX,MP-1);               //把结果放到结果寄存器
	  break;
    
    case IdK :
      loc=analyze->st_lookup(tree->attr.name);
	  emitCode("MOV",RX,loc);
      break;  

    case OpK :
         p1 = tree->child[0];
         p2 = tree->child[1];
         cGen(p1);
         emitCode("MOV",MP,RX);
		 MP_SAVE=MP++;             //记录第一个操作数的内存地址
         cGen(p2);
         switch (tree->attr.op) {
            case PLUS :
               emitCode("ADD",MP_SAVE,RX);
               break;
            case MINUS :
               emitCode("SUB",MP_SAVE,RX);
               break;
            case TIMES :
               emitCode("MUL",MP_SAVE,RX);
               break;
            case OVER :
               emitCode("DIV",MP_SAVE,RX);
               break;
            case LT :
			   emitCode("CLT",MP_SAVE,RX);
               break;
            case EQ :
			  emitCode("CEQ",MP_SAVE,RX);
               break;
            default:
              break;
         }
         break; 

    default:
      break;
  }
}  


void GenCode::cGen( TreeNode * tree)
{ if (tree != NULL)
  { switch (tree->nodekind) {
      case StmtK:          //生成语句的代码
        genStmt(tree);
        break;
      case ExpK:
        genExp(tree);     //生成表达式的代码,表达式的结果存放到RX寄存器
        break;
      default:
        break;
    }
    cGen(tree->sibling);
  }
}


void GenCode::codeGen(TreeNode * syntaxTree)
{
   cGen(syntaxTree);
   emitCode("INT",0,0);  //结束指令
}
void GenCode::emitCode(char *op,int p1,int p2)  //生成一个三元式指令
{
	strcpy(codes[IP].op,op);
	codes[IP].p1=p1;
	codes[IP].p2=p2;
	IP++;                                 //代码序号(地址)加一  
}
void GenCode::backPatch(int loc){         //回填函数
   codes[loc].p1=IP;
}
void GenCode::printCodes()
{
	for(int i=0;i<IP;i++)
	{
       if(codes[i].p1==RX)
          fprintf(codefile,"\t%2d--%3s RX,%d\n",i,codes[i].op,codes[i].p2);
	   else if(codes[i].p2==RX)
		  fprintf(codefile,"\t%2d--%3s %d,RX\n",i,codes[i].op,codes[i].p1);
	   else
		  fprintf(codefile,"\t%2d--%3s %d,%d\n",i,codes[i].op,codes[i].p1,codes[i].p2);
	}
}

⌨️ 快捷键说明

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