编译原理实验六—代码优化

实验目的:

1. 通过上机实习,加深对代码优化的理解,掌握基本块优化、循环优化的方法。 

2.  掌握利用 DAG 进行基本块优化的技术。 



坑....闷头写了两天总算模拟出了个能跑得起来的差不多的代码,里面还有很多地方可以优化,函数和结构都有很多....先懒着这样吧

实现代码(待改进版)

#include
#define PB push_back
using namespace std;
char opera[10]={'=','+','-','*','/','_'};
int n;
int cnt;
map mp;
//该变量或常量所对应的结点编号
map numbermp;
//该数字对应的结点编号

/*
Solved:
1.多变量对应同一常量
2.根据变量的值计算另一个变量的值

*/

struct Tac{
    string str;        //四元式的完整式子
    int id;            //序号
    int operation;    //操作
    string op1;        //操作数1
    int num1;        //若操作数1为数字
    string op2;        //操作数2
    int num2;        //若操作数2为数字
    string res;        //结果
    int ans;        //若结果为数字
}t[100];


struct node{
    int id;            //结点序号
    int operation;    //操作
                    
    int type;        //type=0:常量num,type=1:变量var
    int num;        //结点若代表常量
    vector var;    
                    //若结点代表变量
    int lchild;        //左。右孩子序号
    int rchild;
    
    bool operator < (const node& y) const{
        return id Dag;


//vector nd;

void debug(){
    for(int i = 1;i < n; i++){
        cout< qq;
        for(int j = 0 ; j < strloc ; j++){
            string stemp = Dag[nodeloc].var[j];
            qq.push(stemp);
        }
        for(int j = strloc+1; j < Dag[nodeloc].var.size(); j++){
            string stemp = Dag[nodeloc].var[j];
            qq.push(stemp);
        }
        Dag[nodeloc].var.clear();
        while(!qq.empty()){
            string stemp = qq.front();
            qq.pop();
            Dag[nodeloc].var.PB(stemp);
        }
    }
}




int cal(int a,int b,int op){
    char opr = opera[op];
    if(opr == '+') return a+b;
    if(opr == '-') return a-b;
    if(opr == '*') return a*b;
    if(opr == '/') return a/b;
}

node new_node(string str,int &flag){
    int f = 0;
    node tmp;
    if(isdigit(str[0])) tmp = new_node_num(str,f);
    else tmp = new_node_var(str,f);
    flag = f;    
    return tmp;
}


void add_edge(Tac &stm){
    if(!stm.operation){//赋值
        int flag = 0;
        node n1 = new_node(stm.op1,flag);
        //考虑是否出现过,若出现过是否被引用
        relocate_node(stm.res);
        node &tmp = fiDag_node(n1.id);
        tmp.var.PB(stm.res);
        mp[stm.res] = tmp.id;    
    }    
    else{//运算
        int flag1 = 0;
        int flag2 = 0;
        node n1 = new_node(stm.op1,flag1);
        node n2 = new_node(stm.op2,flag2);
        
        //两个操作数都是数字或代表常量的变量
        if(!n1.type && !n2.type){
            //cout<<"All op are numbers"<


你可能感兴趣的:(C++,Class,Project)