编译原理练习 递归下降
来源:互联网 发布:筑志红中麻将源码 编辑:程序博客网 时间: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
- 编译原理练习 递归下降
- 编译原理-递归下降分析器
- 编译原理(递归下降分析程序)
- 递归下降分析法(编译原理)
- 编译原理—递归下降分析
- 编译原理--递归下降语法分析源代码(C Language)
- 编译原理 实验3 递归下降语法分析程序设计
- 递归下降法的语法分析器-3-编译原理
- 递归下降法的语法分析器-3.1-编译原理
- 编译原理实验2-递归下降分析法
- 编译原理实验3——递归下降分析
- 编译原理-递归下降语法分析器(Java)
- 编译原理实验2-递归下降分析–表达式求值
- 编译原理学习笔记(二)左递归消除、递归下降
- 编译原理实验三——语法分析(递归下降法)
- 【编译原理】自顶向下的语法分析之递归下降分析法
- 编译原理及实践(Compiler Construction Principles and Practice)——简单的递归下降程序计算器
- 编译原理 消除左递归
- Python在图片中添加文字的两种操作
- 深度理解链式前向星
- php 面向对象和面向过程区别
- mysql5.7.19解压版安装
- 二叉树的应用----后序中序 推 前序
- 编译原理练习 递归下降
- HTML(二) 设置文本
- sqli-labs学习记录(五)
- 初识Hibernate之关联映射(一)
- Linux控制台(console)和图形化界面之间的切换
- git认证证书问题解决方案(github clone "Permission denied (publickey). fatal: Could not read from remote reposi)
- 优先级队列 + 哈夫曼树
- Fred 7.0.0 光线追迹软件_USB加密锁,全模块运行稳定版\
- 如何在双击后运行shell脚本