2014-10-25 3 views
-1

저는 C++과 유사한 언어 용 컴파일러를 작성하고 있습니다. 나는 정적 데이터와 메소드만을 가진 클래스로 내 코드에서 표현되는 심볼 테이블을 처리해야한다.컴파일러에서 싱글 톤 사용

이 같은입니다 :

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

나는 많은 장소에서 이러한 액세스해야합니다

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

    /* some static methods */ 
}; 

또한 설정 나타내는 클래스가있다. 코드를 전달하면 코드가 부 풀리게됩니다. 그런 클래스를 사용하는 것이 편리할까요, 아니면 모든 것을 구성하는 더 좋은 방법이 있습니까?

+0

주위를 지나가고 싶습니까? Symbol * 또는 GlobalTable? – codenheim

+0

GlobalTable 전달하기 – justanothercoder

답변

1

일반적으로 컴파일러에서 symbol의 정의에 따라 심볼 테이블에 심볼 유형을 저장합니다. 일반적으로 범위 당 기호 표가 있으므로 각 모듈 또는 컴파일 가능한 단위의 전역 범위에는 자체 기호 표가 있습니다.

기호 및 기호 하위를 멤버로 가지는 AST 노드가 있습니다.

대부분의 내부 컴파일러 api는 기호 및 ast 부속 유형을 처리하며 인덱싱 된 빠른 액세스 데이터 구조에 저장됩니다. 이 모든 것은 대부분의 컴파일러 함수에서 사용할 수 있어야하므로 전역 컴파일러 또는 컨텍스트 변수를 사용하거나 매개 변수로 전달할 수 있습니다.

엄밀히 말하면, 싱글 톤을 사용할 필요가 없습니다. 필자는 예를 들어서 만 이야기 할 수 있습니다. 그래서 current_tope 및 globalScope와 같은 인스턴스 멤버뿐만 아니라 루트 AST 또는 currentCompilableUnit과 같은 인스턴스 멤버가있는 Compiler 클래스를 사용하여 컴파일러를 인스턴스화하여 모든 내용을 재진입 할 ​​수 있습니다. 컴파일러 인스턴스가 전역 변수 인 경우 함수가 컴파일러 매개 변수를 생략 할 수 있지만 그 외에 다른 모든 필요성은 필요하지 않으므로 좀 더 편리합니다. 간단히 말해, 대부분의 API가 많은 범위의 "범위"또는 "컴파일러"구조체 또는 클래스를 해당 서명에 포함하는 것이 일반적입니다. 컴파일러를 모델링하기 위해 OOP를 사용하더라도 클래스의 모든 메소드에는 암시적인 "this"액세스 권한이 있습니다.

+0

코드를 잘 컴파일 할 수 있습니다. 내 질문은 더 유연하게 컴파일러 코드를 구성하는 방법입니다. 정적 멤버 만 글로벌 클래스를 어떻게 든 처리 할 수 ​​있습니까? – justanothercoder

+0

글로벌 클래스 란 컴파일러 소스 코드 또는 해당 언어의 전역을 의미합니까? – codenheim

+0

제 컴파일러 코드에서 전역을 말합니다. – justanothercoder