编译原理练习 递归下降

来源:互联网 发布:筑志红中麻将源码 编辑:程序博客网 时间:2024/06/05 21:34
#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;}

阅读全文
0 0
原创粉丝点击