【发布时间】:2014-12-08 06:11:17
【问题描述】:
我一直在绞尽脑汁试图找出实现符号表的逻辑,现在我挥舞着白旗寻求帮助。我正在使用向量创建一个符号表,但我无法将符号表条目(现在是一个字符串,稍后是一个结构)放在正确的范围内。我的代码有一个int scopenum,每次打开块时都会增加{每次关闭块时都会减少}。然而,这条线导致了一个问题:
{ a { b } { q } } 因为它将 q 放在范围 2 中,而它应该在范围 3 中。我的代码将新行推送到向量上,但它没有在插入中使用它.如何修改我的代码以正确说明打开和关闭范围?
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int stacknum=-1;
vector< vector<string> > v;
void display(){
for(int i=0; i<v.size(); i++){
cout << "Scope " << i+1 << ": " << endl;
for(int j=0; j<v[i].size(); j++)
cout << v[i][j] << endl;
cout << endl;
}
}
void insert(string s){
v[stacknum].push_back(s);
}
int main(){
string data;
ifstream file;
file.open("input");
if(!file.is_open()) {
cout << "Input file not found";
return 1; }
while(file >> data){
if(data=="{"){
stacknum++;
vector<string> row;
v.push_back(row);
continue;
}
if(data=="}"){
stacknum--;
continue;
}
insert(data);
}
file.close();
display();
return 0;
}
【问题讨论】:
-
为什么它应该在范围 3 中?
{q}是{b}的兄弟,没有嵌套在其中。如果您希望以树形形式表示此输入,我会说您需要重新考虑您的数据存储模型。单一的范围级别堆栈太天真了。 -
不要像你有一个非常扁平的结构,只有一个嵌套向量(只允许单层嵌套),想想 trees。
-
嵌套向量有用吗?谷歌上的大多数结果告诉我使用哈希表作为符号表,但它们不会有类似的功能吗?我正在描绘代表变量范围的二维向量的每一行 {int a;浮动 b;} 。我只需要将代码放入正确的行。
-
哈希表(标准 C++ 库中的
std::unordered_map)比普通向量更好。但对于任意嵌套范围所需的树状结构,它仍然无济于事。相反,每个范围都有一个结构,其中包含嵌套范围的“容器”。然后在嵌套范围中使用相同的结构,这将为您提供一个具有无限(理论上无论如何)范围嵌套的树状结构。