使用向量的符号表

时间:2014-12-07 01:28:19

标签: c++ compiler-construction

我一直绞尽脑汁试图通过实施我的符号表来解决逻辑问题。现在我挥舞着白旗并寻求帮助。我正在使用向量创建符号表,但是我在将符号表条目(现在是一个字符串,稍后是一个结构)放入正确的范围时遇到了问题。我的代码有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;
}

1 个答案:

答案 0 :(得分:0)

您无法仅通过索引跟踪当前范围;你需要一个堆栈。或者(可能更有用)您需要记录每个范围的父范围,您可以使用第二个矢量或在范围对象中包含额外的数据成员。

在任何一种情况下,当您输入新范围时,您将在范围对象的向量的末尾创建一个新的范围对象(符号向量,具有关联的父范围索引),并使该对象成为对象。索引&#34;当前范围索引&#34;。当您离开范围时,当前范围索引将设置为当前范围的父级。

当您搜索符号时,父指针很有用;您需要搜索当前范围的所有父项,直到找到符号。

根据您尝试建模的范围规则,这可能不够。例如,它没有准确地模拟C&C的范围规则,因为在C中,声明的变量的范围从声明开始,而不是在封闭块的开头。但是,只要在从左到右解析输入时按顺序执行所有符号查找,它就足以构建AST。