持有对地图向量的地图引用
Holding a map reference to a vector of maps
我的任务是构建一个编译器,对生成的抽象语法树进行词法分析、解析和分析,以确保类型匹配,避免重复声明等
指示我们构建一个 Symbol Table,它包含每个范围的变量及其类型的映射。我选择了地图矢量。我更喜欢这个而不是堆栈,因为我可以在任何范围内检查变量时迭代它。
我为这个结构构建了 Push、Pop、Lookup 和 Insert 操作,如下所示,我的想法是在向量中保留对最新映射的引用并向其添加变量。当进入一个新的范围时,执行推送操作,在向量中创建一个新的映射来存储数组。
退出作用域时,将执行 Pop 操作以删除向量末尾的映射并获取现在位于向量后面的先前映射。
通过调试,我注意到该矢量只是没有保存任何地图细节,并且通过引用工作似乎没有做任何事情来更新应该保存该地图的矢量。如何在向量中正确引用地图并维护此结构?
符号Table:
struct SymbolTable {
// Stack defining scopes holding identifier / type details
std::vector<std::map<std::string,std::string>> _scopeVector;
// Tracks current working stack
std::map<std::string,std::string> _currentMap;
SymbolTable() = default;
void Push() {
std::map<std::string,std::string> *_tempMap;
_tempMap = new std::map<std::string,std::string>();
_scopeVector.push_back(*_tempMap);
_currentMap = _scopeVector.back();
}
void Insert(std::string p_name, std::string p_type) {
_currentMap.insert(std::make_pair(p_name,p_type));
}
// Returns type if found, empty if not
std::string Lookup (std::string p_name) {
for (int i = 0; i < _scopeVector.size(); i++) {
if (_scopeVector[i].find(p_name) == _scopeVector[i].end()) {
// No match yet
} else {
return _scopeVector[i].find(p_name)->first; // return var name
}
}
std::cerr << "Type name " << p_name << " not found in all of stack" << std::endl;
return "";
}
void Pop () {
_scopeVector.pop_back();
_currentMap = _scopeVector.back();
}
};
SymbolTable *ST;
Class 设置符号的构造函数 Table:
SemanticAnalysisVisitor() {
ST = new SymbolTable();
ST->Push();
}
Debugger image of an empty vector but populated map
至于你的问题(我认为)说法
_currentMap = _scopeVector.back();
从矢量复制贴图。
_currentMap
将始终是一个独立且不同的映射,与向量中的任何内容完全无关。
你似乎想使用引用,但在这种情况下这是不可能的(除非你重新设计)。
您可以通过使用指向地图的(智能)指针向量来解决这个问题(以及我在评论中提到的内存泄漏),并使 _currentMap
成为一个(智能)指针。
我的任务是构建一个编译器,对生成的抽象语法树进行词法分析、解析和分析,以确保类型匹配,避免重复声明等
指示我们构建一个 Symbol Table,它包含每个范围的变量及其类型的映射。我选择了地图矢量。我更喜欢这个而不是堆栈,因为我可以在任何范围内检查变量时迭代它。
我为这个结构构建了 Push、Pop、Lookup 和 Insert 操作,如下所示,我的想法是在向量中保留对最新映射的引用并向其添加变量。当进入一个新的范围时,执行推送操作,在向量中创建一个新的映射来存储数组。
退出作用域时,将执行 Pop 操作以删除向量末尾的映射并获取现在位于向量后面的先前映射。
通过调试,我注意到该矢量只是没有保存任何地图细节,并且通过引用工作似乎没有做任何事情来更新应该保存该地图的矢量。如何在向量中正确引用地图并维护此结构?
符号Table:
struct SymbolTable {
// Stack defining scopes holding identifier / type details
std::vector<std::map<std::string,std::string>> _scopeVector;
// Tracks current working stack
std::map<std::string,std::string> _currentMap;
SymbolTable() = default;
void Push() {
std::map<std::string,std::string> *_tempMap;
_tempMap = new std::map<std::string,std::string>();
_scopeVector.push_back(*_tempMap);
_currentMap = _scopeVector.back();
}
void Insert(std::string p_name, std::string p_type) {
_currentMap.insert(std::make_pair(p_name,p_type));
}
// Returns type if found, empty if not
std::string Lookup (std::string p_name) {
for (int i = 0; i < _scopeVector.size(); i++) {
if (_scopeVector[i].find(p_name) == _scopeVector[i].end()) {
// No match yet
} else {
return _scopeVector[i].find(p_name)->first; // return var name
}
}
std::cerr << "Type name " << p_name << " not found in all of stack" << std::endl;
return "";
}
void Pop () {
_scopeVector.pop_back();
_currentMap = _scopeVector.back();
}
};
SymbolTable *ST;
Class 设置符号的构造函数 Table:
SemanticAnalysisVisitor() {
ST = new SymbolTable();
ST->Push();
}
Debugger image of an empty vector but populated map
至于你的问题(我认为)说法
_currentMap = _scopeVector.back();
从矢量复制贴图。
_currentMap
将始终是一个独立且不同的映射,与向量中的任何内容完全无关。
你似乎想使用引用,但在这种情况下这是不可能的(除非你重新设计)。
您可以通过使用指向地图的(智能)指针向量来解决这个问题(以及我在评论中提到的内存泄漏),并使 _currentMap
成为一个(智能)指针。