首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >符号表是存储AST (声明)节点还是“符号”是不同的对象/类?

符号表是存储AST (声明)节点还是“符号”是不同的对象/类?
EN

Stack Overflow用户
提问于 2018-06-03 22:22:02
回答 1查看 1.2K关注 0票数 5

我对AST /符号表的关系有一些不理解的地方。

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

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

如果符号是新类,那么谁会存储常量变量、VariableDeclarationNode、VariableSymbol或其他地方的表达式求值结果呢?

(我见过一些解释器示例,它们将所有的变量值,包括常量,都存储在一个额外的哈希表中,但我在一个源代码到源代码的编译器上工作,而不是一个解释器,所以我不确定在这种情况下将计算的常量存储在哪里。对不起,我知道这些问题有点多)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-04 03:49:43

是“符号”的新类,例如VariableSymbol,还是符号表直接存储来自VariableDeclarationNode的符号?

如果AST节点中的信息足以完成任务,那么只需将引用存储在作用域树/表中就足够了。如果您从语法树进行解释,而不仅仅是发出代码,那么您需要复杂的数据结构,其中对原始AST节点的引用是次要考虑的。我们已经看到并完成了这两项工作。在词法分析和解析之外的阶段不保留对“原始”AST节点的引用是一种更干净的方法。

将评估的常量值(对于特殊情况)存储在符号类中是不是很麻烦,或者我是否应该为这些常量值创建一个附加表?

这也要看情况了。如果您将常量值视为声明的固有属性,请将其存储在您的符号描述符类中:

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

    ...
}

如果您保留组成r值,这样您就可以在目标语言中逐字复制声明,然后将它们视为变量,直到过程结束:

/* 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;

对于源代码到源代码的情况,第一种方法更容易,因为您可能不需要在编译器中计算表达式的值。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50667375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档