我有一種非常類似C++語言的語言。詞法分析器和解析器就位並生成正確的AST。對於最大的部分,後端也完成了。編寫一個編譯器:如何讓簡單的模板工作?
編譯器用來創建類型的基本系統非常簡單:所有類型都被認爲是內置的,所有實例都是全局的。因此,只有一個簡單的映射,它將類型名稱與創建變量的方法相匹配,該變量基本上是像boost :: any這樣的泛型類型。與變量名作爲關鍵字另一個地圖和變量的值作爲全局範圍:
std::map< std::string, std::function< Variable() > typeList;
//register some types
typeList[ "X" ] = Variable::Create<X>;
typeList[ "Y" ] = CreateInstanceOfY;
....
當編譯器得到AST節點初始化像X myVar;
它基本上
std::map< std::string, Variable > globalScope;
globalScope[ "myVar" ] = typeList[ "X" ]();
當myVar的稍後使用它可以通過簡單的類型調度訪問像
X& x = myVar.GetReference<X>();
現在我想擴大這一點,並使用簡單的模板。假設有一個使用矢量實現的「數組」類型。我可以註冊一切像
typeList[ "array<X>" ] = Variable::Create< std::vector<X> >;
但這是不是很管理,因爲它將不得不重複所有組合。理想的情況是我需要的功能,允許寫是這樣的:
typeList.CreateTemplateVariable("array", "X")
那麼這將創建一個變量例如它的內部保存一個std :: vector的< X>。我努力嘗試,但無法弄清楚如何做到這一點。也許我只是用簡單的類型映射開始了錯誤的方式,這就是我無法理解它的原因。
所以問題很簡單:是否可以這樣做?如何?
當你從AST製作C++代碼時,它已經是編譯器了。 – belgther
有關術語的小小挑剔:編譯器將代碼從一種格式轉換爲另一種格式。解釋器執行一些代碼。 –
@JoachimPileborg感謝您指出這一點..我真的不擅長術語。 – stijn