📄 gencode.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 + -