📄 c0compiler.cpp
字号:
Char[NumOfC].uchar.cischar =cischar;
}
NumOfC++;
}
else
{
errorline[errornum]=linenum;
error[errornum++]=7;
return 1;
}
return 0;
}
//检查参数
int charcheck()
{
int i;
for(i=NumOfC-1;i>=0;i--)
{
if(Char[i].lev<lev)
return 0;
else
{
if(!strcmp(Char[i].name,name[NumOfC]))
return 1;
}
}
return 0;
}
//在符号表中查找标识符是否存在
int find()
{
int i,j=1;
for(i=NumOfC-1;i>=1;i--)
{
if(Char[i].lev<lev)
j=0;
if(Char[i].kind!=3||j)
if(!strcmp(Char[i].name,Word))
return i;
}
return 0;
}
//语句列
int statementArray()
{
int a=0;
while(sym==1||sym==15||sym==18||
sym==40||sym==19||sym==20||sym==21)
{
if((a=statement())==1)
return 1;
}
if(sym==38)
sym=getsym();
return 0;
}
//语句
int statement()
{
int a;
switch(sym){
case 15:
return(ifstatement());
case 18:
return(whilestatement());
case 19:
return(scanfstatement());
case 20:
return(printfstatement());
case 21:
if(Isret)
{
errorline[errornum]=linenum;
error[errornum++]=14;
return 1;
}
return(returnstatement());
case 1:
if((a=find())==0)
return 1;
sym=getsym();
if(Char[a].kind==0||Char[a].kind==3)
{
if(sym==51)
return(assignstatement(a));
else
{
errorline[errornum]=linenum;
error[errornum++]=9;
return 1;
}
}
else if(Char[a].kind==1||Char[a].kind==2)
{
if(sym==37)
{
if(call(a))
return 1;
if(sym==38)
sym=getsym();
else
{
errorline[errornum]=linenum;
error[errornum++]=22;
return 1;
}
return 0;
}
else
{
errorline[errornum]=linenum;
error[errornum++]=17;
return 1;
}
}
else
{
errorline[errornum]=linenum;
error[errornum++]=10;
return 1;
}
case 40:
sym=getsym();
if((a=statementArray())==1)
return 1;
if(sym!=35)
{
errorline[errornum]=linenum;
error[errornum++]=12;
return 1;
}
sym=getsym();
return a;
case 38:
sym=getsym();
return 1;
default:
return 1;
}
return 1;
}
//表达式
int expression()
{
bool anti=false;
if(sym==31||sym==32)//带有符号+、-
{
if(sym==32)
{
anti=true;//为负数
}
sym=getsym();
}
if(term())
{
return 1;
}
if(anti)
{
if(gen(15,typeofexp1,0))
{
return 1;
}
}
while(sym==31||sym==32)
{
typeofexp2=typeofexp1;
int a=sym;
sym=getsym();
if(term())
return 1;
if(gen(a-21,typeofexp2,typeofexp1))
return 1;
if(typeofexp2>typeofexp1)
typeofexp1=typeofexp2;
}
return 0;
}
//项
int term()
{
if(factor())
return 1;
while(sym==33||sym==34)//×或÷
{
typeofexp2=typeofexp1;
int a=sym;
sym=getsym();
if(factor())
return 1;
if(gen(a-20,typeofexp2,typeofexp1))//??????????
return 1;
if(typeofexp2>typeofexp1)
typeofexp1=typeofexp2;
}
return 0;
}
//因子
int factor()
{
typeofexp1=11;//int
if(sym==1)
{
int a=find();
if(a==0)
{
errorline[errornum]=linenum;
error[errornum++]=20;
return 1;
}
if(Char[a].kind==4)//字符
{
if(Char[a].type==11)
if(gen(1,Char[a].type,Char[a].uchar.num ))
return 1;
if(Char[a].type==12)
if(gen(1,Char[a].type-2,Char[a].uchar.cischar))//?????????
return 1;
sym=getsym();
}
else if(Char[a].kind==0||Char[a].kind==3)
{
if(gen(0,Char[a].lev,Char[a].adr))
return 1;
if(Char[a].type==12)
typeofexp1=11;
else
typeofexp1=Char[a].type;
sym=getsym();
}
else if(Char[a].kind==2)
{
if((sym=getsym())==37)//(
{
if(call(a))
return 1;
}
else
{
errorline[errornum]=linenum;
error[errornum++]=17;
return 1;
}
}
else
{
errorline[errornum]=linenum;
error[errornum++]=11;
return 1;
}
return 0;
}
else if(sym==37)//(
{
sym=getsym();
if(expression())
return 1;
if(sym!=36)//)
{
errorline[errornum]=linenum;
error[errornum++]=18;
return 1;
}
else
sym=getsym();
return 0;
}
else if(sym==2)
{
if(gen(1,11,num))
return 1;
sym=getsym();
return 0;
}
else if(sym==4)
{
if(gen(1,11,cischar))
return 1;
sym=getsym();
return 0;
}
else
{
errorline[errornum]=linenum;
error[errornum++]=6;
return 1;
}
return 0;
}
//子函数调用
int call(int a)
{
int i;
if(gen(23,Char[a].type,0))
return 1;
sym=getsym();
for(i=a+1;i<MAXC;i++)
{
if(Char[i].kind!=3)
break;
if(expression())
return 1;
if(sym==39)//,
sym=getsym();
else
break;
}
if(Char[i].kind!=3&&sym!=36||Char[i+1].kind==3&&sym==36)//)
{
errorline[errornum]=linenum;
error[errornum++]=16;
return 1;
}
if(gen(24,0,Char[a].adr))//?????????????????????????
return 1;
if(sym==36)
{
sym=getsym();
return 0;
}
else
{
errorline[errornum]=linenum;
error[errornum++]=18;
return 1;
}
return 0;
}
//有返回值的函数
int returnfunction( int type)
{
Isret=0;
if(enter(lev,type,2))
return 1;
Char[NumOfC-1].adr=oprnum;
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!=38&&sym!=39)
{
errorline[errornum]=linenum;
error[errornum++]=22;
return 1;
}
if(sym==38||sym==39)
{
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)
{
sym=getsym();
backout();
lev--;
if(gen(7,0,0))return 1;
return 0;
}
else
{
errorline[errornum]=linenum;
error[errornum++]=12;
return 1;
}
}
else
{
errorline[errornum]=linenum;
error[errornum++]=18;
return 1;
}
}
//无返回值的函数定义语句
int voidfunction()
{
Isret=1;
strcpy(name[NumOfC],Word);
if(enter(lev,0,1))
return 1;
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!=38&&sym!=39)
{
errorline[errornum]=linenum;
error[errornum++]=22;
return 1;
}
if(sym==38||sym==39)
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--;
if((sym=getsym())==13)
if((sym=getsym())==1)
return(voidfunction());
if(gen(25,0,0))
return 1;
return 0;
}
else
{
errorline[errornum]=linenum;
error[errornum++]=12;
return 1;
}
}
else
{
errorline[errornum]=linenum;
error[errornum++]=18;
return 1;
}
return 0;
}
//赋值语句
int assignstatement(int a)
{
sym=getsym();
if(expression())
return 1;
if(typeofexp1!=Char[a].type)//类型不匹配
{
errorline[errornum]=linenum;
error[errornum++]=28;
return 1;
}
if(gen(22,Char[a].lev,Char[a].adr))
return 1;
if(sym!=38)//缺少;
{
errorline[errornum]=linenum;
error[errornum++]=22;
return 1;
}
sym=getsym();
return 0;
}
//if条件语句
int ifstatement()
{
int oprnum1,oprnum2,a;
if((sym=getsym())==37)
{
sym=getsym();
if(expression())
return 1;
a=typeofexp1;
if(sym==45||sym==46||sym==47||sym==48||sym==49||sym==50)
{
int b=sym;
sym=getsym();
if(expression())
return 1;
if(gen(b-29,a,typeofexp1))
return 1;
}
oprnum1=oprnum;
if(gen(3,0,0))
return 1;
if(sym!=36)
{
errorline[errornum]=linenum;
error[errornum++]=18;
return 1;
}
sym=getsym();
if(statement()==1)
return 1;
if(sym==16)
{
oprnum2=oprnum;
if(gen(4,0,0))
return 1;
opra[oprnum1].x=oprnum;
sym=getsym();
if(statement()==1)
return 1;
opra[oprnum2].x=oprnum;
}
else opra[oprnum1].x=oprnum;
}
else{
errorline[errornum]=linenum;
error[errornum++]=17;
return 1;
}
return 0;
}
//while循环语句
int whilestatement()
{
int oprnum1=oprnum,oprnum2,oprnum4[MAXCASE],a,j=0;
if((sym=getsym())==37)
{
sym=getsym();
if(expression())
return 1;
a=typeofexp1;
if(sym==45||sym==46||sym==47||sym==48||sym==49||sym==50)
{
int b=sym;
sym=getsym();
if(expression())
return 1;
if(gen(b-29,a,typeofexp1))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -