parse.c

#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);
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12993749/viewspace-353260/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12993749/viewspace-353260/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值