📄 复件 createcode.h
字号:
//CreateCode.h
//inputfile: words.txt
//outputfile: TempCode.txt
#ifndef CREATECODE_H_
#define CREATECODE_H_
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#include "RunTime.h"
using namespace std;
/*****************************************************************************************
生成中间代码
******************************************************************************************/
void runTime::CreatCode(char* filename)
{
ofstream fout1("TempCode.txt");
for(int i=0;i<=SegmentCount;i++)
{
//对模块编号做一个预处理,将Segment进行反查
for(int j=1;j<=VariantCount;j++)
if(Segment[j]==i)
Segment2[i]=j;
//还需要将得到的代码过一遍,除掉冗余的信息
while(strcmp(Word[i][0],"var")==0)
{
int j=1;
while(strcmp(Word[i][j],";")!=0) j++; //将头部的定义变量信息去掉
//将后面所有词向前移动j+1个位置
for(int k=j+1;k<=WordCount[i];k++)
{
strcpy(Word[i][k-j-1],Word[i][k]);
Value[i][k-j-1]=Value[i][k];
}
WordCount[i]-=j+1;
}
fout1<<"Segment "<<i<<" :"<<endl;
for(int j=0;j<=WordCount[i];j++)
{
ChangeWords(i,j);
fout1<<Word[i][j]<<" ";
if(
(strcmp(Word[i][j],"then")==0)
||
(strcmp(Word[i][j],"else")==0)
||
(strcmp(Word[i][j],";")==0)
)
fout1<<endl;
}
fout1<<endl;
fout1<<endl;
}
cout<<"temp-code born successful."<<endl;
//此时调用函数信息及函数参数信息已经全部被记录
//下面就利用这些中间代码写出最后的生成代码
fout.open("Code.cpp");
fout<<"#include <stdlib.h>"<<endl;
fout<<"#include <iostream>"<<endl;
fout<<"using namespace std;"<<endl<<endl;
//在主函数之前,将所有函数先写入文件
for(int i=1;i<=SegmentCount;i++)
{
//写入函数类型
if(VariantKind[Segment2[i]]/100==8)
fout<<"void ";
else
{
switch(VariantType[Segment2[1]]%100)
{
case 1:fout<<"int ";break;
case 2:fout<<"real ";break;
case 3:fout<<"bool ";break;
default:break;
}
}
fout<<VariantName[Segment2[i]]; //写入函数名称
fout<<"("; //写入参数信息
for(int j=1;j<=VariantHave[Segment2[i]];j++)
{
fout<<"int ";
fout<<VariantName[Segment2[i]+j]; //写入参数名称
if(j<VariantHave[Segment2[i]])
fout<<" ,";
}
fout<<" )"<<endl;
fout<<"{"<<endl;
Write(i);
fout<<"}"<<endl;
fout<<"}"<<endl;
}
fout<<"int main(int argc,char** argv[])"<<endl;
fout<<"{"<<endl;
//首先把所有变量声明信息写进去
for(int i=1;i<=VariantCount;i++)
if(VariantKind[i]/100==9) //首先要判断是否为程序头信息
{
fout<<"char* "<<VariantName[i]<<" ;"<<endl;
//如果是,则将其定义为char* 类型
}
else if((VariantBelong[i]/100==0)&&(VariantKind[i]/100==1))
//是全局变量
{
switch(VariantType[i]%100)
{
case 0:fout<<"void "; break;
case 1:fout<<"int "; break;
case 2:fout<<"real "; break;
case 3:fout<<"bool "; break;
default:break;
}
fout<<VariantName[i]<<" ;"<<endl;
}
Write(0);
fout<<"system(\"PAUSE\");"<<endl<<"return 0; "<<endl<<"} "<<endl; //文件的尾部
cout<<"total code born successful."<<endl; //结束此过程,写入文件完毕
}
void runTime::Write(int num)
{
int state=0;
int i=-1;
while(i<WordCount[num])
{
if(state==0) state=1;
i++;
if(strcmp(Word[num][i],"begin")==0) //程序块的头
{
fout<<"{"<<endl;
state+=50;
}
else if(strcmp(Word[num][i],"end")==0) //程序块的尾
{
if(state==10) fout<<"; }"<<endl;
state-=50;
}
else if(strcmp(Word[num][i],"while")==0) //while
{
fout<<"while("<<endl;
}
else if(strcmp(Word[num][i],"do")==0) //do
{
fout<<") {"<<endl;
}
else if(strcmp(Word[num][i],".")==0) //程序结束
{
fout<<" "<<endl;
}
else if(strcmp(Word[num][i],";")==0) //遇到分号,按照状态处理
{
if(state==10) fout<<"; }"<<endl;
else fout<<";"<<endl;
state=0;
}
else if(strcmp(Word[num][i],"read")==0) //"读"命令
{
fout<<"cin>>";
state=11; //将状态该为读状态
i++; //跳过后面的括号
}
else if(strcmp(Word[num][i],"write")==0) //"写"命令
{
fout<<"cout<<";
state=12; //将状态该为写状态
i++;
}
else if(strcmp(Word[num][i],")")==0) //只可能是"读"或"写"命令的
{
state=1;
fout<<";"<<endl;
i++;
}
else if(strcmp(Word[num][i],",")==0)
{
if(state==11)
fout<<">>";
else if(state==12)
fout<<"<<";
}
else if(strcmp(Word[num][i],"if")==0)
{
fout<<"if ( ";
}
else if(strcmp(Word[num][i],"then")==0)
{
fout<<" ){"<<endl;
}
else if(strcmp(Word[num][i],"else")==0)
{
fout<<"; }"<<endl<<"else{"<<endl;
state=10;
}
else if(strcmp(Word[num][i],"while")==0)
{
fout<<Word[num][i];
}
else if((Word[num][i][0]>96)&&(Word[num][i][0]<124))
{
//遇到变量时,需要判断此是否为函数调用,如果是, 则将其后的括号中的内容全部写入
if(Word[num][i+1][0]=='(')
{
while(strcmp(Word[num][i+1],")")!=0)
{
fout<<Word[num][i];
i++;
}
fout<<Word[num][i];
fout<<")";
i+=2;
}
else if(strcmp(Word[num][i],VariantName[Segment2[num]])==0)
//如果是变量的返回值,则需要将其写成return形式
{
fout<<" return ";
i++;
}
else //如果是一般变量则直接输出
{
fout<<Word[num][i];
}
}
else //遇到其他的字符,则直接将其输出
{
fout<<Word[num][i];
}
}
if(state!=0) fout<<";"<<endl;
}
void runTime::ChangeWords(int num,int i)
{
if(strcmp(Word[num][i],"number")==0) //将除了变量以外的所有信息转回原形
{
_itoa(int(Value[num][i]),Word[num][i],10);
}
else if(strcmp(Word[num][i],"ids")==0)
{
strcpy(Word[num][i],VariantName[int(Value[num][i])]);
}
else if(strcmp(Word[num][i],"op")==0)
{
switch(int(Value[num][i]))
{
case 1:strcpy(Word[num][i],"+");break;
case 2:strcpy(Word[num][i],"-");break;
case 3:strcpy(Word[num][i],"*");break;
case 4:strcpy(Word[num][i],"/");break;
case 5:strcpy(Word[num][i],"/");break;
case 6:strcpy(Word[num][i],"%");break;
default:break;
}
}
else if(strcmp(Word[num][i],"def")==0)
{
switch(int(Value[num][i]))
{
case 1:strcpy(Word[num][i],"int");break;
case 2:strcpy(Word[num][i],"double");break;
case 3:strcpy(Word[num][i],"bool");break;
default:break;
}
}
else if(strcmp(Word[num][i],"relop")==0)
{
switch(int(Value[num][i]))
{
case 0:strcpy(Word[num][i],"==");break;
case 1:strcpy(Word[num][i],">");break;
case 2:strcpy(Word[num][i],"<");break;
case 3:strcpy(Word[num][i],"<=");break;
case 4:strcpy(Word[num][i],">=");break;
case 5:strcpy(Word[num][i],"<>");break;
default:break;
}
}
else if(strcmp(Word[num][i],"assignop")==0)
{
strcpy(Word[num][i],"=");
}
else if((VariantKind[int(Value[num][i])]==800)||(VariantKind[int(Value[num][i])]==700))
{
if(strcmp(Word[num][i+1],"(")==0) //如果它的下个字符是"("则作为函数
{
}
else
{
//就把它当作一个返回值
strcpy(Word[num][i],VariantName[int(Value[num][i])]);
strcat(Word[num][i],"[RunLayer]");
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -