符号 Table 存储 AST(声明)节点还是 "Symbols" 不同 objects/classes?

Does a Symbol Table store AST (Declaration)Nodes or are the "Symbols" different objects/classes?

我有一些关于 AST / Symbol Table 关系的事情我不明白。

我目前有一个用 C# 实现的 AST,它具有用于变量声明的节点(这些包含有关名称、类型、源位置、作为表达式节点的可能常量值等的信息)。

现在我想填充一个符号 table(在我的 AST 上使用访问者模式)但我的问题是:"symbols" 是新的 类 例如 VariableSymbol 还是symbol table 直接存储来自 AST 的 VariableDeclarationNode?

如果符号是新的 类,那么谁来存储常量变量的计算表达式值,VariableDeclarationNode 或 VariableSymbol 或其他地方?

(我看过一些解释器示例,它们将所有变量值(包括常量)存储在附加哈希 table 中,但我正在使用源到源编译器而不是解释器,所以我不确定在这种情况下你在哪里存储评估的常量。抱歉,我知道这些有点多的问题)

are the "symbols" new classes for example VariableSymbol or does the symbol table directly store the VariableDeclarationNode from the AST?

如果 AST 节点中的信息足以完成任务,那么您只需在范围 tree/table 中存储引用即可。如果您从语法树进行解释而不是仅仅发出代码,那么您需要复杂的数据结构,其中对原始 AST 节点的引用的存在是次要问题。我们已经看到并完成了这两项工作。在词法分析和解析之外的阶段不保留对 "primitive" AST 节点的引用是一种更清洁的方法。

[would it] be dirty to store the evaluated constant values (for the special case) in the symbol classes or should i create an additonal table for these?

这也确实取决于...如果您将常量值设想为声明的固有 属性,请将其存储在您的符号描述符中 class:

class Symbol : ISymbol {
    ASTNode DeclaringNode;
    SymbolType RuntimeType;
    bool InitializeAsConstant;
    RuntimeValue ConstantValue;

    ...
}

如果保留包含的右值,那么您可以用目标语言逐字复制声明,然后将它们视为变量,直到过程结束:

/* fantasy source language */
Constant $$IAMCONSTANT :=> /03\ MUL /02\ KTHXBYE

/* target language */
const int IAMCONSTANT = 3 * 2;

/* as opposed to compilation stage 1 precomputed */
const int IAMCONSTANT = 6;

对于源到源的情况,第一种更容易,因为您可能无需在编译器中计算表达式的值就可以逃脱。