简单的代码生成程序

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;
char s[100][100];
char p[100];
int a, b, to = 0;
int get(char ch)//寄存器中是否存在变量
{
	for (int i = 0; i < b; i++)
	{
		if (ch == p[i])
		{
			return i;
		}
	}
	return -1;
}
int use(int x, char ch)//查找后面是否使用
{
	for (int i = x; i < a; i++)
	{
		if (ch == s[i][3] || ch == s[i][5])
			return i;
	}
	return a;
}
int find(int x)
{
	if (to < b) return to++;
	int w = -1;
	int ans = -1;
	for (int i = 0; i < b; i++)
	{
		int v = use(x, p[i]);
		if (v > ans)
		{
			ans = v;
			w = i;
		}
	}
	return w;
}
void print1(char ch)
{
	if (ch == '+') printf("ADD ");
	else if (ch == '-') printf("SUB ");
	else if (ch == '*') printf("MUL ");
	else if (ch == '\\') printf("DIV ");
}
void print2(char ch)
{
	int x = get(ch);
	if (x != -1)
	{
		printf("R%d\n", x);
	}
	else printf("%c\n", ch);
}
int main()
{
	cin >> a >> b;
	for (int i = 0; i < a; i++)
	{
		cin >> s[i];
	}
	for (int i = 0; i < a; i++)
	{
		int x = get(s[i][3]);
		if (x == -1)
		{
			x = find(i);
			if (p[x] != '\0' && use(i, p[x]) < a)
			{
				printf("ST R%d, %c\n", x, p[x]);
				p[x] = NULL;
			}
			printf("LD R%d, %c\n", x, s[i][3]);
		}
		print1(s[i][4]);
		printf("R%d, ", x);
		print2(s[i][5]);
		p[x] = s[i][0];
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值