通过三地址代码序列生成计算机的目标代码,在生成算法中,对寄存器的使用顺序为:寄存器中存有 > 空寄存器 > 内存中存有 > 以后不再使用 > 最远距离使用
Input 单组输入,给定输出的三地址代码的个数和寄存器的个数.所有的变量为大写字母,寄存器的数量不超过9
Output 参照示例格式输出,不需要将最后的寄存器中的值写回内存
不再使用变量不用写回内存
Sample Input
4 2 T:=A-B U:=A-C V:=T+U W:=V+USample 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; char p[100]; char s[100][100]; int n, m, top = 0; int get(char ch)///寄存器中是否存在变量 { for(int i = 0; i < m; i++) { if(ch == p[i]) return i; } return -1; } int use(int x, char ch)///查找后面是否使用 { for(int i = x; i < n; i++) { if(ch == s[i][3] || ch == s[i][5]) return i; } return n; } int find(int x) { if(top < m) return top++; int t = -1; int ans = -1; for(int i = 0; i < m; i++) { int k = use(x, p[i]); if(k > ans) { ans = k; t = i; } } return t; } 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>>n>>m; for(int i = 0; i < n; i++) cin>>s[i]; for(int i = 0; i < n; i++) { int x = get(s[i][3]); if(x == -1) { x = find(i); if(p[x] != '\0' && use(i, p[x]) < n) { 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; }