📄 grammer.c
字号:
#include "world.h"
void valdeclear();
char * situation();//条件
void program();
void const_declare();//常量说明
void parameter();//参数表
void function_entry();
void function_def();
int funNum = 0;
struct funcRegist funTable[MAXFUN];
int tableTop[MAXFUN];
void val_declear();
void const_def();//常量定义
void main_function();
void tokenget();
void init() //初始化符号表
{
memset(tableTop,0,sizeof(tableTop));
}
void spar()
{
int i,j;
char filename[100];
init();
printf("输入源文件名:\n");
scanf("%s",filename);
if(freopen(filename,"r",stdin)==NULL)
{
printf("无法打开!\n\n\n");
exit(0);
}
program(); //分析程序
for( i=1;i<=funNum;i++)
{
for(j=0;j<funTable[i].paranum;j++)
{
}
for(j=0;j<tableTop[i];j++)
{
}
}
}
void function_entry() //进入函数体
{
if(seehead==LB)
{
tokenget(0);
const_declare();
val_declear();
sentence_list();//语句序列
}
else
{
existerror("sentence existerror!",lineno);
while(seehead!=RB)
{
tokenget(0);
}
}
// printf("%d",seehead);
if(seehead==RB)
{
tokenget(0);
}
else
{
existerror("syntex existerror!",lineno);
}
}
int lookup_function(char *fname) //向前找
{
int i;
for(i=1;i<=funNum;i++)
{
if(strcmp(strlwr(funTable[i].fname),strlwr(fname))==0)
return i;
}
return -1;
}
void program()//分析程序
{
char temp[BSIZE];
int tag=1;
seehead = Word(); //读入一个词
const_declare();
if(seehead==INT)
{
tokenget(0);
strcpy(temp,buffer);
if(seehead==ID)
{
tokenget(0);
}
else
{
existerror("Token existerror!",lineno);
}
if(seehead==LK)
{
funNum++;
funTable[funNum].returnKind = INT;
strcpy(funTable[funNum].fname,temp);
nodeadd(nodegenerate("Begin",funTable[funNum].fname,"","")); //函数开始
tokenget(0);
parameter(); //参数表
if(seehead==RK)
{
tokenget(0);
}
else
{
existerror("funcRegist define existerror!",lineno);
tokenget(0);
}
function_entry();
nodeadd(nodegenerate("End",funTable[funNum].fname,"",""));
}
else if(seehead==douhao)
{
if(lookforward(temp,funNum) == -1)
{
writetable(temp,VAR,0,funNum); //变量定义
nodeadd(nodegenerate("VarDefine",temp,"",""));
}
else
{
existerror("variable define existerror!",lineno);
}
while(seehead==douhao)
{
tokenget(0);
strcpy(temp,buffer);
if(seehead==ID)
{
if(lookforward(temp,funNum)==-1)
{
writetable(temp,VAR,0,funNum);
nodeadd(nodegenerate("VarDefine",temp,"",""));
}
else
{
existerror("variable define existerror!",lineno);
}
tokenget(0);
}
else
{
existerror("variable define existerror!",lineno);
}
}
if(seehead==fenghao)
{
tokenget(0);
}
else
{
existerror("variable declaration existerror!",lineno);
}
}
else if(seehead==fenghao)
{
if(lookforward(temp,funNum) == -1)
{
writetable(temp,VAR,0,funNum);
nodeadd(nodegenerate("VarDefine",temp,"",""));
}
else
{
existerror("variable define existerror!",lineno);
}
tokenget(0);
}
else
{
existerror("variable declaration existerror!",lineno);
}
}
while((seehead==INT||seehead==VOID)||tag!=0)
{
funNum++;
tag = funcRegist();
}
if(seehead==OVER)
{
tokenget(0);
}
else
{
tokenget(0);
existerror("existerror at the end the file!",lineno);
}
}
int funcRegist() //函数定义,检查reture
{
int tag=1; //函数定义标记
char temp[BSIZE];
returntag = false;
if(seehead==VOID)
{
funTable[funNum].returnKind = VOID;
tokenget(0);
strcpy(temp,buffer);
if(strcmp(temp,"main")==0)
{
tokenget(MAIN);
tag = 0;
}
else
{
if(seehead==ID)
{
tokenget(0);
}
else
{
existerror("funcRegist name existerror!",lineno);
}
}
}
else
{
funTable[funNum].returnKind = INT;
tokenget(0);
strcpy(temp,buffer);
if(seehead==ID)
{
tokenget(0);
}
else
{
existerror("funcRegist name existerror!",lineno);
}
}
strcpy(funTable[funNum].fname,temp);
nodeadd(nodegenerate("Begin",temp,"",""));
if(seehead==LK)
{
tokenget(0);
}
else
{
existerror("funcRegist define existerror!",lineno);
}
parameter(); //参数表
if(seehead==RK)
{
tokenget(0);
}
else
{
existerror("funcRegist define existerror!",lineno);
tokenget(0);
}
function_entry();
if((funTable[funNum].returnKind == INT&&returntag==false))
{
existerror("funcRegist existerror value wrong!",lineno);
}
nodeadd(nodegenerate("End",temp,"",""));
return tag;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -