您的位置:首页 > 其它

编译原理练习 递归下降

2017-10-07 10:50 344 查看
#include <bits/stdc++.h>
using namespace std;
const int syf = (1<<31)-1;
const int maxn = 40;
char buf[maxn];
char mp[128];
char *bp;
void init(){
for(int i = 0;i < 128;++i) mp[i] = i;
bp = buf;
}
inline bool match(char c){
if(*bp == 0) return false;
if(c == mp[*bp]){
bp++;
return true;
}
else return false;
}
bool eval(){
int expr();
int val1 = expr();
if(val1 == syf) return false;
if(!match('=')) return false;
int val2 = expr();
if(val2 == syf) return false;
if(val1 != val2) return false;
if(*bp != 0) return false;
return true;
}
int expr(){
int _expr();
int term();
int v1 = term();
if(v1 == syf) return syf;
int v2 = _expr();
if(v2 == syf) return syf;
return v1+v2;
}
int _expr(){
int term();
int v1;
if(match('-')){
v1 = term();
if(v1 == syf) return syf;
v1 = -v1;
}
else if(match('+')){
v1 = term();
if(v1 == syf) return syf;
}
else{
return 0;
}
int v2 = _expr();
if(v2 == syf){
return syf;
}
return v1 + v2;
}
int term(){
int factor();
int v1 = factor();
if(v1 == syf) return syf;
int v2 = 1;
if(match('*')){
v2 = term();
if(v2 == syf) return syf;
}
return v1*v2;
}
int factor(){
int num();
if(match('-')){
int v = factor();
if(v == syf) return syf;
return -v;
}
else if(match('(')){
int v = expr();
if(v != syf && match(')'))
return v;
return syf;
}
else{
return num();
}
}
int num(){
int B(int &);
if(match('0')) return 0;
else if(match('1')){
int k = 0;
int v = B(k);
if(v == syf) return syf;
return (1<<k) + v;

}
else{
return syf;
}
}
int B(int &k){
int v;
if(match('0')){
v = B(k);
k++;
}
else if(match('1')){
v = B(k);
v += 1<<k;
k++;
}
else{
v = 0;
}
return v;
}
char str[40];
int cnt[128];
typedef set<char>::iterator itc;
char can[8] = {'1','0','(',')','+','-','=','*'};
int vis[8];
int ans;
set<char> st;
void print(){
for(int i = 0;buf[i];++i) putchar(mp[buf[i]]);
cout<<endl;
}
int dfs(itc it){
if(it == st.end()){
bp = buf;

if(eval()){
//print();
++ans;
}
return 0;
}
for(int i = 0;i < 8;++i){
if(!vis[i]){
vis[i] = 1;
mp[*it] = can[i];
dfs(++it);
--it;
vis[i] = 0;
}
}
}
main(){
/*
cin>>buf;
init();
cout<<eval()<<endl;
*/
mp['0'] = '0';
mp['1'] = '1';
mp['('] = '(';
mp[')'] = ')';
mp['+'] = '+';
mp['-'] = '-';
mp['*'] = '*';
mp['='] = '=';
cin>>buf;
for(int i = 0;buf[i];++i)
if(mp[buf[i]] == 0)
st.insert(buf[i]);
dfs(st.begin());
cout<<ans<<endl;

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