算术表达式语法分析
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;}
输出"语法分析完成,符合算术表达式文法^_^"* 输入有错则输出相应错误提示。*****************************************************************/#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;}
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- Lua和C语言的交互详解
- C#获取网页源代码的方法
- LCL.VBS 病毒源代码
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言