简单的代码生成程序
Time Limit: 1000 ms Memory Limit: 65536 KiB
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
Sample Input-2
4 2
a:=A+B
b:=C+D
c:=E-b
d:=a-c
Sample Output-2
LD R0, A
ADD R0, B
LD R1, C
ADD R1, D
ST R0, a
LD R0, E
SUB R0, R1
LD R1, a
SUB R1, R0
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
char address[110][10];
char Rvalue[10];
int n, m;
int find_Rvalue(char c)
{
for(int i=0; i<m; i++)
{
if(c == Rvalue[i])
return i;
}
return -1;
}
int getReg(int i)
{
//左运算数在寄存器中
if(find_Rvalue(address[i][3]) != -1)
{
return find_Rvalue(address[i][3]);
}
else if(find_Rvalue('\u0000') != -1)
{
return find_Rvalue('\u0000');
}
else
{
//以后不再用的
int t;
for(int j=0; j<m; j++)
{
for(t=i; t<n; t++)
{
if((Rvalue[j] == address[t][3]) || (Rvalue[j] == address[t][5]))
{
break;
}
}
if(t==n)
{
return j;
}
}
//选出一个最远的, 以后还要用
for(int j=0; j<m; j++)
{
for(t=n-1; t>=i; t--)
{
if(Rvalue[j] == address[t][3])
{
printf("ST R%d, %c\n", j, address[t][3]);
//因为以后还要用,所以需要打入内存中
return j;
}
if(Rvalue[j] == address[t][5])
{
printf("ST R%d, %c\n", j, address[t][5]);
return j;
}
}
}
return -1;
}
}
char * op(char c)
{
if(c == '+')
return "ADD";
else if(c == '-')
return "SUB";
else if(c == '*')
return "MUL";
else if(c == '/')
return "DIV";
}
int main()
{
int i;
scanf("%d %d", &n, &m);
for(i=0; i<n; i++)
{
scanf("%s", address[i]);
}
for(i=0; i<n; i++)
{
int x = getReg(i);
int a = find_Rvalue(address[i][3]);
int b = find_Rvalue(address[i][5]);
if(a!=-1&&b!=-1)//B,C皆在R中
{
printf("%s R%d, R%d\n", op(address[i][4]), x, b);
}
else if(a!=-1&&b==-1)//B在R中, C不在
{
printf("%s R%d, %c\n", op(address[i][4]), x, address[i][5]);
}
else if(a==-1&&b==-1)//B,C皆不再R中
{
printf("LD R%d, %c\n", x, address[i][3]);
printf("%s R%d, %c\n", op(address[i][4]), x, address[i][5]);
}
else if(a==-1&&b!=-1)//B不在,C在R中
{
printf("LD R%d, %c\n", x, address[i][3]);
printf("%s R%d, R%d\n", op(address[i][4]), x, b);
}
Rvalue[x] = address[i][0];//别忘记把此时运算后的存到寄存器中
//printf("R%d存%c\n", x, address[i][0]);
}
return 0;
}