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
code:
#include <bits/stdc++.h>
using namespace std;
int n, m;
char s[110][10];
char R[10];
int cnt;
int inR(char c)
{
for(int i = 0;i<m;i++)
{
if(R[i] == c) return i;
}
return -1;
}
int getLast(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 getPos(int pos)
{
if(cnt<m)
{
return cnt++;
}
int ans = -1;
int m2 = -1;
for(int i = 0;i<m;i++)
{
int n2 = getLast(pos, R[i]);
if(n2>m2)
{
m2 = n2;
ans = i;
}
}
return ans;
}
void printOp(char c)
{
if(c == '+')
{
printf("ADD");
}
else if(c == '-')
{
printf("SUB");
}
else if(c == '*')
{
printf("MUL");
}
else if(c == '\\')
{
printf("DIV");
}
}
void printRight(char c)
{
int pos = inR(c);
if(pos!=-1)
{
printf("R%d\n", pos);
}
else
{
printf("%c\n", c);
}
}
int main()
{
scanf("%d%d", &n, &m);
cnt = 0;
for(int i = 0;i<n;i++)
{
scanf("%s", s[i]);
}
for(int i = 0;i<n;i++)
{
int pos = inR(s[i][3]);
if(pos == -1)
{
pos = getPos(i);
if(R[pos] && getLast(i, R[pos])<n)
{
printf("ST R%d, %c\n",pos,R[pos]);
}
printf("LD R%d, %c\n",pos,s[i][3]);
}
printOp(s[i][4]);
printf(" R%d, ", pos);
printRight(s[i][5]);
R[pos] = s[i][0];
}
return 0;
}