1. 程式人生 > 實用技巧 >3500P - 簡單的程式碼生成程式(編譯原理)

3500P - 簡單的程式碼生成程式(編譯原理)

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
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int n, m, top;
 6 char s[105][15], a[105]={'\0'};
 7 
 8 int find1(char c)
 9 {
10     int i;
11     for(i=0;i<top;i++)
12     {
13         if(a[i]==c) return i;
14     }
15     return -1;
16 }
17 
18 int show(int st, char c)
19 {
20     int
i; 21 for(i=st;i<n;i++) 22 { 23 if(s[i][3]==c||s[i][5]==c) return i; 24 } 25 return n; 26 } 27 28 int find2(char c, int st) 29 { 30 if(top<m) return top++; 31 int i, maxx=-1, maxi, k; 32 for(i=0;i<m;i++) 33 { 34 k = show(st, a[i]); 35 if
(k>maxx) 36 { 37 maxx = k; 38 maxi = i; 39 } 40 } 41 return maxi; 42 } 43 44 int main() 45 { 46 int i, x, y; 47 top = 0; 48 cin >> n >> m; 49 for(i=0;i<n;i++) 50 { 51 cin >> s[i]; 52 } 53 for(i=0;i<n;i++) 54 { 55 x = find1(s[i][3]); 56 if(x==-1) 57 { 58 x= find2(s[i][3], i); 59 if(a[x]!='\0'&&show(i, a[x])!=n) 60 { 61 printf("ST R%d, %c\n", x, a[x]); 62 a[x] = '\0'; 63 } 64 printf("LD R%d, %c\n", x, s[i][3]); 65 } 66 char op; 67 op = s[i][4]; 68 if(op=='+') printf("ADD"); 69 else if(op=='-') printf("SUB"); 70 else if(op=='*') printf("MUL"); 71 else printf("DIV"); 72 y = find1(s[i][5]); 73 if(y==-1) printf(" R%d, %c\n", x, s[i][5]); 74 else printf(" R%d, R%d\n", x, y); 75 a[x] = s[i][0]; 76 } 77 return 0; 78 }