C++ 单例在编译器中的使用

C++ 单例在编译器中的使用,c++,design-patterns,C++,Design Patterns,我正在为一种类似C++的语言编写编译器。我必须用只有静态数据和方法的类来处理代码中表示的符号表 就像: class GlobalTable { /* static members */ static map<int, Symbol*> symbol_by_id; static map<Symbol*, int> id_by_symbol; /* some static methods */ }; 我需要从很多地方访问这些。传递它会导致代

我正在为一种类似C++的语言编写编译器。我必须用只有静态数据和方法的类来处理代码中表示的符号表

就像:

class GlobalTable
{
    /* static members */
    static map<int, Symbol*> symbol_by_id;
    static map<Symbol*, int> id_by_symbol;

    /* some static methods */
};
我需要从很多地方访问这些。传递它会导致代码膨胀。
像这样使用我的类方便吗,还是有更好的方法来组织所有内容?

在编译器中,通常在符号表中存储符号类型,以便定义符号。通常,每个作用域都有一个符号表,因此每个模块或可编译单元中的全局作用域都有自己的符号表

您还将拥有将符号和符号子表作为其成员的AST节点

大多数内部编译器API处理符号和ast子类型,这些子类型存储在索引的快速访问数据结构中。所有这些都必须对大多数编译器函数可用,因此您要么使用全局编译器或上下文变量,要么将其作为参数传递

严格来说,没有必要使用单例。我只能在示例中进行讨论,因此我使用的方法是使用一个编译器类,该类具有诸如currentScope和globalScope之类的实例成员以及根AST或CurrentCompileableUnit,因此主解析器实例化一个编译器,并且所有内容都是可重入的。不过,如果编译器实例是一个全局变量,则函数可以省略编译器参数,但除此之外,实际上不需要任何其他参数


简而言之,对于大多数API来说,在其许多签名中包含“范围”或“编译器”结构或类是典型的。尽管如果使用OOP对编译器建模,该类的任何方法都具有隐式“this”访问权。

传递什么?符号*或GlobalTable?传递GlobalTable我能够很好地编译代码,它可以工作。我的问题是如何组织我的编译器代码,使其更灵活。我是否可以只处理具有静态成员的全局类?全局类是指编译器源代码中的全局类,还是语言中的全局类?噢。不,没有必要使用单例。我只能在示例中讨论,所以我通常使用的方法是使用一个编译器类,该类具有常规成员,如currentScope和globalScope,以及根AST或CurrentCompileableUnit,因此主解析器实例化编译器,并且所有内容都是可重入的。如果你的编译器实例是一个全局变量,那么你的函数可以省略编译器参数,但是除此之外,不需要任何其他的参数。我理解这一点。我需要一种让其他类可以看到GlobalTable的方法。目前,它是使用singleton完成的。还有别的方法吗?离线给我发邮件如果你想更详细地讨论,我的电子邮件在我的个人资料中。我可以给你一些示例代码,它超出了这个论坛的范围。
class GlobalConfig
{
    static const int int_size;
    /* and so on ... */
};