📄 c0compiler.cpp
字号:
return 1;
}
oprnum2=oprnum;
if(gen(3,0,0))
return 1;
if(sym!=36)
{
errorline[errornum]=linenum;
error[errornum++]=18;
return 1;
}
sym=getsym();
if(statement())
return 1;
if(gen(4,0,oprnum1))
return 1;
opra[oprnum2].x=oprnum;
for(a=0;a<j;a++){
opra[oprnum4[a]].x=oprnum;
}
}
else {
errorline[errornum]=linenum;
error[errornum++]=17;
return 1;
}
return 0;
}
//scanf语句
int scanfstatement()
{
int a;
sym=getsym();
if(sym==37)
{
sym=getsym();
if(sym!=1)
{
errorline[errornum]=linenum;
error[errornum++]=27;
return 1;
}
a=find();
if(a==0)
{
errorline[errornum]=linenum;
error[errornum++]=20;
return 1;
}
if(Char[a].kind==0||Char[a].kind==3)
{
if(gen(6,Char[a].type,0))
return 1;
if(gen(22,Char[a].lev,Char[a].adr))
return 1;
}
if((sym=getsym())!=36)
{
errorline[errornum]=linenum;
error[errornum++]=18;
return 1;
}
if((sym=getsym())==38)
{
sym=getsym();
return 0;
}
else {
errorline[errornum]=linenum;
error[errornum++]=22;
return 1;
}
}
errorline[errornum]=linenum;
error[errornum++]=17;
return 0;
}
//printf语句
int printfstatement()
{
int i,oprnum1[MAXS],oprnum2,siss[MAXS];
int j=0;
int a=0;
if((sym=getsym())==37)
{
if((sym=getsym())==5)
{
for(i=0;i<strlen(sisstring);i++)
{
if(sisstring[i]=='\\')
{
if(sisstring[++i]=='n')
{
if(gen(8,5,0))
return 1;
}
else if(sisstring[i]=='t')
{
if(gen(8,6,0))
return 1;
}
else
{
errorline[errornum]=linenum;
error[errornum++]=21;
return 1;
}
}
else if(sisstring[i]!='%')
{
if(gen(1,11,sisstring[i]))
return 1;
if(gen(8,4,0))
return 1;
}
else
{
oprnum1[j]=oprnum;
if(gen(4,0,0))
return 1;
siss[j++]=sisstring[++i];
}
}
oprnum2=oprnum;
if(j){
if(gen(4,0,0))
return 1;
}
}
sym=getsym();
for(i=0;i<j;i++)
{
a=1;
if(sym!=39)
{
errorline[errornum]=linenum;
error[errornum++]=13;
return 1;
}
sym=getsym();
opra[oprnum1[i]].x=oprnum;
if(expression())
return 1;
if(siss[i]=='d')
{
if(gen(8,2,0))
return 1;
}
else if(siss[i]=='f')
{
if(gen(8,3,0))
return 1;
}
else if(siss[i]=='c')
{
if(gen(8,4,0))
return 1;
}
else
{
errorline[errornum]=linenum;
error[errornum++]=21;
return 1;
}
if(gen(4,0,oprnum1[i]+1))
return 1;
}
if(j)
opra[oprnum2].x=oprnum;;
if(sym==36)
{
if((sym=getsym())==38)
sym=getsym();
else{
errorline[errornum]=linenum;
error[errornum++]=22;
return 1;
}
}
else{
errorline[errornum]=linenum;
error[errornum++]=18;
return 1;
}
}
else{
errorline[errornum]=linenum;
error[errornum++]=17;
return 1;
}
return 0;
}
//return语句
int returnstatement()
{
if((sym=getsym())==37)
{
sym=getsym();
if(expression())
return 1;
if(gen(7,typeofexp1,0))
return 1;
if(sym==36)
{
if((sym=getsym())==38)
{
sym=getsym();
return 0;
}
else{
errorline[errornum]=linenum;
error[errornum++]=22;
return 1;
}
}
else{
errorline[errornum]=linenum;
error[errornum++]=18;
return 1;
}
}
if(sym==38)
{
if(gen(1,11,0))
return 1;
if(gen(7,11,0))
return 1;
sym=getsym();
return 0;
}
errorline[errornum]=linenum;
error[errornum++]=22;
return 1;
}
//main函数处理
int mainfunction()
{
Isret=1;
start=oprnum;
Isret=1;
strcpy(name[NumOfC],Word);
if(enter(lev,0,5))
return 1;
Char[NumOfC-1].adr=oprnum;
if((sym=getsym())!=37)
{
errorline[errornum]=linenum;
error[errornum++]=17;
return 1;
}
sym=getsym();
while(sym==11||sym==12)
{
int i=sym;
if((sym=getsym())==1)
{
strcpy(name[NumOfC],Word);
if(enter(lev+1,i,3))
return 1;
}
else
{
errorline[errornum]=linenum;
error[errornum++]=27;
return 1;
}
if((sym=getsym())!=39)
break;
sym=getsym();
if(sym!=11&&sym!=12)
{
errorline[errornum]=linenum;
error[errornum++]=4;
return 1;
}
}
if(sym==36)
{
if((sym=getsym())==40)
{
lev++;
sym=getsym();
if(sym==10)
{
sym=getsym();
if(constdeclaration())
return 1;
}
if(sym==11||sym==12)
{
int i=sym;
if((sym=getsym())==1)
{
strcpy(name[NumOfC],Word);
sym=getsym();
if(sym!=39&&sym!=38)
{
errorline[errornum]=linenum;
error[errornum++]=22;
return 1;
}
if(sym==39||sym==38)
if( vardefine(i))
return 1;
}
else{
errorline[errornum]=linenum;
error[errornum++]=27;
return 1;
}
}
if(gen(9,0,numoflev[lev]))
return 1;
if(statementArray())
return 1;
}
else
{
errorline[errornum]=linenum;
error[errornum++]=23;
return 1; }
if(sym==35)
{
backout();
lev--;
Isret=true;
return 0;
}
else
{
errorline[errornum]=linenum;
error[errornum++]=12;
return 1;
}
}
else
{
errorline[errornum]=linenum;
error[errornum++]=18;
return 1;
}
Isret=true;
return 0;
}
//从符号表中退出不用的符号
int backout()
{
int i;
for(i=NumOfC-1;i>=1;i--)
{
if(Char[i].kind==3)
break;
if(Char[i].kind==0||Char[i].kind==4)
NumOfC--;
numoflev[lev]=1;
}
return 0;
}
//产生一条表达式
int gen(int op,int lev,int x)
{
if(oprnum<MAXOP)
{
opra[oprnum].op=op;
opra[oprnum].lev=lev;
opra[oprnum].x=x;
oprnum++;
}
else
{
errorline[errornum]=linenum;
error[errornum++]=19;
return 1;
}
return 0;
}
//解释执行
int Interpret()
{
int i,j,a,equ=1;
char c;
bl[blnum++]=0;
go[gonum++]=0;
go[gonum++]=0;
for(i=1;i<MAXC;i++)
{
if(Char[i].kind==0)
gonum++;
if(Char[i].kind!=0&&Char[i].kind!=4)
break;
}
bl[blnum++]=gonum;
go[gonum++]=0;
go[gonum++]=0;
for(i=start;i<oprnum;i++)
{
if(blnum>=MAXGOLEV)
{
errorline[errornum]=linenum;
error[errornum++]=25;
return 1;
}
if(gonum>=MAXGO)
{
errorline[errornum]=linenum;
error[errornum++]=24;
return 1;
}
switch(opra[i].op){
case 0:
if(opra[i].lev==1)
{
go[gonum++]=go[bl[0]+opra[i].x];
}
else
go[gonum++]=go[bl[blnum-1]+opra[i].x];
break;
case 1:
go[gonum++]=opra[i].x;
break;
case 2:
if(equ)
i=opra[i].x-1;
break;
case 3:
if(!equ)
i=opra[i].x-1;
break;
case 4:
i=opra[i].x-1;
break;
case 5:
if(go[gonum-1]==go[gonum-2])
{
equ=1;
gonum-=2;
}
else
{
gonum-=1;
equ=0;
}
break;
case 6:
if(opra[i].lev==11)
{
scanf("%d",&j);
go[gonum++]=j;
}
else if(opra[i].lev==13)
{
scanf("%c",&c);
go[gonum++]=c;
}
break;
case 7:
if(opra[i].lev!=go[bl[blnum-1]+1])
{
errorline[errornum]=linenum;
error[errornum++]=26;
return 1;
}
i=go[bl[blnum-1]]-1;
go[bl[blnum-1]]=go[--gonum];
gonum=bl[--blnum]+1;
break;
case 8:
if(opra[i].lev==4)
printf("%c",go[--gonum]);
else if(opra[i].lev==5)
printf("\n");
else if(opra[i].lev==6)
printf("\t");
else printf("%d",go[--gonum]);
break;
case 9:
gonum=bl[blnum-1]+opra[i].x+1;
break;
case 10:
if(opra[i].lev==11)
{
go[gonum-2]=go[gonum-1]+go[gonum-2];
}
else
{
go[gonum-3]=go[gonum-3]+go[gonum-1];
gonum++;
}
gonum-=1;
break;
case 11:
go[gonum-2]=go[gonum-2]-go[gonum-1];
gonum-=1;
break;
case 13:
go[gonum-2]=go[gonum-2]*go[gonum-1];
gonum-=1;
break;
case 14:
go[gonum-2]=go[gonum-2]/go[gonum-1];
gonum-=1;
break;
case 15:
go[gonum-1]=-go[gonum-1];
break;
case 16:
if(go[gonum-2]>go[gonum-1])
equ=1;
else
equ=0;
if(opra[i].lev==11)
gonum-=2;
break;
case 17:
if(go[gonum-2]<go[gonum-1])
equ=1;
else
equ=0;
if(opra[i].lev==11)
gonum-=2;
break;
case 18:
if(go[gonum-2]==go[gonum-1])
equ=1;
else
equ=0;
if(opra[i].lev==11)
gonum-=2;
break;
case 19:
if(go[gonum-2]!=go[gonum-1])
equ=1;
else
equ=0;
if(opra[i].lev==11)
gonum-=2;
break;
case 20:
if(go[gonum-2]>=go[gonum-1])
equ=1;
else
equ=0;
if(opra[i].lev==11)
gonum-=2;
break;
case 21:
if(go[gonum-2]<=go[gonum-1])
equ=1;
else
equ=0;
if(opra[i].lev==11)
gonum-=2;
break;
case 22:
if(opra[i].lev==1)go[bl[0]+opra[i].x]=go[--gonum]
;
else
go[bl[blnum-1]+opra[i].x]=go[--gonum];
break;
case 23:
a=gonum;
go[gonum+1]=opra[i].lev;
gonum=gonum+2;
break;
case 24:
bl[blnum++]=a;
go[a]=i+1;
i=opra[i].x-1;
break;
case 25:i=go[bl[blnum-1]]-1;
gonum=bl[--blnum];
break;
}
}
return 0;
}
//主函数
void main(int argc,char *argv[])
{
int c=0;
printf("*******************************************\n");
printf("C0 compiler version 1.0\nwriten by XIA QING\n");
if(argc!=2){
printf("请输入编译源程序文件名:\n");
scanf("%s",fp);
}
else
strcpy(fp,argv[1]);
if(strchr(fp,'.')==NULL)
strcat(fp,".txt");
FIN=fopen(fp,"r");
if(FIN==NULL)
{
printf("file not found!\n");
exit(1);
}
//for test
// strcpy(fp,"test5.txt");
// FIN = fopen(fp,"r");
printf("\n源程序:\n");
FOUT=stdout;
for(int j=0;j<MAXLEV;j++)
numoflev[j]=1;
if(program()){
int i=errornum;
for(errornum=0;errornum<i;errornum++)
{
error_msg(error[errornum]);
}
return ;
}
printf("\n\n编译通过!\n\n");
printf("运行结果 :\n");
if(Interpret()){
return ;
}
printf("是否显示中间代码\t\t是:0\t否:1\n");
scanf("%d",&c);
if(!c)
{
printf("中间代码:\n");
int i;
for(i=0;i<oprnum;i++)
{
fprintf(FOUT,"%d\t%s\t%d\t%d\t%d\n",i,oprate[opra[i].op],
opra[i].op,opra[i].lev,opra[i].x);
}
}
return ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -