简单的代码生成程序

简单的代码生成程序
Time Limit: 1000 ms Memory Limit: 65536 KiB

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
Hint
Source

Sample Input-2
4 2
a:=A+B
b:=C+D
c:=E-b
d:=a-c
Sample Output-2
LD R0, A
ADD R0, B
LD R1, C
ADD R1, D
ST R0, a
LD R0, E
SUB R0, R1
LD R1, a
SUB R1, R0

#include <iostream>
#include<bits/stdc++.h>

using namespace std;
char address[110][10];
char Rvalue[10];
int n, m;
int find_Rvalue(char c)
{
    for(int i=0; i<m; i++)
    {
        if(c == Rvalue[i])
            return i;
    }
    return -1;
}
int getReg(int i)
{
    //左运算数在寄存器中
    if(find_Rvalue(address[i][3]) != -1)
    {
        return find_Rvalue(address[i][3]);
    }
    else if(find_Rvalue('\u0000') != -1)
    {
        return find_Rvalue('\u0000');
    }
    else
    {
        //以后不再用的
        int t;
        for(int j=0; j<m; j++)
        {
            for(t=i; t<n; t++)
            {
                if((Rvalue[j] == address[t][3]) || (Rvalue[j] == address[t][5]))
                {
                    break;
                }
            }
            if(t==n)
            {

                return j;
            }
        }
        //选出一个最远的, 以后还要用
        for(int j=0; j<m; j++)
        {
            for(t=n-1; t>=i; t--)
            {
                if(Rvalue[j] == address[t][3])
                {
                    printf("ST R%d, %c\n", j, address[t][3]);
                    //因为以后还要用,所以需要打入内存中
                    return j;
                }
                if(Rvalue[j] == address[t][5])
                {
                    printf("ST R%d, %c\n", j, address[t][5]);
                    return j;
                }
            }
        }
     return -1;
    }
}
char * op(char c)
{
    if(c == '+')
        return "ADD";
    else if(c == '-')
        return "SUB";
    else if(c == '*')
        return "MUL";
    else if(c == '/')
        return "DIV";
}
int main()
{
    int i;
    scanf("%d %d", &n, &m);
    for(i=0; i<n; i++)
    {
        scanf("%s", address[i]);
    }
    for(i=0; i<n; i++)
    {
        int x = getReg(i);
        int a = find_Rvalue(address[i][3]);
        int b = find_Rvalue(address[i][5]);

        if(a!=-1&&b!=-1)//B,C皆在R中
        {
            printf("%s R%d, R%d\n", op(address[i][4]), x, b);
        }
        else if(a!=-1&&b==-1)//B在R中, C不在
        {
            printf("%s R%d, %c\n", op(address[i][4]), x, address[i][5]);
        }
        else if(a==-1&&b==-1)//B,C皆不再R中
        {
            printf("LD R%d, %c\n", x, address[i][3]);
            printf("%s R%d, %c\n", op(address[i][4]), x, address[i][5]);
        }
        else if(a==-1&&b!=-1)//B不在,C在R中
        {
            printf("LD R%d, %c\n", x, address[i][3]);
            printf("%s R%d, R%d\n", op(address[i][4]), x, b);
        }
        Rvalue[x] = address[i][0];//别忘记把此时运算后的存到寄存器中
        //printf("R%d存%c\n", x, address[i][0]);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值