编译原理实验3——递归下降分析
2015-12-07 14:11
477 查看
本代码实现的文法是这样的
G[E]:
E→E+T| T
T→T*F|F
F→(E ) | i
因为包含左递归,故需要消去之后才能做。
设计理念:通过递归下降的方式来对句子进行分析。
若能够接收一个完全的初始字符并且所有的串全部被读入,则算作accepted。
否则为wrong。
使用说明:
首先输入需要分析的样例个数,再依次输入待分析的句子即可。
代码如下:
G[E]:
E→E+T| T
T→T*F|F
F→(E ) | i
因为包含左递归,故需要消去之后才能做。
设计理念:通过递归下降的方式来对句子进行分析。
若能够接收一个完全的初始字符并且所有的串全部被读入,则算作accepted。
否则为wrong。
使用说明:
首先输入需要分析的样例个数,再依次输入待分析的句子即可。
代码如下:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 10005; char Buffer ; int tail; bool E(); bool A(); bool T(); bool B(); bool F(); void init(){ tail = 0; } void solve(){ scanf("%s",Buffer); init(); if(E() && strlen(Buffer) == tail) printf("Yes!\n"); else printf("No...\n"); } int main(){ int _; scanf("%d",&_); while(_--) solve(); return 0; } bool E(){/*{{{*/ bool ok = 1; ok = ok && T(); ok = ok && A(); return ok; }/*}}}*/ bool A(){/*{{{*/ bool ok = 1; if(Buffer[tail] == '+'){ tail ++; ok = ok && F(); ok = ok && B(); ok = ok && A(); } else ok = 1; return ok; }/*}}}*/ bool T(){/*{{{*/ bool ok = 1; ok = ok && F(); ok = ok && B(); return ok; }/*}}}*/ bool B(){/*{{{*/ bool ok = 1; if(Buffer[tail] == '*'){ tail ++; ok = ok && F(); ok = ok && B(); } else ok = 1; return ok; }/*}}}*/ bool F(){/*{{{*/ int ok = 1; if(Buffer[tail] == '('){ tail ++; ok = ok && E(); if(Buffer[tail] != ')') ok = 0; else tail ++; } else if(Buffer[tail] == 'i'){ tail ++; ok = 1; } else ok = 0; return ok; }/*}}}*/ /* 10 i+(i+i*i) i+i i+i+i+i i+i*i*i i++++ iii i+i+(i+i) c+i c i+i+ */
相关文章推荐
- iOS开发之block(一)
- Linux(Centos)之安装Java JDK及注意事项
- IOS 在viewController上添加视频
- Linux下rz命令使用的实例详解
- UIView的hitTest:方法和pointInside:方法的实现
- Neodynamic Barcode Reader SDK使用教程:条码识别
- 消息分发知识基础
- 汤晓鸥教授的一篇很有意思的文章
- Webview调用支付宝客户端
- 顺序容器Vector,List,,Deque区别
- iOS开发者们如何获取设备型号
- Maven学习总结
- Php 中用phpmailer发送邮件
- 实测可用的免费STUN服务器!
- Effective OkHttp
- LoadRunner培训初级教程
- Eclipse编辑jsp、js文件时出现卡死解决方案~
- Spring+Springmvc+MyBatis整合
- 详细设计
- 总体设计