1216 递归下降分析法
2015-12-30 16:26
302 查看
/*G[E]: E->E+T|E-T|T T->T*F|T/F|F F->(E)|i 左递归消除 E->TE' E'->+TE'|-TE'|ε T->FT' T'->*FT'|/FT'|ε F->(E)|i */ #include<stdio.h> char sym; char LL1[1000]; int N=-1; void T(); void E(); void F(); void e(); void t(); void error(); void scaner(); void main() { char ch; int i=0; printf("请输入需要分析的sym语法:(以#结束)\n"); do{ scanf("%c",&ch); LL1[i] = ch; i++; }while(ch != '#'); scaner(); E(); if(sym == '#') printf("成功!\n"); else{ printf("文法有误!!\n"); error(); } } void scaner(){ //用于读取源函数的下一个字符 N++; if(LL1 == ' '){ N++; }else{ sym = LL1 ; } } void E(){ T(); e(); } void T(){ F(); t(); } void e(){ if(sym == '+'||sym == '-'){ scaner(); T(); e(); } else if(LL1[N+1] == '#' || LL1[N+1] == '+' || LL1[N+1] == '/' || LL1[N+1] == '*' || LL1[N+1] == '-'){ if(LL1 != '(' && LL1 != ')') error(); } } void t(){ if(sym == '*'||sym == '/'){ scaner(); F(); T(); } else if(LL1[N+1] == '#' || LL1[N+1] == '+' || LL1[N+1] == '/' || LL1[N+1] == '*' || LL1[N+1] == '-'){ if(LL1 != '(' && LL1 != ')') error(); } } void F(){ if(sym == '('){ scaner(); E(); if(sym == ')'){ scaner(); }else{ error(); } }else //判断是否是函数或者是数字 while(1){ if(sym >= 'a' && sym<='z' || sym >= 'A' && sym <= 'Z' || sym >= '0' && sym <= '9'){ scaner(); } else{ break; } } } void error(){ printf("第%d个 %c之后的文法有错!\n",N,sym); }
相关文章推荐
- PhantomJS
- 一段代码,演示Win32下超大文件读写
- nginx proxy_next_upstream导致的一个重复提交错误
- stdClass类转换成数组
- iOS字符串GBK编码转UTF-8
- solr发布到tomcat下
- AndroidStudio导入sdk中的Sample工程
- Spring学习笔记(十四):junit4的使用
- 设计模型
- Linux命令之stty - 显示和修改终端行设置
- JMeter一次简单的接口测试
- centos6中iptables单机网络防火墙的使用
- MySQL性能优化总结
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
- uva10245
- centos6中iptables单机网络防火墙的使用
- android之listView定位到指定行同一时候隐藏输入键盘
- sikuli+java实例
- 关于ALSA算法代码的学习与修正
- hdu1069 Monkey and Banana