簡單的程式碼生成程式
阿新 • • 發佈:2018-12-22
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; }