#include
#include
#include
int TESTparse();
int program();
int compound_Stat();
int statement();
int expression_Stat();
int expression();
int bool_expr();
int additive_expr();
int term();
int factor();
int if_stat();
int while_stat();
int for_stat();
int write_stat();
int read_stat();
int declaration_stat();
int statement_list();
int compound_stat();
char token[20],token1[40];/*token保存单词符号,token1保存单词值*/
extern char Scanout[300];/*保存词法分析输出文件名*/
FILE *fp;/*用于指向输入文件的指针*/
/*语法分析程序*/
int TESTparse()
{
int es=0;
if((fp=fopen(Scanout,"r"))==NULL)
{
printf("\n open%serror!\n",Scanout);
es=10;
}
printf("1\n");
if(es==0) es=program();
printf("=====yu fa fen xi jie guo!=====\n");/*语法分析结果*/
switch(es)
{
case 0:printf("ci fa fen xi cheng gong!\n");break;/*语法分析成功*/
case 10:printf("open text%serror!\n",Scanout);break;/*打开文件失败*/
case 1:printf("lack of{!\n");break;
case 2:printf("lack of}!\n");break;
case 3:printf("lack of biao shi fu!\n");break;/*标识符*/
case 4:printf("lack of;!\n");break;
case 5:printf("lack of(!\n");break;
case 6:printf("lack of)!\n");break;
case 7:printf("lack of cao zuo shu!\n");break;/*操作数*/
}
fclose(fp);
return(es);
}
/*::={}*/
/*program::={}*/
int program()
{
int es=0;
printf("2\n");
fscanf(fp,"%s%s\n",&token,&token1);
printf("3\n");
printf("%s%s\n",token,token1);
printf("4\n");
if(strcmp(token,"{"))/*判断是否为'{'*/
{
printf("5\n");
es=1;
return(es);
}
printf("6\n");
fscanf(fp,"%s%s\n",&token,&token1);
printf("7\n");
printf("%s%s\n",token,token1);
printf("8\n");
es=declaration_list();
if(es>0) return(es);
es=statement_list();
if(es>0) return(es);
if(strcmp(token,"}")!=0)/*判断是否为'}'*/
{
es=2;
return(es);
}
return(es);
}
/*::=|*/
/*::=|*/
/*该成::={}*/
int declaration_list()
{
int es=0;
while(strcmp(token,"int")==0)
{
es=declaration_stat();
if(es>0) return(es);
}
return(es);
}
/*::=int;*/
/*::=int ID;*/
int declaration_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"ID")) return(es=3);/*不是标识符*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,";")) return(es=4);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
/*::=|*/
/*::=|*/
/*改成::={}*/
int statement_list()
{
int es=0;
while(strcmp(token,"}"))
{
es=statement();
if(es>0) return(es);
}
return(es);
}
/*::=||||||*/
/*::=||||*/
int statement()
{
int es=0;
if(es==0&&strcmp(token,"if")==0) es=if_stat();/**/
if(es==0&&strcmp(token,"while")==0) es=while_stat();/**/
if(es==0&&strcmp(token,"for")==0) es=for_stat();/**/
/*可在此处添加do语句调用*/
if(es==0&&strcmp(token,"read")==0) es=read_stat();/**/
if(es==0&&strcmp(token,"write")==0) es=write_stat();/**/
if(es==0&&strcmp(token,"{")==0) es=compound_stat();/**/
if(es==0&&strcmp(token,"ID")==0||strcmp(token,"NUM")==0) es=expression_stat();/**/
return(es);
}
/*::=if()[else]*/
/*::=if()[else]*/
int if_stat()
{
int es=0;/*if*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"(")) return(es=5);/*少左括号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,")")) return(es=6);/*少右括号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement();
if(es>0) return(es);
if(strcmp(token,"else")==0)/*else处理部分*/
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement();
if(es>0) return(es);
}
return(es);
}
/*::=while()*/
/*::=while()*/
int while_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"(")) return(es=5);/*少左括号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,")")) return(es=6);/*少右括号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement();
return(es);
}
/*::=for(;;)*/
/*::=for(;;)*/
int for_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"(")) return(es=5);/*少左括号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,";")) return(es=4);/*少分号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,")")) return(es=6);/*少右括号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement();
if(es>0) return(es);
}
/*::=write*/
/*::=write*/
int write_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,";")) return(es=4);/*少分号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
/*::=read*/
/*::=read ID*/
int read_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"ID")) return(es=3);/*少标识符*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,";")) return(es=4);/*少分号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
/*::={}*/
/*::={}*/
int compound_stat()/*复合语句函数*/
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement_list();
return(es);
}
/*::=;|;*/
/*::=;|;*/
int expression_stat()
{
int es=0;
if(strcmp(token,";")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
es=expression();
if(es>0) return(es);
if(es==0&&strcmp(token,";")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
else
{
es=4;
return(es);
}
}
/*::==|*/
/*::=ID=|*/
int expression()
{
int es=0,fileadd;
char token2[20],token3[40];
if(strcmp(token,"ID")==0)
{
fileadd=ftell(fp);/*记住当前文件位置*/
fscanf(fp,"%s%s\n",&token2,&token3);
printf("%s%s\n",token2,token3);
es=bool_expr();
if(es>0) return(es);
if(strcmp(token2,"=")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
}
else
{
fseek(fp,fileadd,0);/*若非'='则文件指针回到'='前的标识符*/
printf("%s%s\n",token,token1);
es=bool_expr();
if(es>0) return(es);
}
}
return(es);
}
/*::=|(>|=|<=|==|!=)*/
/*::=|(>|=|<=|==|!=)*/
int bool_expr()
{
int es=0;
es=additive_expr();
if(es>0) return(es);
if(strcmp(token,">")==0||strcmp(token,">=")==0||strcmp(token," {
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=additive_expr();
if(es>0) return(es);
}
return(es);
}
/*::={(+|-)}*/
/*::={(+|-)}*/
int additive_expr()
{
int es=0;
es=term();
if(es>0) return(es);
while(strcmp(token,"+")==0||strcmp(token,"-")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=term();
if(es>0) return(es);
}
return(es);
}
/*::={(*|/)}*/
/*::={(*|/)}*/
int term()
{
int es=0;
es=factor();
if(es>0) return(es);
while(strcmp(token,"*")==0||strcmp(token,"/")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=factor();
if(es>0) return(es);
}
return(es);
}
/*::=()||*/
/*::=()|ID|NUM*/
int factor()
{
int es=0;
if(strcmp(token,"(")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,")")) return(es=6);/*少右括号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
}
else
{
if(strcmp(token,"ID")==0||strcmp(token,"NUM")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
else
{
es=7;
return(es);/*缺少操作数*/
}
}
return(es);
}
#include
#include
int TESTparse();
int program();
int compound_Stat();
int statement();
int expression_Stat();
int expression();
int bool_expr();
int additive_expr();
int term();
int factor();
int if_stat();
int while_stat();
int for_stat();
int write_stat();
int read_stat();
int declaration_stat();
int statement_list();
int compound_stat();
char token[20],token1[40];/*token保存单词符号,token1保存单词值*/
extern char Scanout[300];/*保存词法分析输出文件名*/
FILE *fp;/*用于指向输入文件的指针*/
/*语法分析程序*/
int TESTparse()
{
int es=0;
if((fp=fopen(Scanout,"r"))==NULL)
{
printf("\n open%serror!\n",Scanout);
es=10;
}
printf("1\n");
if(es==0) es=program();
printf("=====yu fa fen xi jie guo!=====\n");/*语法分析结果*/
switch(es)
{
case 0:printf("ci fa fen xi cheng gong!\n");break;/*语法分析成功*/
case 10:printf("open text%serror!\n",Scanout);break;/*打开文件失败*/
case 1:printf("lack of{!\n");break;
case 2:printf("lack of}!\n");break;
case 3:printf("lack of biao shi fu!\n");break;/*标识符*/
case 4:printf("lack of;!\n");break;
case 5:printf("lack of(!\n");break;
case 6:printf("lack of)!\n");break;
case 7:printf("lack of cao zuo shu!\n");break;/*操作数*/
}
fclose(fp);
return(es);
}
/*::={}*/
/*program::={}*/
int program()
{
int es=0;
printf("2\n");
fscanf(fp,"%s%s\n",&token,&token1);
printf("3\n");
printf("%s%s\n",token,token1);
printf("4\n");
if(strcmp(token,"{"))/*判断是否为'{'*/
{
printf("5\n");
es=1;
return(es);
}
printf("6\n");
fscanf(fp,"%s%s\n",&token,&token1);
printf("7\n");
printf("%s%s\n",token,token1);
printf("8\n");
es=declaration_list();
if(es>0) return(es);
es=statement_list();
if(es>0) return(es);
if(strcmp(token,"}")!=0)/*判断是否为'}'*/
{
es=2;
return(es);
}
return(es);
}
/*::=|*/
/*::=|*/
/*该成::={}*/
int declaration_list()
{
int es=0;
while(strcmp(token,"int")==0)
{
es=declaration_stat();
if(es>0) return(es);
}
return(es);
}
/*::=int;*/
/*::=int ID;*/
int declaration_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"ID")) return(es=3);/*不是标识符*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,";")) return(es=4);
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
/*::=|*/
/*::=|*/
/*改成::={}*/
int statement_list()
{
int es=0;
while(strcmp(token,"}"))
{
es=statement();
if(es>0) return(es);
}
return(es);
}
/*::=||||||*/
/*::=||||*/
int statement()
{
int es=0;
if(es==0&&strcmp(token,"if")==0) es=if_stat();/**/
if(es==0&&strcmp(token,"while")==0) es=while_stat();/**/
if(es==0&&strcmp(token,"for")==0) es=for_stat();/**/
/*可在此处添加do语句调用*/
if(es==0&&strcmp(token,"read")==0) es=read_stat();/**/
if(es==0&&strcmp(token,"write")==0) es=write_stat();/**/
if(es==0&&strcmp(token,"{")==0) es=compound_stat();/**/
if(es==0&&strcmp(token,"ID")==0||strcmp(token,"NUM")==0) es=expression_stat();/**/
return(es);
}
/*::=if()[else]*/
/*::=if()[else]*/
int if_stat()
{
int es=0;/*if*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"(")) return(es=5);/*少左括号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,")")) return(es=6);/*少右括号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement();
if(es>0) return(es);
if(strcmp(token,"else")==0)/*else处理部分*/
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement();
if(es>0) return(es);
}
return(es);
}
/*::=while()*/
/*::=while()*/
int while_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"(")) return(es=5);/*少左括号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,")")) return(es=6);/*少右括号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement();
return(es);
}
/*::=for(;;)*/
/*::=for(;;)*/
int for_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"(")) return(es=5);/*少左括号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,";")) return(es=4);/*少分号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,")")) return(es=6);/*少右括号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement();
if(es>0) return(es);
}
/*::=write*/
/*::=write*/
int write_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,";")) return(es=4);/*少分号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
/*::=read*/
/*::=read ID*/
int read_stat()
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,"ID")) return(es=3);/*少标识符*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
if(strcmp(token,";")) return(es=4);/*少分号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
/*::={}*/
/*::={}*/
int compound_stat()/*复合语句函数*/
{
int es=0;
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=statement_list();
return(es);
}
/*::=;|;*/
/*::=;|;*/
int expression_stat()
{
int es=0;
if(strcmp(token,";")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
es=expression();
if(es>0) return(es);
if(es==0&&strcmp(token,";")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
else
{
es=4;
return(es);
}
}
/*::==|*/
/*::=ID=|*/
int expression()
{
int es=0,fileadd;
char token2[20],token3[40];
if(strcmp(token,"ID")==0)
{
fileadd=ftell(fp);/*记住当前文件位置*/
fscanf(fp,"%s%s\n",&token2,&token3);
printf("%s%s\n",token2,token3);
es=bool_expr();
if(es>0) return(es);
if(strcmp(token2,"=")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
}
else
{
fseek(fp,fileadd,0);/*若非'='则文件指针回到'='前的标识符*/
printf("%s%s\n",token,token1);
es=bool_expr();
if(es>0) return(es);
}
}
return(es);
}
/*::=|(>|=|<=|==|!=)*/
/*::=|(>|=|<=|==|!=)*/
int bool_expr()
{
int es=0;
es=additive_expr();
if(es>0) return(es);
if(strcmp(token,">")==0||strcmp(token,">=")==0||strcmp(token," {
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=additive_expr();
if(es>0) return(es);
}
return(es);
}
/*::={(+|-)}*/
/*::={(+|-)}*/
int additive_expr()
{
int es=0;
es=term();
if(es>0) return(es);
while(strcmp(token,"+")==0||strcmp(token,"-")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=term();
if(es>0) return(es);
}
return(es);
}
/*::={(*|/)}*/
/*::={(*|/)}*/
int term()
{
int es=0;
es=factor();
if(es>0) return(es);
while(strcmp(token,"*")==0||strcmp(token,"/")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=factor();
if(es>0) return(es);
}
return(es);
}
/*::=()||*/
/*::=()|ID|NUM*/
int factor()
{
int es=0;
if(strcmp(token,"(")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
es=expression();
if(es>0) return(es);
if(strcmp(token,")")) return(es=6);/*少右括号*/
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
}
else
{
if(strcmp(token,"ID")==0||strcmp(token,"NUM")==0)
{
fscanf(fp,"%s%s\n",&token,&token1);
printf("%s%s\n",token,token1);
return(es);
}
else
{
es=7;
return(es);/*缺少操作数*/
}
}
return(es);
}
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12993749/viewspace-353260/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/12993749/viewspace-353260/