📄 sentnc.c
字号:
#include "world.h"
void sentenceread();
void sentence(); //语句
void if_sentence();
void write_sentence();
void sentcsloop();
void return_sentence();
int pflag = 0; //标记临时变量
void sentence_list();//语句列
char *flagnew()//产生跳转标记
{
char * temp =(char *)malloc(BSIZE);
sprintf(temp,"L%d",pflag++);
return temp;
}
void return_sentence()
{
char temp[BSIZE];
if(seehead==RETURN)
{
//printf("return ");
tokenget(0);
if(seehead==LK)
{
tokenget(0);
strcpy(temp,expr());
nodeadd(nodegenerate("Return",temp,"",""));
if(seehead==RK)
{
tokenget(0);
}
else
{
existerror("return statement formation existerror",lineno);
}
}
returntag =true;
}
else
{
existerror("return statement existerror",lineno);
}
}
char * situation() //产生判断
{
int temp;
char tempstr1[BSIZE],tempstr2[BSIZE];
char *con = (char *)malloc(BSIZE);
strcpy(tempstr1,expr());//表达式
if(15<=seehead&&seehead<=20)
{
temp = seehead;
tokenget(0);
strcpy(tempstr2,expr());
strcpy(con,newtemp());
nodeadd(nodegenerate(op(temp),tempstr1,tempstr2,con));
}
else
{
strcpy(con,tempstr1);
}
// printf("%s\n",con);
return con;
}
void sentcsloop()
{
char loopbegin[BSIZE],truego[BSIZE],falsego[BSIZE];
char tempres[BSIZE];
if(seehead==WHILE)
{
tokenget(0);
if(seehead==LK)
{
tokenget(0);
}
else
{
existerror("while statement formation existerror!",lineno);
tokenget(0);
}
strcpy(loopbegin,flagnew());
nodeadd(nodegenerate("Flag",loopbegin,"",""));
strcpy(tempres,situation());
strcpy(truego,flagnew());
strcpy(falsego,flagnew());
nodeadd(nodegenerate("Falsego",tempres,"",falsego));
if(seehead==RK)
{
tokenget(0);
}
else
{
existerror("while statement formation existerror!",lineno);
tokenget(0);
}
//printf("%s:\n",truego);
// nodeadd(nodegenerate(truego,"","",""));
sentence();
nodeadd(nodegenerate("Goto",loopbegin,"",""));
nodeadd(nodegenerate("Flag",falsego,"",""));
}
else
{
existerror("WHILE statement existerror",lineno);
}
}
void sentenceread()
{
if(seehead==SCANF)
{
tokenget(0);
if(seehead==LK)
{
tokenget(0);
}
else
{
existerror("scanf statement existerror",lineno);
tokenget(0);
}
nodeadd(nodegenerate("Read",buffer,"",""));
if(seehead==ID)
{
tokenget(0);
}
else
{
if(seehead==RK)
{
existerror("scanf should have some parameters",lineno);
}
else
{
existerror("scanf statement existerror",lineno);
while(seehead!=RK)
{
tokenget(0);
}
}
}
tokenget(0);
}
else
{
existerror("scanf existerror!",lineno);
}
}
void getsentc()
{
int b=0;
int ch = getchar();
while(ch!='"')
{
buffer[b++]=ch;
ch = getchar();
}
buffer[b++] = '\0';
}
void sentence()
{
int tempnum,i;
if(seehead==IF)
{
if_sentence();
}
else if(seehead==WHILE)
{
sentcsloop();
}
else if(seehead==LB) //左大括号
{
tokenget(0);
sentence_list();
if(seehead==RB)
{
tokenget(0);
}
else
{
existerror("probably missing '}'",lineno);
tokenget(0);
}
}
else if (seehead==fenghao) //处理空分号
{
tokenget(0);
}
else if(seehead==SCANF)
{
sentenceread();
if(seehead==fenghao)
{
tokenget(0);
}
else
{
existerror("probably missing';'",lineno);
tokenget(0);
}
}
else if(seehead==PRINTF)
{
write_sentence();
if(seehead==fenghao)
{
tokenget(0);
}
else
{
existerror("probably missing';'",lineno);
tokenget(0);
}
}
else if(seehead==RETURN)
{
return_sentence();
if(seehead==fenghao)
{
tokenget(0);
}
else
{
existerror("probably missing';'",lineno);
tokenget(0);
}
}
else if(seehead==ID)
{
strcpy(temp,buffer);
tokenget(0);//检验函数是否存在定义
if(seehead==EQ)
{
tokenget(1);
if(seehead==plus)
tokenget(0);
else if(seehead==minus)
{
sign=-1;
tokenget(0);
}
strcpy(tempres,expr());//表达式
nodeadd(nodegenerate("=",tempres,"",temp));
sign=1;
if(seehead==fenghao)
{
tokenget(0);
}
else
{
existerror("probably missing';'",lineno);
tokenget(0);
}
}
else if(seehead==LK)
{
tokenget(0);
if((tempnum=lookup_function(temp))!=-1)
{
i = 0;
if(seehead!=RK)
{
strcpy(tempstr,expr());
nodeadd(nodegenerate("value=",tempstr,"",funTable[tempnum].paraname[i++]));
while(seehead!=RK)
{
tokenget(0);
strcpy(tempstr,expr());
if(i < funTable[tempnum].paranum)
{
nodeadd(nodegenerate("value=",tempstr,"",funTable[tempnum].paraname[i++]));
}
else
{
i++;
}
}
}
if(seehead==RK)
{
tokenget(0);
if(i==funTable[tempnum].paranum)
{
nodeadd(nodegenerate("Call",temp,"",""));
}
else
{
existerror("calling funcRegist existerror",lineno);
}
}
else
{
existerror("calling funcRegist existerror",lineno);
}
}
else
{
while(seehead!=fenghao)
{
tokenget(0);
}
existerror("funcRegist undefined!",lineno);
}
if(seehead==fenghao)
{
tokenget(0);
}
else
{
existerror("probably missing';'",lineno);
}
}
else
{
existerror("existerror!",lineno);
}
}
}
void sentence_list()
{
while(seehead!=RB)
{
sentence();
}
}
void if_sentence()
{
char tempstr[BSIZE];
char truego[BSIZE],falsego[BSIZE];
if(seehead==IF)
{
tokenget(0);
if(seehead==LK)
{
tokenget(0);
}
else
{
existerror("if statement formation existerror!",lineno);
tokenget(0);
}
strcpy(tempstr,situation());
strcpy(truego,flagnew());
strcpy(falsego,flagnew());
nodeadd(nodegenerate("GotoFalse",tempstr,"",falsego));
if(seehead==RK)
{
tokenget(0);
}
else
{
existerror("if statement formation existerror!",lineno);
tokenget(0);
}
sentence();
nodeadd(nodegenerate("Goto",truego,"",""));
nodeadd(nodegenerate("Flag",falsego,"",""));
if(seehead==ELSE)
{
//printf("else 语句");
tokenget(0);
sentence();
}
nodeadd(nodegenerate("Flag",truego,"",""));
}
else
{
existerror("IF statement existerror",lineno);
}
}
void write_sentence()
{
char temp[128];
if(seehead==PRINTF)
{
tokenget(0);
if(seehead==LK)
{
tokenget(0);
}
else
{
existerror("printf statement existerror",lineno);
tokenget(0);
}
if(seehead==maohao)
{
getsentc();//获取字符串
nodeadd(nodegenerate("Writestring",buffer,"",""));
strcpy(print_buf[print_num],buffer);
print_num++;
tokenget(0);
}
else
{
strcpy(temp,expr());
nodeadd(nodegenerate("Writenumber",temp,"",""));
}
if(seehead==douhao)
{
tokenget(0);
strcpy(temp,expr());
nodeadd(nodegenerate("Writenumber",temp,"",""));
}
if(seehead==RK)
{
tokenget(0);
}
else
{
existerror("printf statement existerror",lineno);
tokenget(0);
}
}
else
{
existerror("printf existerror",lineno);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -