2009-02-04 85 views
4

我建模一個評估表達式的系統。現在這些表達式中的操作數可以是幾種類型之一,包括一些原始的.NET類型。在定義我的表達式類時,我想要某種程度的類型安全性,因此不希望爲操作數對象類型使用「對象」,所以我正在考慮定義一個抽象的操作數基類,其中沒有任何內容,並創建一個子類每種類型的操作數。你覺得這怎麼樣?表達評估設計問題

此外,只有某些類型的操作數對別人有意義。最後,只有一些操作員對特定操作數有意義。我無法真正想到在編譯時實現這些規則的方式,所以我想我必須在運行時執行這些檢查。

有關我如何能夠做得更好的任何想法?

+0

讓我知道如果您遇到問題 - 我有一些工作代碼的地方,我在原型(鏈接)的數學處理;-p http://marcgravell.blogspot.com/2009/使用01/above-surface.html – 2009-02-04 22:40:57

回答

1

Expression在3.5中怎麼樣?我最近用這個寫了一個表達式分析器/編譯器。

+0

我要走這條路(表達式樹)。這些表達式可以在LINQ中非常乾淨地編寫,並自動轉換爲可以評估的表達式樹。仍試圖制定更多的實施細節,但一些PoC編碼看起來很有希望! – akshayl 2009-02-04 22:23:32

2

我不確定基於C的語言是否具有此功能,但是Java有幾個實際上對此有意義的軟件包。

JavaCC或java編譯器編譯器允許您定義一種語言(例如您的表達式),並且它們構建相應的java類。如果不是更多的實驗性和學術性軟件包,DemeterJ是一種更友好的用戶界面 - 這使您可以非常輕鬆地指定表達式語言,並附帶一個用於定義訪問者和策略的庫,以便對生成的類結構進行操作。如果您可以負擔切換到Java我可以嘗試。其他方面,我會尋找這些技術之一的C#克隆。

如果沿着這條路線走,另一件需要考慮的事情是,一旦你在最終結果的合理近似值內生成了你的類結構,你可以繼承所有生成的類並構建你的所有特定於應用程序的登錄子類。這樣,如果您確實需要重新生成表達式語言的新模型,那麼您的邏輯將相對獨立於您的類層次結構。

更新:其實它看起來好像一些這方面的東西移植到.NET技術,雖然我還沒有使用它,所以我不知道它可能是什麼形狀:

http://www.ccs.neu.edu/home/lieber/inside-impl.html

好運!

1

我最近建立了一個動態表達式評估器。我發現有效的是按照你的建議創建一個帶有有意義的派生類的BaseOperand(NumericOperand,StringOperand,DateOperand等)。根據你的實現,泛型也可能有意義(操作數)。

通過實現訪問者模式,您可以執行任何類型的驗證。

我有一個非常具體的需要推出我自己的解決方案,但有許多選項可用於處理表達式。你可能想看看其中的一些靈感或避免重新發明輪子。

0

我發現了一個很好的方法來處理與EXPRESSIONOASIS框架的對象的類型。他們正在使用自定義數據結構來承載對象的類型。因此,在用正則表達式和給定表達式解析操作數之後,他們決定類型並將此類型存儲爲通用類的屬性,可隨時用於獲取類型。

http://code.google.com/p/expressionoasis/