2013-02-23 17 views
0

上下文:我正在爲簡單的語言編寫解釋器,供用戶玩耍並玩得開心。它將作爲一個mod運行到遊戲中。我無法使用動態的原因是因爲遊戲在Unity3d中運行,Unity3d運行的是等效於.net 3.5(不具有動態)的Mono版本。將運算符應用於兩個不含'動態'的對象

現在問題:我將值存儲爲對象。當評估表達式(比如添加)時,我有嘗試做「對象+對象」的問題。我怎樣才能做到這一點?

一種解決方案是在每個對象上執行一個大塊切換塊,檢查它的類型以查看它是否是基本值類型(int,long,double等),如果是,則轉換爲該類型並添加。如果它不是基本值類型,請在每種類型中查找op_Addition方法,如果存在,則調用它。

這可以很快得到很多代碼,爲每個操作員做這件事。我想知道是否有更好的,更少的複製粘貼方式。 (最佳解決方案是一些.net庫函數,這是object Add(object, object),但這是有希望的)

+0

您:_I將值存儲爲對象._爲什麼?在類似C#的類型安全語言中,通常你不會那樣做。它與你正在寫的翻譯的本質有關嗎? – 2013-02-23 18:32:13

+0

我將它們作爲對象存儲的原因是因爲在編譯時我不知道類型的值。我不知道用戶是要輸入「new Regex()」還是「3」,所以我不知道它是什麼類型。存儲的唯一方法是通過一個對象。 – khyperia 2013-02-23 18:35:02

+0

什麼是「正則表達式」?如果用戶鍵入''new Regex()'',你會搜索'System.dll'程序集,選擇'System.Text.RegularExpressions'命名空間,找到類型,搜索匹配的構造函數重載,然後調用構造函數?因爲如果你做類似的事情,檢查一個'+'過載並不難。也許你需要的是「編譯器即服務」?或者你正在編寫自己的編譯器? – 2013-02-23 19:58:19

回答

1

您可以爲您的對象定義一個接口來定義您需要的操作,然後確保所有存儲的對象實現該接口(也許包裝簡單類型)。

相關問題