您的位置:首页 > 其它

编译原理实验3——递归下降分析

2015-12-07 14:11 477 查看
本代码实现的文法是这样的

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+

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: