3.3.3 变量管理之添加变量对象
Closed this issue · 1 comments
pwnmelife commented
相关代码与问题
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); // 计算局部变量栈帧偏移
}
}
}
fanzhidongyzby commented
参考代码实现:symbol.cpp:159