编译原理练习 递归下降
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; }
相关文章推荐
- 编译原理语法分析器递归下降法求助
- 递归下降法的语法分析器-3.1-编译原理
- 编译原理-递归下降语法分析器(Java)
- 编译原理及实践(Compiler Construction Principles and Practice)——简单的递归下降程序计算器
- 编译原理学习笔记10——(野火烧不尽再递归下降—— E → E+T | T从上向下程序)——2014_1_26
- 递归下降分析法(编译原理)
- 编译原理-递归下降分析器
- 编译原理学习笔记(二)左递归消除、递归下降
- 递归下降分析法(编译原理)
- 编译原理—递归下降分析
- 编译原理实验三——语法分析(递归下降法)
- 编译原理--递归下降语法分析源代码(C Language)
- 【编译原理】自顶向下的语法分析之递归下降分析法
- 编译原理实验2-递归下降分析法
- 编译原理 实验3 递归下降语法分析程序设计
- 编译原理---递归下降分析法
- 编译原理实验3——递归下降分析
- 递归下降法的语法分析器-3-编译原理
- 递归下降法的语法分析器-3.1-编译原理
- 编译原理(递归下降分析程序)