📄 yufa.cpp
字号:
insertpara(root);
funlist[funnum].pvartable[paranum].Rva=paranum;
paranum++;
funlist[funnum].paraVarSize=paranum;
if(root->sibling!=0)
ScanTree(root->sibling);
}
if(root->ntype==ReturnStm)
{
needreturn=1;
printtree(root);
if(root->child[0]!=0)
{
yfoutfile<<"<child>\n";
ScanTree(root->child[0]);
yfoutfile<<"</child>\n";
yfoutfile<<"</tree>\n";
}
if(root->sibling!=0)
ScanTree(root->sibling);
}
if(root->ntype==FunDecl)
{
isroot=0;
varnum=0;
paranum=0;
needreturn=0;
strcpy(curfunname,root->nodestr);
printtree(root);
if(root->child[0]!=0&&root->child[0]->ntype!=OTHER)
{
yfoutfile<<"<child>\n";
ScanTree(root->child[0]);
yfoutfile<<"</child>\n";
}
if(root->child[1]!=0)
{
yfoutfile<<"<child>\n";
ScanTree(root->child[1]);
yfoutfile<<"</child>\n";
}
yfoutfile<<"</tree>\n";
insertfun(root);
isroot=1;//当函数退出时变为全局状态
if((strcmp(funlist[funnum].rettype,"void")==0&&needreturn==1)
||(strcmp(funlist[funnum].rettype,"int")==0&&needreturn==0))
{
cout<<"line"<<root->lineno<<"函数"<<funlist[funnum].funname<<"返回错误";
exit(1);
}
funnum++;//函数结束时再将函数计数器加1
if(root->sibling!=0)
ScanTree(root->sibling);
}
if(root->ntype==VarDecl)
{
printtree(root);
if(isroot==1)
{
insertgloablevar(root);
gloablevarnum++;
}
else {
insertvar(root);
varnum++;
}
if(root->child[0]!=0)
{
yfoutfile<<"<child>\n";
ScanTree(root->child[0]);
yfoutfile<<"</child>\n";
}
if(root->sibling!=0)
ScanTree(root->sibling);
}
if(root->ntype==FunCall)
{
int i,dypara=0;//函数调用时的参数个数
NodeList temproot=root;
printtree(root);
i=searchfun(root);
if(root->child[0]!=0)
{
dypara++;
root=root->child[0];
while(root->sibling!=0)
{
root=root->sibling;
dypara++;
}
}
funlist[funnum].size+=dypara;
cout<<dypara<<i<<funlist[i].paraVarSize;
root=temproot;
if(dypara!=funlist[i].paraVarSize)
{
cout<<"line:"<<root->lineno<<"函数"<<root->nodestr<<"调用参数个数错误"<<endl;
exit(1);
}
if(root->child[0]!=0)
{
yfoutfile<<"<child>\n";
ScanTree(root->child[0]);
yfoutfile<<"</child>\n";
}
yfoutfile<<"</tree>\n";
if(root->sibling!=0)
ScanTree(root->sibling);
}
}
}
//生成目标代码
/*void ScanTreelast(NodeList root)
{
if(root)
{
stmtprocess(root);
if(root->child[0]!=0)
{
ScanTreelast(root->child[0]);
}
if(root->child[1]!=0)
{
ScanTreelast(root->child[1]);
}
if(root->child[2]!=0)
{
ScanTreelast(root->child[2]);
}
if(root->sibling!=0)
{
ScanTreelast(root->sibling);
}
}
}*/
//检查是否含有main函数
int searchmain()
{
for(int i=0;i<funnum;i++)
{
if (strcmp(funlist[i].funname,"main")==0)
{
return 1;
}
}
cout<<"函数中缺少main函数"<<endl;
exit(1);
}
void initcodelist()
{
gencode[curcodenum].op="call";
gencode[curcodenum].arg1="NEAR PTR";
gencode[curcodenum].arg2="_MAIN";
curcodenum++;
gencode[curcodenum].op="HALT";
curcodenum++;
}
//生成代码时变量处理
string varprocess(int varlocate)
{
char temp[10];
string arg;
if(varlocate>=100)
{
varlocate-=100;
arg+="[0+";
itoa(varlocate,temp,10);
arg+=temp;
arg+="]";
}
else
{
arg+="[BP+";
itoa(varlocate+2,temp,10);
arg+=temp;
arg+="]";
}
return arg;
}
//if 语句生成代码
void ifstmt(NodeList root)
{
int tempcodenum;
char temp[10];
// gencode[curcodenum].label="if_stmt";
expressionstmt(root->child[0]);
tempcodenum=curcodenum;
curcodenum++;
stmtprocess(root->child[1]);
itoa(curcodenum,temp,10);
gencode[tempcodenum].arg1=temp;
}
//ifelse 语句生成代码
void ifelsestmt(NodeList root)
{
int tempcodenum1,tempcodenum2;
char temp[10];
expressionstmt(root->child[0]);
tempcodenum1=curcodenum;
curcodenum++;
stmtprocess(root->child[1]);
tempcodenum2=curcodenum;
curcodenum++;
gencode[tempcodenum2].op="JMP";
itoa(curcodenum,temp,10);
gencode[tempcodenum1].arg1=temp;
stmtprocess(root->child[2]);
itoa(curcodenum,temp,10);
gencode[tempcodenum2].arg1=temp;
}
//while语句生成代码
void whilestmt(NodeList root)
{
int tempcodenum,tempcodenum1;
char temp[10];
tempcodenum1=curcodenum;
expressionstmt(root->child[0]);
curcodenum++;
tempcodenum=curcodenum;
stmtprocess(root->child[1]);
gencode[curcodenum].op="JMP";
itoa(tempcodenum1,temp,10);
gencode[curcodenum].arg1=temp;
curcodenum++;
itoa(curcodenum,temp,10);
gencode[tempcodenum-1].arg1=temp;
}
//赋值语句生成代码
void assignstmt(NodeList root)
{
int varlocate;
varlocate=searchvar(root->child[0],curfunnum);
expressionstmt(root->child[1]);
gencode[curcodenum].arg1=varprocess(varlocate);
gencode[curcodenum].op="mov";
gencode[curcodenum].arg2="AX";
curcodenum++;
}
//表达式生成目标代码
void expressionstmt(NodeList root)
{
int varlocate;
switch (root->ntype)
{
case ConstID:
gencode[curcodenum].op="mov";
gencode[curcodenum].arg1="AX";
gencode[curcodenum].arg2=root->nodestr;
curcodenum++;
break;
case VarID:
varlocate=searchvar(root,curfunnum);
gencode[curcodenum].arg2+=varprocess(varlocate);
gencode[curcodenum].op="mov";
gencode[curcodenum].arg1="AX";
curcodenum++;
break;
case ADD:
expressionstmt(root->child[1]);
gencode[curcodenum].op="mov";
gencode[curcodenum].arg1="BX";
gencode[curcodenum].arg2="AX";
curcodenum++;
expressionstmt(root->child[0]);
gencode[curcodenum].op="add";
gencode[curcodenum].arg1="AX";
gencode[curcodenum].arg2="BX";
curcodenum++;
break;
case SUB:
expressionstmt(root->child[1]);
gencode[curcodenum].op="mov";
gencode[curcodenum].arg1="BX";
gencode[curcodenum].arg2="AX";
curcodenum++;
expressionstmt(root->child[0]);
gencode[curcodenum].op="sub";
gencode[curcodenum].arg1="AX";
gencode[curcodenum].arg2="BX";
curcodenum++;
break;
case MUL:
expressionstmt(root->child[1]);
gencode[curcodenum].op="mov";
gencode[curcodenum].arg1="BX";
gencode[curcodenum].arg2="AX";
curcodenum++;
expressionstmt(root->child[0]);
gencode[curcodenum].op="mul";
gencode[curcodenum].arg1="AX";
gencode[curcodenum].arg2="BX";
curcodenum++;
break;
case DIV:
expressionstmt(root->child[1]);
gencode[curcodenum].op="mov";
gencode[curcodenum].arg1="BX";
gencode[curcodenum].arg2="AX";
curcodenum++;
expressionstmt(root->child[0]);
gencode[curcodenum].op="div";
gencode[curcodenum].arg1="AX";
gencode[curcodenum].arg2="BX";
curcodenum++;
break;
case FunCall:
funcallstmt(root);
break;
default:
expressionstmt(root->child[1]);
gencode[curcodenum].op="mov";
gencode[curcodenum].arg1="BX";
gencode[curcodenum].arg2="AX";
curcodenum++;
expressionstmt(root->child[0]);
gencode[curcodenum].op="cmp";
gencode[curcodenum].arg1="AX";
gencode[curcodenum].arg2="BX";
curcodenum++;
switch(root->ntype)
{
case REQ:
gencode[curcodenum].op="JNE";//!=
break;
case RNEQ:
gencode[curcodenum].op="JE";//==
break;
case RLT:
gencode[curcodenum].op="JNL";//>=
break;
case RGT:
gencode[curcodenum].op="JNG";//<=
break;
case RNGT:
gencode[curcodenum].op="JG";//>
break;
case RNLT:
gencode[curcodenum].op="JL";//<
break;
}
}
}
//函数调用语句生成代码
void funcallstmt(NodeList root)
{
int funlocate;
funlocate=geningsearchfun(root);
cout<<funlocate<<endl;
gencode[curcodenum].op="call";
gencode[curcodenum].arg1=funlist[funlocate].funname;
curcodenum++;
}
//函数定义语句生成代码
void fundeclstmt(NodeList root)
{
NodeList temproot;
int funlocate=0;
char temp[10];
returnfinish=0;
funlocate=geningsearchfun(root);
gencode[curcodenum].label+=root->nodestr;
gencode[curcodenum].op+="FUN";
itoa(curfunnum+1,temp,10);
gencode[curcodenum].op+=temp;
gencode[curcodenum].arg1="proc";
gencode[curcodenum].arg2="near";
curcodenum++;
gencode[curcodenum].op="push";
gencode[curcodenum].arg1="BP";
curcodenum++;
gencode[curcodenum].op="mov";
gencode[curcodenum].arg1="BP";
gencode[curcodenum].arg2="SP";
curcodenum++;
gencode[curcodenum].op="add";
gencode[curcodenum].arg1="SP";
itoa(funlist[funlocate].size,temp,10);
gencode[curcodenum].arg2+=temp;
curcodenum++;
temproot=root->child[1];
while(temproot!=0&&temproot->ntype!=ReturnStm)
{
stmtprocess(temproot);
temproot=temproot->sibling;
}
gencode[curcodenum].op="pop";
gencode[curcodenum].arg1="BP";
curcodenum++;
gencode[curcodenum].op="mov";
gencode[curcodenum].arg1="SP";
gencode[curcodenum].arg2="BP";
curcodenum++;
gencode[curcodenum].op="sub";
gencode[curcodenum].arg1="SP";
itoa(funlist[funlocate].size,temp,10);
gencode[curcodenum].arg2+=temp;
curcodenum++;
if(temproot==0&&returnfinish==0)
{
gencode[curcodenum].op="ret";
curcodenum++;
returnfinish=1;
}
else if(temproot->ntype==ReturnStm)
returnstmt(temproot);
}
//return语句生成代码
void returnstmt(NodeList root)
{
if(root->child[0]!=0)
{
expressionstmt(root->child[0]);
gencode[curcodenum].op="ret";
returnfinish=1;
curcodenum++;
}
}
void codegen(NodeList root)
{
while(root)
{
if(root->ntype==VarDecl)
{
gencode[curcodenum].op="push";
gencode[curcodenum].arg1="0";
curcodenum++;
}
if(root->ntype==FunDecl)
{
if(curfunnum==0)
initcodelist();
fundeclstmt(root);
curfunnum++;
}
root=root->sibling;
}
}
//判断函数内部各种语句
void stmtprocess(NodeList root)
{
switch(root->ntype)
{
case IfStm:
ifstmt(root);
break;
case IfElseStm:
ifelsestmt(root);
break;
case WhileStm:
whilestmt(root);
break;
case AssignStm:
assignstmt(root);
break;
case FunCall:
funcallstmt(root);
break;
// case ReturnStm:
// returnstmt(root);
// break;
default:
break;
}
}
//主函数
int main ()
{
int cifaright=cifa();
NodeList rootnode;
for(int i=0;i<20;i++)
{
memset(gloablevarlist[i].varname,0,10);
memset(funlist[i].funname,0,10);
funlist[i].size=2;
for(int j=0;j<20;j++)
memset(funlist[i].pvartable[j].varname,0,10);
}
memset(curfunname,0,10);
if(0==cifaright)
{
cout<<"词法分析错误!"<<endl;
return 0;
}
else cout<<"程序词法正确"<<endl;
rootnode=program();
if(1==yufaright)
cout<<"程序语法正确!"<<endl;
yfoutfile<<"<?xml version=\"1.0\"?>\n<root>\n ";
ScanTree(rootnode->sibling);
yfoutfile<<"</root>";
yfoutfile.close();
sym_table<<"<?xml version=\"1.0\"?>\n<root>\n ";
printsymtable();
sym_table<<"</root>";
for(i=0;i<funnum;i++)
cout<<funlist[i].size;
cout<<endl;
searchmain();//查找main函数,若没有,返回错误
codegen(rootnode->sibling);
codelist<<"<root>\n";
for(i=0;i<curcodenum;i++)
{
cout<<i<<": "<<gencode[i].label<<" "<<gencode[i].op<<" "<<gencode[i].arg1<<" "<<gencode[i].arg2<<endl;
codelist<<"<code>\n"<<"<line>"<<i
<<"</line>\n"<<"<label>"<<gencode[i].label
<<"</label>\n"<<"<op>"<<gencode[i].op
<<"</op>\n"<<"<op1>"<<gencode[i].arg1
<<"</op1>\n"<<"<op2>"<<gencode[i].arg2
<<"</op2>\n"<<"</code>\n";
}
codelist<<"</root>";
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -