实现符号表来存储不同类型 C++ 的值

Implementing a symbol tables to store values for different types C++

我正在用 C++ 实现编译器,目前处于 AST 阶段。我现在需要在 symbol_entry 中添加该变量的值(它已经有类型)。但是,当我不知道类型时,如何在 class 的属性中保留不同大小的值。我目前的想法是在 symbol_entry 中声明一个类型为 void* 的属性“val_pointer”,然后将例如从 int* 转换为 void* 并返回。我的理解是,这是可以做到的,因为指针的大小都是一样的。这行得通吗?而且,这种每次都单独分配一个 int* 的方式是否有效?我认为如果我从连续的内存块存储创建这些 int* 会更好,但我也想保存 space。

一种解决方案是使用 tagged unions。例如:

enum Type
{
    tInt,
    tDouble
};

struct Data
{
    Type    type;
    union
    {
        int Int;    // only valid when type is tInt
        double Double;  // only valid when type is tDouble
    } as;
};

请注意,这不是 C++ 中可用的最佳解决方案。您可能需要查看 std::variant, which has some advantages when compared to a raw tagged union, see .

另一种方法可能是拥有一个 class 层次结构,其中每个数据类型都继承自一个基本 Object 类型。