我一直绞尽脑汁试图通过实施我的符号表来解决逻辑问题。现在我挥舞着白旗并寻求帮助。我正在使用向量创建符号表,但是我在将符号表条目(现在是一个字符串,稍后是一个结构)放入正确的范围时遇到了问题。我的代码有int scopenum
,每次打开一个块时递增{并且每次块关闭时递减}。但是这一行导致了一个问题:
{a {b} {q}} 因为当q应该在范围3中时,它会将q放在范围2中。我的代码将一个新行推送到向量上,但它没有在它中使用它插入。如何修改我的代码以正确地考虑开放和&关闭范围?
#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;
}
答案 0 :(得分:0)
您无法仅通过索引跟踪当前范围;你需要一个堆栈。或者(可能更有用)您需要记录每个范围的父范围,您可以使用第二个矢量或在范围对象中包含额外的数据成员。
在任何一种情况下,当您输入新范围时,您将在范围对象的向量的末尾创建一个新的范围对象(符号向量,具有关联的父范围索引),并使该对象成为对象。索引&#34;当前范围索引&#34;。当您离开范围时,当前范围索引将设置为当前范围的父级。
当您搜索符号时,父指针很有用;您需要搜索当前范围的所有父项,直到找到符号。
根据您尝试建模的范围规则,这可能不够。例如,它没有准确地模拟C&C的范围规则,因为在C中,声明的变量的范围从声明开始,而不是在封闭块的开头。但是,只要在从左到右解析输入时按顺序执行所有符号查找,它就足以构建AST。