【问题标题】:Symbol table using vectors使用向量的符号表
【发布时间】: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)比普通向量更好。但对于任意嵌套范围所需的树状结构,它仍然无济于事。相反,每个范围都有一个结构,其中包含嵌套范围的“容器”。然后在嵌套范围中使用相同的结构,这将为您提供一个具有无限(理论上无论如何)范围嵌套的树状结构。

标签: c++ compiler-construction


【解决方案1】:

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

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

在搜索符号时,父指针很有用;您需要搜索当前作用域的所有父级,直到找到符号。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多