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