算术表达式语法分析

/*****************************************************************程序功能:* 用递归下降子程序法判断算术表达式的语法是否正确*作者:* 张帅 东北大学2013级计算机学院*用时:* 8h*完成日期:* 2015.12.24 20:40:06*算术表达式文法:* E->T E1* E1->w0 T E1|ε* T->F T1* T1->w1 F T1|ε* F->I|(E)*其中:* w0:+ -* w1:* /*程序说明:* 输入算术表达式(以'#'结尾)如:x*(high+low)/(y-3)#* 输出"语法分析完成,符合算术表达式文法^_^"* 输入有错则输出相应错误提示。*****************************************************************/#include #include#include//函数声明void recursion();void E();void E1();void T();void T1();void F();int ISw0();int ISw1();int ISI();char *getword();char w[36];char ch;//主程序void recursion(){ ch=' '; printf("请输入表达式:\n"); strcpy(w,getword()); E(); if(strcmp(w,"#")==0) { printf("语法分析完成,符合算术表达式文法^_^\n"); } else { printf("错误! (←_←)\n"); exit(1); }}void E(){ T(); E1();}void E1(){ if(ISw0()) { strcpy(w,getword()); T(); E1(); } else return;}void T(){ F(); T1();}void T1(){ if(ISw1()) { strcpy(w,getword()); F(); T1(); } else return;}void F(){ if(ISI()) { strcpy(w,getword()); } else if(strcmp(w,"(")==0) { strcpy(w,getword()); E(); if(strcmp(w,")")==0) { strcpy(w,getword()); } else { printf("错误,少写了')' (←_←)\n"); exit(1); } } else { printf("错误! (←_←)\n"); exit(1); }}//判断是否为+或—int ISw0(){ if(strcmp(w,"+")==0||strcmp(w,"-")==0) return 1; else return 0;}//判断是否为*或/int ISw1(){ if(strcmp(w,"*")==0||strcmp(w,"/")==0) return 1; else return 0;}//判断是否为变量或常数int ISI(){ if(strcmp(w,"+")!=0&&strcmp(w,"-")!=0&&strcmp(w,"*")!=0&&strcmp(w,"/")!=0&&strcmp(w,"#")!=0&&strcmp(w,"(")!=0&&strcmp(w,")")!=0) return 1; else return 0;}//读取一个单词char *getword(){ int m; char bw[30]; m=0; while(ch==' ') { ch=getchar(); } switch(ch) { case '+':bw[m++]='+';bw[m]='\0';ch=getchar();break; case '-':bw[m++]='-';bw[m]='\0';ch=getchar();break; case '*':bw[m++]='*';bw[m]='\0';ch=getchar();break; case '/':bw[m++]='/';bw[m]='\0';ch=getchar();break; case '#':bw[m++]='#';bw[m]='\0';ch=getchar();break; case '(':bw[m++]='(';bw[m]='\0';ch=getchar();break; case ')':bw[m++]=')';bw[m]='\0';ch=getchar();break; default: while(ch!='+'&&ch!='-'&&ch!='*'&&ch!='/'&&ch!='#'&&ch!='('&&ch!=')'&&ch!=' ') { bw[m++]=ch; ch=getchar(); } bw[m]='\0'; break; } return bw;}int main(){ recursion(); return 0;}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值