2010-04-04 36 views
3

在我的翻譯我已經內置在像printexitinput等 這些功能顯然可以從語言內部訪問的語言可用的功能。解釋器然後在向量中尋找具有正確名稱的相應函數,並通過與其名稱一起存儲的指針來調用它。解釋在C++:功能表存儲問題

因此,我收集所有這些功能的文件,如io.cpp,string.cpp,arithmetic.cpp。但是我必須將每個函數都添加到解釋器中的函數列表中,以便找到它。

因此,在這些功能的文件,我有喜歡的東西:

void print(arg) 
{ 
    cout << arg.ToString; 
} 

我這個打印功能添加到翻譯功能列表有:

interpreter.AddFunc("print", print); 
  • 但我應該在哪裏調用interpreter.AddFunc

我不能把它放在打印函數的下面,因爲它必須在根據C++語法的函數中。

  • 在哪裏以及如何將所有功能添加到列表中?
+0

您的解釋器的類構造函數或初始化函數。 – 2010-04-04 19:56:51

回答

2

在每個模塊中(IO,字符串等),限定與所述解釋器註冊該模塊的方法,例如:

void IOModule::Register(Interpreter &interpreter) { 
    interpreter.AddFunc("print", print); 
    //... 
} 

這也可以是一個正常的功能,如果你的模塊沒有在實施一類。

然後在您的應用程序的主要初始化中,調用所有模塊的註冊方法。

該方法有助於保持模塊化:主應用程序初始化需要知道哪些模塊存在,但哪些功能導出的細節留給模塊本身。

+0

通過允許函數自動註冊到模塊中,您可以進一步推進它。雖然如果我們在講功能而不是功能會更容易。 – 2010-04-05 11:45:35

1

最簡單的就是保持函數名的map到函數指針和加載在程序啓動時。您已將函數鏈接到解釋器可執行文件中,因此可在調用main()時訪問它們。

您也可以想出一個方案,其中功能在動態庫(.dll.so,具體取決於平臺)中被污染,某些配置文件將函數名映射到庫/入口點。

+0

函數指針不一定是相同的類型,我不記得泛型函數指針的意義在於'void *'是一個通用數據指針。可能的函子會做得更好。 – 2010-04-04 20:13:25

+0

這當然取決於。函數,包裝函數等應該可以工作。 – 2010-04-04 20:36:23

1

是否所有內容都包含在每個解釋器中?如果是這樣,我建議將它添加到構造函數中(假設解釋器是一個對象)或init方法。

如果不是,您可能需要考慮在您的語言中添加「include」類型指令。然後,當你遇到include指令時,你會這樣做。