P - 简单的代码生成程序
Description
通过三地址代码序列生成计算机的目标代码,在生成算法中,对寄存器的使用顺序为:寄存器中存有 > 空寄存器 > 内存中存有 > 以后不再使用 > 最远距离使用
Input
单组输入,给定输出的三地址代码的个数和寄存器的个数.所有的变量为大写字母,寄存器的数量不超过9
Output
参照示例格式输出,不需要将最后的寄存器中的值写回内存
不再使用变量不用写回内存
Sample
Input
4 2
T:=A-B
U:=A-C
V:=T+U
W:=V+U
Output
LD R0, A
SUB R0, B
LD R1, A
SUB R1, C
ADD R0, R1
ADD R0, R1
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
char ji[105];
string s[105];
int getid( char str )
{
for ( int i=0; i<m; i++ ) {
if ( ji[i]==str ) return i;
}
return -1;
}
int use( int limit, char val )
{
for ( int i=limit; i<n; i++ ) {
if ( val==s[i][3]||val==s[i][5] ) return i;
}
return n;
}
int fenpei( int limit )
{
if ( cnt<m ) return cnt++;
int w=-1,ans=-1;
for ( int i=0; i<m; i++ ) {
int v = use(limit,ji[i]);
if ( v>ans ) {
ans = v;
w = i;
}
}
return w;
}
void printf1( char op )
{
if ( op=='+' ) printf("ADD ");
else if ( op=='-' ) printf("SUB ");
else if ( op=='*' ) printf("MUL ");
else if ( op=='/' ) printf("DIV ");
}
void printf2( char op )
{
for ( int i=0; i<m; i++ ) {
if ( op==ji[i] ) {
printf("R%d\n",i);
return ;
}
}
printf("%c\n",op);
}
int main()
{
cin>>n>>m;
for ( int i=0; i<n; i++ ) cin>>s[i];
for ( int i=0; i<n; i++ ) {
int x = getid(s[i][3]);
if ( x==-1 ) {
x = fenpei(i);
if ( ji[x]!='\0' && use(i,ji[x])<n ) { /// ---少了use()
printf("ST R%d, %c\n",x,ji[x]);
ji[x] = NULL; ///--少了清空
}
printf("LD R%d, %c\n",x,s[i][3]);
}
printf1(s[i][4]);
printf("R%d, ",x);
printf2(s[i][5]);
ji[x] = s[i][0];
}
return 0;
}