简单的代码生成程序

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

通过三地址代码序列生成计算机的目标代码,在生成算法中,对寄存器的使用顺序为:寄存器中存有 > 空寄存器 > 内存中存有 > 以后不再使用 > 最远距离使用

Input

单组输入,给定输出的三地址代码的个数和寄存器的个数.所有的变量为大写字母,寄存器的数量不超过9

Output

参照示例格式输出,不需要将最后的寄存器中的值写回内存

不再使用变量不用写回内存

Sample Input

4 2
T:=A-B
U:=A-C
V:=T+U
W:=V+U

Sample Output

LD R0, A
SUB R0, B
LD R1, A
SUB R1, C
ADD R0, R1
ADD R0, R1

Hint

Source

#include<bits/stdc++.h>
using namespace std;
int num;//寄存器使用的数量
int n , m;
char R[110];//寄存器
string s[110];//表达式
void PrintOperation(char c)
{if(c=='-')cout << "SUB ";if(c=='+')cout << "ADD ";if(c=='*')cout << "MUL ";if(c=='/')cout << "DIV ";
}
int Judge(char c)
{//判断变量是否在寄存器中for(int i = 0;i<m;i++)if(R[i]==c) return i;return -1;
}
int RecentUse(int pos , char c)
{//从当前表达式向后判断,是否有变量早已存在寄存器中for(int i = pos ;i< n ;i++)if(s[i][3]==c || s[i][5]==c)return i;return n;
}
int Find(int pos)
{//寄存器有空余if(num < m) return num++;//寄存器已满int ii  = -1, jj = -1;//判断这些寄存器中哪些存的变量是最远才使用的for(int i = 0 ; i<m ;i++){int k = RecentUse(pos, R[i]);if(k>jj) jj = k, ii = i;}return ii;
}
void PrintSecond(char c)
{int pos = Judge(c);if(pos != -1)printf("R%d\n",pos);elseprintf("%c\n",c);
}
int main()
{memset(R,0,sizeof(R));num = 0;int pos;//游标cin >> n >> m;getchar();for(int i =0 ;i<n;i++)cin >> s[i];for(int i = 0;i<n;i++){pos = Judge(s[i][3]);if(pos==-1){//变量1不在寄存器中pos = Find(i);//如果找到的位置,寄存器已存入变量,且后面的表达式中可能用到这个变量if(R[pos] && RecentUse(i,R[pos]) < n )printf("ST R%d, %c\n",pos,R[pos]);//存入内存printf("LD R%d, %c\n",pos,s[i][3]);}//输出操作符PrintOperation(s[i][4]);printf("R%d, ",pos);PrintSecond(s[i][5]);R[pos]=s[i][0];}return 0;
}

P:简单的代码生成程序相关推荐

  1. 7-5 简单的代码生成程序-A (10 分)

    7-5 简单的代码生成程序-A (10 分) 通过三地址代码序列生成计算机的目标代码,在生成算法中,对寄存器的使用顺序为:寄存器中存有 > 空寄存器 > 内存中存有 > 以后不再使用 ...

  2. [Android] Android MVP 架构下 最简单的 代码实现

    Android  MVP 架构下  最简单的 代码实现 首先看图: 上图是MVP,下图是MVC MVP和MVC的区别,在于以前的View层不仅要和model层交互,还要和controller层交互.而 ...

  3. vba 编辑combobox内容_初识Visual Basic编辑器并建立一段简单的代码

    大家好,从今日开始我正式推出"VBA之EXCEL应用"教程,这个教程是面向初学人员的教程,教程一共三册,十七个章节,从简单的录制宏实现一直讲到窗体的搭建,都是我们在利用EXCEL工 ...

  4. Unity 简单示例代码和向导/Unity Aplication Block

    Unity 简单示例代码和向导 关于Unity 的说明和下载地址,请访问[微软控制反转和依赖注入容器Unity 1.0发布] http://forum.entlib.com/Default.aspx? ...

  5. 用VB6写的一个简单俄罗斯方块代码

    网络上有很多俄罗斯方块代码.它们大都为了视觉效果,程序比较复杂,不利于学习游戏编程.所以我写了个简单俄罗斯方块代码,尽量用VB本身的功能,没有复杂的DirectX. 下载(注意修改下载后的扩展名) m ...

  6. 原生js写三级联动 java_原生js三级联动的简单实现代码

    本文实例为大家分享了js查询天气应用,供大家参考,具体内容如下 实现功能:打开网页时显示用户所在城市的天气状况,在输入框输入城市可查询其它城市. 实现过程:先调用百度地图的API来获取用户所在的城市, ...

  7. python的代码有哪些_简单python代码类型有哪些?

    简单python代码类型有哪些? 简单python代码类型有: 1.[背景] 最近,派大星想要减肥,他决定控制自己的饮食,少吃一点蟹黄堡. 海绵宝宝为了帮助好朋友派大星,和派大星一起制定了一个饮食游戏 ...

  8. ul、li列表简单实用代码实例

    利用ul和li可以实现列表效果,下面就是一个简单的演示. 代码如下: 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 ...

  9. webpack和react_使用React和Webpack进行简单的代码拆分

    webpack和react by Didier FRANC 由Didier FRANC 使用React和Webpack进行简单的代码拆分 (Straightforward code splitting ...

最新文章

  1. 数据结构与算法(3-2)队列(顺序队列、循环队列与链队列)
  2. U盘安装Centos7.0图解
  3. 通过css类/选择器选取元素 文档结构和遍历 元素树的文档
  4. 记录一下python-opencv-ArUco-Apriltag
  5. php使用第三方登录
  6. 使用UML描述需求都实现的过程
  7. php foreach 修改数组,php如何使用foreach修改数组
  8. Hadoop Yarn生产环境核心配置参数
  9. 运行的Cython的3种方法
  10. mybatis 连接池_应用框架之Mybatis数据源和连接池
  11. android 7.0 解锁亮屏,Android7.0亮屏流程分析
  12. 【操作系统】—线程概念和多线程模型
  13. javascript操作listbox方法 【转】
  14. 微软-IT-解决方案-统一沟通-发布会
  15. 【从C到C++学习笔记】C++介绍/推荐书籍/开发工具
  16. IDEA启动Tomcat时 , 报错提示:this web application instance has been stopped already
  17. Voicemeeter Potato —— Windows 平台下的终极虚拟音频混音器
  18. 神经网络的BP算法推导详解
  19. 无标号有根树计数与无标号无根树计数
  20. 用MFC实现WebGUI--(CDHtmlDialog)

热门文章

  1. 已备案域名查询 批量挖掘已备案域名
  2. 如何设置构造柱植筋/预留筋/预埋件做法?
  3. [转]服务器操作系统CoreOS介绍
  4. Java Android常用术语英文简称及释义
  5. Python读取.dat后缀名文件
  6. java 档案管理系统_基于jsp的档案管理系统-JavaEE实现档案管理系统 - java项目源码...
  7. 无线传屏软件发射端 +接收端(mirrorop sender Receiver) v1.2.0.6
  8. 7-15 输出N以内的所有素数分数 15作者 李民单位 武汉理工大学
  9. d3中文案例_D3js初探及数据可视化案例设计实战
  10. php smart模板,PHP 模版引擎Smarty介绍