我有一些关于 AST/符号表关系的事情我不明白。
我目前有一个在 C# 中实现的 AST,它具有用于变量声明的节点(这些包含有关名称、类型、源位置、可能的常量值作为表达式节点等的信息)。
现在我想填充一个符号表(在我的 AST 上使用访问者模式)但我的问题是:“符号”是新类,例如 VariableSymbol 还是符号表直接存储来自 AST 的 VariableDeclarationNode?
如果符号是新类,那么谁来存储常量变量、VariableDeclarationNode 或 VariableSymbol 或其他地方的计算表达式值?
(我看过一些解释器示例,它们将所有变量值(包括常量)存储在一个附加的哈希表中,但我正在研究源到源编译器而不是解释器,所以我不确定您将评估的常量存储在何处这种情况。对不起,我知道这些问题有点多)
c# compiler-construction compilation abstract-syntax-tree symbol-table
此代码无效,因为 T 不能同时具有 in 和 out 修饰符:
public interface IInOut<in out T>
{
}
Run Code Online (Sandbox Code Playgroud)
但是您可以执行此“解决方法”:
public interface IInOutWorkaround<in TIn, out TOut>
{
TOut Test(TIn value);
}
public class InOutWorkaround<T> : IInOutWorkaround<T, T>
{
public T Test(T value)
{
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
第二个示例有效并且 InOutWorkaround 类对于 TIn 和 TOut 具有相同的类型,那么为什么不能直接在接口中将这两个修饰符添加到同一个 T 中呢?或者是否可以使用不同的语法?