您的位置:首页 > 编程语言 > C语言/C++

算术表达式语法分析

2015-12-24 22:15 465 查看
/*****************************************************************程序功能:* 用递归下降子程序法判断算术表达式的语法是否正确*作者:* 张帅 东北大学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;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息