小编R1P*_*ake的帖子

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

我有一些关于 AST/符号表关系的事情我不明白。

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

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

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

(我看过一些解释器示例,它们将所有变量值(包括常量)存储在一个附加的哈希表中,但我正在研究源到源编译器而不是解释器,所以我不确定您将评估的常量存储在何处这种情况。对不起,我知道这些问题有点多)

c# compiler-construction compilation abstract-syntax-tree symbol-table

5
推荐指数
1
解决办法
1129
查看次数

是否可以在同一个 T 上使用通用的“in”和“out”修饰符?

此代码无效,因为 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 中呢?或者是否可以使用不同的语法?

c# generics interface

1
推荐指数
1
解决办法
113
查看次数