我对AST /符号表的关系有一些不理解的地方。
我目前有一个用C#实现的AST,它有变量声明的节点(这些节点包含关于名称、类型、源位置、可能的常量值作为表达式节点等信息)。
现在我想填充一个符号表(在我的AST上使用访问者模式),但我的问题是:“符号”是新的类,例如VariableSymbol,还是符号表直接存储来自AST的VariableDeclarationNode?
如果符号是新类,那么谁会存储常量变量、VariableDeclarationNode、VariableSymbol或其他地方的表达式求值结果呢?
(我见过一些解释器示例,它们将所有的变量值,包括常量,都存储在一个额外的哈希表中,但我在一个源代码到源代码的编译器上工作,而不是一个解释器,所以我不确定在这种情况下将计算的常量存储在哪里。对不起,我知道这些问题有点多)
发布于 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;
对于源代码到源代码的情况,第一种方法更容易,因为您可能不需要在编译器中计算表达式的值。
https://stackoverflow.com/questions/50667375
复制相似问题