2012-03-21 20 views
0

正如問題所述,我在我的公司中堅持使用.Net 2.0,並且沒有升級的機會。有沒有辦法讓.NET 2.0中的Irony工作。在.Net 2.0中使用Irony進行自定義語言設計

我會簡單地嘗試解釋我想達到的目標。我們公司有一個工資單系統,我們讓客戶在那裏爲工資單項目定義自己的公式。這些公式必須使用我們通過Regex檢查的一些關鍵字/函數(非常不可靠)。然後我們創建一個Microsoft腳本控制對象並使用它的eval函數來解析片段。這些片段依次調用類中定義的關鍵字/函數來獲取輸出。

但是說這個系統有缺點是非常有禮貌。有時它只是隨着錯誤而溢出。

非常愚蠢的例如 -

FVAL(A)/(FVAL(B)+FVAL(C)) 

很明顯,這個公式通過了兩個階段。

首先,我們做了以下驗證階段 -

  • 檢查通過正則表達式是否有使用任何關鍵字中不存在的關鍵字

  • 的預定義的ArrayList然後檢查是否有在變量的數組列表中不存在的變量(在這種情況下 - A,B,C是那些變量)。

  • 如果所有的驗證接着傳到我們通過式字符串到ScriptControlClass對象的eval功能,並且也添加與在其中定義的所有功能的靜態類(在這種情況下,考慮FVAL()),並且該函數返回布爾true如果變量是在這種情況下使用一個有效的(如添加日期和編號將返回false)評估這個表達式的結果後

現在是 - DivideByZeroException,爲什麼?因爲EVAL類型轉換所有布爾true1和執行正常的算數。

FVAL(A)/(FVAL(B)+FVAL(C)) => 1/(1-1) 

第二階段幾乎是類似的,但沒有任何驗證檢查,就像沒有返回true,我們實際上是從一個DataTable其中包含每個變量的值返回變量的值。

這個系統已經過時了,它嚴重影響我的神經,我真的需要幫助。請建議。

回答

2

如果你只是談論Excel風格的公式,編寫一個好的解釋器很容易,特別是如果你只需要處理一種數據類型。有編譯器(甚至是解析器)背景的人可能會在不到一天的時間內寫出你的信息。我自己寫了一堆。

Embedding a scripting language是另一種選擇,但您必須對給定語言的怪癖感到滿意。如果這是業務需求,確保使用高精度數字可能會很困難。

+0

您如何看待[Spart](http://www.codeproject.com/Articles/5676/Spart-a-parser-generator-framework-100-C#)。你能指導我使用Spart來達到我的目的嗎?我認爲它足以滿足我的需求。我只是停留在「入門」文章中。 – 2012-03-21 10:06:47

+0

選項有[很多](http://stackoverflow.com/questions/5060583/code-parser-for-own-dsl-in-c-sharp),但沒有我已經實現的編譯器或解釋器使用其中的任何一個。反諷和斯巴特都可以是偉大的。就我個人而言,我已經寫了足夠的東西,我會花更少的時間用遞歸下降系統從頭開始編寫簡單的語法,而不是學習API。 – 2012-03-21 10:25:10

+0

你可以給我一個使用我在問題中發佈的代碼的語法示例。 – 2012-03-21 12:49:10