在编译器中使用singleton

Use of singletons in compiler

本文关键字:singleton 编译器      更新时间:2023-10-16

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

就像:

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

还有一个表示配置的类:

class GlobalConfig
{
    static const int int_size;
    /* and so on ... */
};

我需要从很多地方访问这些。传递它将导致代码膨胀。这样使用我的课方便吗,或者有更好的方法来组织一切?

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

您还将拥有以符号和符号子类型为成员的AST节点。

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

严格来说,没有必要使用singleton。我只能在示例中讨论,所以我的方法是使用Compiler类,该类具有currentScope和globalScope等实例成员,以及根AST或currentCompilableUnit,所以解析器main实例化了Compiler,所有内容都是可重入的。不过,如果编译器实例是全局变量,那么它会更方便一些,因此函数可以省略编译器参数,但除此之外,实际上不需要任何其他参数。

简言之,大多数API通常在其许多签名中包含"scope"或"compiler"结构或类。但是,如果使用OOP对编译器建模,则该类的任何方法都具有隐式的"this"访问权限。