fanzhidongyzby/cit

3.3.3 变量管理之添加变量对象

Closed this issue · 1 comments

相关代码与问题

void SymTab::addVar(Var* var){
    if(varTab.find(var -> getName() == varTab.end())){
        varTab[var -> getName()] = new vector<Var *>; // 创建链表
        varTab[var -> getName()] -> push_back(var); // 添加变量
    }
    else {
        vector<Var *>& list = *varTab[var -> getName()]; // 同名变量列表
        int i;
        for(i = 0; i < list.size(); i++){                   // 判断变量作用域
            if(list[i] -> getPath().back() == var -> getPath().back()){
                break;
            }
        }

        // 书中的原文:前面提到整数和字符常量都保存在 "<int>" 和 "<char>""同名变量列表内,且作用域都为空,
        // 因此会导致索引 i 不等于同名列表的长度,触发语义错误。为了避免这一点,我们添加了对变量名的判断,
        // 即判断名字的第一个字符是否是 '<', 因此标识符名称是不可能以 '<' 开始的.
        
        // 为什么可以排除常量? 难道 <int> 和 <char> 的类型的常量是以 '<' 开始的? 如果是,请举出一个例子,谢谢.
        if( i == list.size() || var -> getName() == '<') {  
            list.push_back(var);
        }
        else {
            SEMERROR(VAR_RE_DEF, var -> getName());     // 变量重定义
            delete var;
            return ;
        }
    }

    if(ir) {
        int flag = ir -> genVarInit(var);       // 变量初始化语句
        if(curFun && flag){
            curFun -> locate(var);              // 计算局部变量栈帧偏移
        }
    }
}

参考代码实现:symbol.cpp:159