ccompile.cpp
来自「c 语言写的C语言编译器,使用vc++6.0」· C++ 代码 · 共 1,651 行 · 第 1/2 页
CPP
1,651 行
if(!strcmp(symch,"}"))
{
error(4);
}
}
}
void SemiSeries()//语句序列
{
if(sort==0 || sort==2 || !(strcmp(symch,"{")))
{
Semi();
/*
if(!strcpy(symch,";"))
{
GetSymbol();
SemiSeries1();
}
else
{
error(6);
SemiSeries1();
}
*/
SemiSeries();
}
}
void SemiSeries1()//语句序列1
{
// if(!strcmp(symch,";"))
// {
Semi();
// GetSymbol();
// }
}
void AssignSemi()//赋值语句
{
if(sort==2)
{
GetSymbol();
if(!strcmp(symch,"="))
{
GetSymbol();
Express();
}
}
}
void Condition()//条件
{
cout<<"deal condition!"<<endl;
Express();
if(!strcmp(symch,"<") || !strcmp(symch,"<=") || !strcmp(symch,">") || !strcmp(symch,">=") || !strcmp(symch,"==") || !strcmp(symch,"!=") )
{
cout<<"deal the symbol"<<endl;
GetSymbol();
cout<<"deal express"<<endl;
Express();
}
else
{
error(10);
}
}
void Express()//表达式
{
cout<<"now deal express"<<endl;///////////////////////////////////////////
Trade();
Express1();
}
void Express1()
{
if(!strcmp(symch,"+") ||!strcmp(symch,"-"))
{
GetSymbol();
Trade();
Express1();
}
}
void Trade()
{
Factor();
Trade1();
}
void Trade1()
{
if(!strcmp(symch,"*") || !strcmp(symch,"/"))
{
GetSymbol();
Factor();
Trade1();
}
}
void Factor()
{
if(sort==2)
{
GetSymbol();
}
else if(sort==3)
{
GetSymbol();
}
else
{
Express();
}
}
void ConditionSemi()//条件语句
{
if(!strcmp(symch,"if"))
{
cout<<"now start anaysics if sentence!"<<endl;
GetSymbol();
if(!strcmp(symch,"("))
{
GetSymbol();
Condition();
if(!strcmp(symch,")"))
{
GetSymbol();
//cout<<"in deal else"<<endl;
if(!strcmp(symch,"{"))
ComplexSemi();
else
Semi();
if(!strcmp(symch,"else"))
{
GetSymbol();
if(!strcmp(symch,"{"))
ComplexSemi();
else
Semi();
}
else
{
error(11);
Semi();
}
}
else
{
error(12);
Semi();
if(!strcmp(symch,"else"))
{
GetSymbol();
Semi();
}
else
{
error(11);
Semi();
}
}
}
else
{
error(13);
Express();
if(!strcmp(symch,")"))
{
GetSymbol();
Semi();
if(!strcmp(symch,"else"))
{
GetSymbol();
Semi();
}
else
{
error(11);
Semi();
}
}
else
{
error(12);
Semi();
if(!strcmp(symch,"else"))
{
GetSymbol();
Semi();
}
else
{
error(11);
Semi();
}
}
}
}
}
void LoopSemi()//循环语句
{
if(!strcmp(symch,"while"))
{
GetSymbol();
if(!strcmp(symch,"("))
{
GetSymbol();
Condition();
if(!strcmp(symch,")"))
{
GetSymbol();
Semi();
}
else
{
error(12);
Semi();
}
}
else
{
error(13);
Condition();
if(!strcmp(symch,")"))
{
GetSymbol();
Semi();
}
else
{
error(12);
Semi();
}
}
}
}
//************************************************the init word for grammer anaysics ***********************************/
/*CodeList* initCode(int calLen,int Lfirst,int Lsecond,int Ldest)//init the code struct
{
cout<<"start init the code space!"<<endl;
CodeList celement;
celement.cal=new char[calLen];
celement.first=new char[Lfirst];
celement.second=new char[Lsecond];
celement.destination=new char[Ldest];
celement.next=NULL;
return &celement;
}*/
int crC=0;
CodeList *pCL=new CodeList;
int genCode(char *cal,char *first,char *second,char *destination)//4元式生成函数
{
cout<<"start generator code!"<<endl;
if(!cal||!first||!second||!destination)
{
cout<<"error happen at the gencode!"<<endl;
return 1;
}
CodeList *ce=new CodeList();
ce->cal=new char[strlen(cal)];
ce->first=new char[strlen(first)];
ce->second=new char[strlen(second)];
ce->destination=new char[strlen(destination)];
strcpy(ce->cal,cal);
strcpy(ce->first,first);
strcpy(ce->second,second);
ce->destination=destination;
if(!head)
{
pCL=ce;
head=ce;
ce->next=NULL;
}
else{
pCL->next=ce;
pCL=ce;
ce->next=NULL;
}
// ce->next=head;
// head=ce;
// cout<<"cout head current address is "<<head<<endl;
int r=crC;
crC++;
cout<<"get a code"<<endl;
cout<<crC<<" "<<ce->cal<<" "<<ce->first<<" "<<ce->second<<" "<<ce->destination<<endl;
PreCodeLine=r;
NextCodeLine=r+1;
cout<<"the Next Line "<<NextCodeLine <<endl;
return r;
}
int otCode()//out code to CodeFinal.txt
{
crC=0;
ofstream fos;
fos.open("CodeFinal.txt");
CodeList *pCL=head;
cout<<"the code start out put "<<endl;
if(!pCL)return NULL;
while(pCL)
{
fos<<crC<<":"<<" "<<pCL->cal<<" "<<pCL->first<<" "<<pCL->second<<" "<<pCL->destination<<endl;
cout<<crC<<" "<<pCL->cal<<" "<<pCL->first<<" "<<pCL->second<<" "<<pCL->destination<<endl;
if(!pCL->next)break;
pCL=pCL->next;
crC++;
}
cout<<"the code is output int the CodeFinal.txt"<<endl;
return 1;
}
int findUsr(char *name) //查找用户标示符是否存在
{
cout<<"start to find the user declare"<<endl;
for(int i=0;i<LINENUM;i++)
{
if(strcpy(usr[i],name))
{
return 1;//find the usr ;
}
}
return -1;//not find the usr defination
}
int cU=0;
int cN=0;
char *getNextUsr()//下一个用户自定义标示符
{
char *p=usr[cU];
cU++;
return p;
}
char *getNextNum()//下一个数字
{
int p=cN;
cN++;
return num[p];
}
int rT=0;
char temp[3];
char *genTemp()//产生临时变量
{
temp[0]='T';
temp[1]='\0';
char *p=changeNumToString(rT);
cout<<"the radio number is "<<p<<endl;
rT++;
strcat(temp,p);
return temp;
}
char *pAd;//记录当前需代填的地址
TrueList *pT;//当前的代填跳转地址栈的末尾
char* getTrue()//将代填的跳转号压入栈
{
TrueList *tL=new TrueList;
if(!TrueHead)
{
TrueHead=tL;
pT=tL;
}
else{
pT->next=tL;
pT=tL;
}
tL->next=NULL;
tL->codeElement=new char[3];
pAd=tL->codeElement;//全局变量记录
return tL->codeElement;//返回当前代填的地址空间
}
char *deleteTrue(char * pC)//将队列头给4元式的待填语句
{
cout<<"the destination is address is"<<pC<<endl;
if(!TrueHead)return NULL;
if(TrueHead)
{
strcpy(TrueHead->codeElement,pC);
cout<<"TrueHead->codeElement "<<TrueHead->codeElement<<endl;
if(!TrueHead->next)return NULL;
TrueHead=TrueHead->next;
}
return NULL;
}
char * changeNumToString(int number)//将数字转化为符号串
{
char buffer[1000];
ostrstream sout(buffer,sizeof(buffer));
sout<<number<<'\0';
char *p=sout.str();
cout<<"the number to String is "<<p<<endl;
return p;
}
/***********************the end of init***************************/
char * genExpress1(char*);
void Generate()
{
system("type code.txt");
clear();
GetSymbol();
genProgram();
}
void genProgram()
{
if(!strcmp(symch,"main"))
{
GetSymbol();
if(!strcmp(symch,"("))
{
GetSymbol();
if(!strcmp(symch,")"))
{
GetSymbol();
if(!strcmp(symch,"{"))
{
GetSymbol();
genProPart();// child program part
if(!strcmp(symch,"}"))
{
GetSymbol();
}
else
{
error(4);
}
}
else
{
error(3);
}
}
else
{
error(12);
}
}
else
{
error(13);
}
}
else
{
error(5);
}
}
void genProPart()
{
ConstDec();//const declare
VarDecPart();//val declare
if(!strcmp(symch,";"))
{
GetSymbol();
genSemiPart();//sentence part
}
else
{
error(6);
}
}
void genConstDec()
{
if(!strcmp(symch,"const"))
{
GetSymbol();
genConstDef();
if(!strcmp(symch,";"))
{
GetSymbol();
}
else
{
error(6);
}
}
}
void genIdent()
{
if(sort==usrsym)
{
GetSymbol();
}
else
{
error(2);
}
}
void genConstDef()
{
Ident();
if(!strcmp(symch,"="))
{
GetSymbol();
if(sort==3)
{
GetSymbol();
}
else
{
error(7);
}
}
else
{
GetSymbol();
error(8);
}
}
void genVarDecPart()//变量说明部分
{
genVarDec();
genIdentTab();//anaysics the identity table
}
void genVarDec()//judge if int
{
if(!strcmp(symch,"int"))
{
GetSymbol();
}
else
{
error(9);
}
}
void genIdentTab()
{
genIdent();//judge if the identity
genIdentTab1();
}
void genIdentTab1()
{
if(!strcmp(symch,","))
{
GetSymbol();
genIdent();
genIdentTab1();
}
}
void genSemiPart()//语句部分
{
if(!strcmp(symch,"{"))
{
genComplexSemi();//deal complex
}
else
genSemiSeries();//deal series sentence
}
void genSemi()//语句
{
// cout<<"else"<<endl;
if(sort==2)
{
genAssignSemi();//deal assignment sentence
if(!strcmp(symch,";"))
{
GetSymbol();
}
else
{
error(6);
}
}
else if(!strcmp(symch,"if"))
{
genConditionSemi();
}
else if(!strcmp(symch,"while"))
{
genLoopSemi();
}
else
genComplexSemi();
}
void genComplexSemi()//复合语句
{
if(!strcmp(symch,"{"))
{
GetSymbol();
genSemiSeries();
if(!strcmp(symch,"}"))
{
GetSymbol();
}
else
error(4);
}
else
{
error(3);
}
}
void genSemiSeries()//语句序列
{
if(sort==0 || sort==2 || !(strcmp(symch,"{")))
{
genSemi();
genSemiSeries();
}
}
void genSemiSeries1()//语句序列1
{
// if(!strcmp(symch,";"))
// {
genSemi();
// GetSymbol();
// }
}
void genAssignSemi()//赋值语句
{
cout<<"NOW DEAL ASSIGNMENT"<<endl;
if(sort==2)
{
char *pU=getNextUsr();//the previous usr defination symbol
if(findUsr(pU)==-1)
{
cout<<"had no definition of user"<<endl;
return;
error(2);
}
GetSymbol();
if(!strcmp(symch,"="))
{
cout<<"symbol is "<<symch<<endl;
GetSymbol();
char *pV=genExpress();
if(!pV){
cout<<"error at genExpress()"<<endl;
}
cout<<"get a asignment sentence"<<endl;
genCode("=",pV,"-",pU);
}
}
}
char* genCondition()//条件
{
cout<<"deal condition!"<<endl;
char *p1=genExpress();//get the val of expless
if(!strcmp(symch,"<") || !strcmp(symch,"<=") || !strcmp(symch,">") || !strcmp(symch,">=") || !strcmp(symch,"==") || !strcmp(symch,"!=") )
{
char cp[3];
strcpy(cp,symch);
cout<<"deal the symbol"<<endl;
GetSymbol();
cout<<"deal express"<<endl;
char *p2=genExpress();
char *temp=genTemp();
getTrue();
genCode(cp,p1,p2,pAd);
genCode(":=","0","-",temp);
getTrue();
genCode("GOTO","-","-",pAd);
int cA=genCode(":=","1","-",temp);//the address of current address
deleteTrue(changeNumToString(cA));
return temp;
}
else
{
error(10);
return NULL;
}
}
char* genExpress()//表达式
{
cout<<"now deal express"<<endl;///////////////////////////////////////////
char *pT=genTrade();
return genExpress1(pT);
}
char* genExpress1(char *pT0)
{
cout<<"the genexpress1 is "<<pT0<<endl;
if(!pT0)return NULL;
if(!strcmp(symch,"+") ||!strcmp(symch,"-"))
{
char cal[2];
strcpy(cal,symch);
cout<<"the previous char"<<cal<<endl;
cout<<"now deal the add calulate"<<endl;
GetSymbol();
char *pT=genTrade();
char *temp=genTemp();
genCode(cal,pT0,pT,temp);
return genExpress1(temp);
}
return pT0;
}
char *genTrade1(char*);
char* genTrade()
{
char *pF=genFactor();
return genTrade1(pF);
}
char* genTrade1(char *pF0)
{
if(!pF0)return NULL;
if(!strcmp(symch,"*") || !strcmp(symch,"/"))
{
char cal[2];
strcpy(cal,symch);
GetSymbol();
char *pF=genFactor();
if(!pF)return NULL;
char *temp=genTemp();
genCode(cal,pF0,pF,temp);
return genTrade1(temp);
}
return pF0;
}
char* genFactor()
{
if(sort==2)
{
char *pU=getNextUsr();
if(!pU)return NULL;
if(findUsr(pU)==-1)
{
cout<<"had not find usr defintion "<<endl;
error(2);
}
GetSymbol();
return pU;
}
else if(sort==3)
{
char *pN=getNextNum();
GetSymbol();
return pN;
}
else
{
return genExpress();
}
}
void genConditionSemi()//条件语句
{
if(!strcmp(symch,"if"))
{
cout<<"now start anaysics if sentence!"<<endl;
GetSymbol();
if(!strcmp(symch,"("))
{
GetSymbol();
char *temp=genCondition();
getTrue();
int c=genCode("!=",temp,"1",pAd);
deleteTrue(changeNumToString(c));
if(!strcmp(symch,")"))
{
GetSymbol();
cout<<"in deal else"<<endl;
if(!strcmp(symch,"{"))
genComplexSemi();//deal the complex sentence
else
genSemi();//deal sentence
getTrue();
int c1=genCode("GOTO","-","-",pAd);
deleteTrue(changeNumToString(c1));
if(!strcmp(symch,"else"))
{
GetSymbol();
if(!strcmp(symch,"{"))
genComplexSemi();
else
genSemi();
deleteTrue(changeNumToString(NextCodeLine));
}
else
{
error(11);
}
}
else
{
error(12);
}
}
else
{
error(13);
}
}
}
void genLoopSemi()//循环语句
{
if(!strcmp(symch,"while"))
{
GetSymbol();
if(!strcmp(symch,"("))
{
GetSymbol();
int cp=PreCodeLine;//记录当前代码地址
Condition();
getTrue();
int c=genCode("!=",temp,"1",pAd);
deleteTrue(changeNumToString(c));
if(!strcmp(symch,")"))
{
GetSymbol();
Semi();
genCode("GOTO","-","-",changeNumToString(cp));
deleteTrue(changeNumToString(NextCodeLine));
}
else
{
error(12);
}
}
else
{
error(13);
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?