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 }

 

posted @ 2020-12-10 12:03  Xxiaoyu  阅读(253)  评论(0编辑  收藏  举报