?? createcode.h
字號(hào):
//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++)
{
//對(duì)模塊編號(hào)做一個(gè)預(yù)處理,將Segment進(jìn)行反查
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++; //將頭部的定義變量信息去掉
//將后面所有詞向前移動(dòng)j+1個(gè)位置
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;
//此時(shí)調(diào)用函數(shù)信息及函數(shù)參數(shù)信息已經(jīng)全部被記錄
//下面就利用這些中間代碼寫出最后的生成代碼
fout.open("Code.cpp");
fout<<"#include <stdlib.h>"<<endl;
fout<<"#include <iostream>"<<endl;
fout<<"using namespace std;"<<endl<<endl;
//在主函數(shù)之前,將所有函數(shù)先寫入文件
for(int i=1;i<=SegmentCount;i++)
{
//寫入函數(shù)類型
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]]; //寫入函數(shù)名稱
fout<<"("; //寫入?yún)?shù)信息
for(int j=1;j<=VariantHave[Segment2[i]];j++)
{
fout<<"int ";
fout<<VariantName[Segment2[i]+j]; //寫入?yún)?shù)名稱
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;
//首先把所有變量聲明信息寫進(jìn)去
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; //結(jié)束此過程,寫入文件完畢
}
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) //程序結(jié)束
{
fout<<" "<<endl;
}
else if(strcmp(Word[num][i],";")==0) //遇到分號(hào),按照狀態(tài)處理
{
if(state==10) fout<<"; }"<<endl;
else fout<<";"<<endl;
state=0;
}
else if(strcmp(Word[num][i],"read")==0) //"讀"命令
{
fout<<"cin>>";
state=11; //將狀態(tài)該為讀狀態(tài)
i++; //跳過后面的括號(hào)
}
else if(strcmp(Word[num][i],"write")==0) //"寫"命令
{
fout<<"cout<<";
state=12; //將狀態(tài)該為寫狀態(tài)
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))
{
//遇到變量時(shí),需要判斷此是否為函數(shù)調(diào)用,如果是, 則將其后的括號(hào)中的內(nèi)容全部寫入
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) //將除了變量以外的所有信息轉(zhuǎn)回原形
{
_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) //如果它的下個(gè)字符是"("則作為函數(shù)
{
}
else
{
//就把它當(dāng)作一個(gè)返回值
strcpy(Word[num][i],VariantName[int(Value[num][i])]);
strcat(Word[num][i],"[RunLayer]");
}
}
}
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -