2011-02-03 105 views
2

我們目前使用ILOG BRMS for .NET來允許業務用戶在我們的系統中創建邏輯而無需知道如何編程。此規則由業務用戶創建(即:它是系統的一部分,而不是規範的一部分):.NET自然語言編程/別名/(域特定語言)框架

definitions 
    set 'the letter event' to the scheduled DelinquentLetterEvent on the invoice; 
    set 'final notice possibility1' to the bill date of the invoice + 36 days; 
    set 'final notice possibility2' to the time of 'the letter event' + 7 days; 
    set 'final notice result' to the most future date from these values { 
    'final notice possibility1', 'final notice possibility2' }; 
then 
    in the event that 'final notice result' is not a mailing date, 
    change it to the next available mailing date; 
    add a new FinalNoticeEvent scheduled for 'final notice result' to the invoice; 

系統執行在.net(這裏顯示僞C#)的等價物:

//variable declarations 
ScheduledEvent theLetterEvent = theInvoice.GetScheduledEvent(
    KnownEventType.DelinquentLetterEvent); 
DateTime noticePossibility1 = theInvoice.BillDate.AddDays(36); 
DateTime noticePossibility2 = theLetterEvent.Time.AddDays(7); 
DateTime[] possibilities = new DateTime[]() 
    { noticePossibility1, noticePossibility2 }; 
DateTime noticeResult = CustomClass.Max(possibilities); 
    //actions 
CustomClass2.MakeNextMailingDate(ref noticeResult); 
theInvoice.AddScheduledEvent(KnownEventType.FinalNoticeEvent, noticeResult); 

程序員在設計時指定每個類/方法/屬性使用了哪些文本。例如,去年法文本爲:

add a new {0} scheduled for {1} to {this} 

它逐漸清晰的在我身上,我並不需要一個BRMS的。規則與斷言實例匹配的概念對於商業用戶來說與程序員同樣是陌生的。我們的業務用戶對SQL腳本有些熟悉(有些熟悉VBA),所以他們對順序執行很熟悉。

我真正想要的是一種在設計時指定文本(DSL)的方法,它映射到自然語言編程的類/方法/屬性,最好在BRMS之外。

這樣的事情是否存在?這個概念的名字是什麼?


迴應:

我們認爲腳本語言廣泛地滿足這一需求。具體而言,他們不提供文本替換/映射到我尋求的.NET代碼。 我想寫一個c#方法,然後聲明一些可以用來調用它的合理短語。

ANTLR - 感謝您的提示。這是一個通用的解析器。如果我想自己實現這一點,我肯定會需要解析器。

您發明的任何人造語言都是以問題領域爲中心的詞彙,根據定義爲「特定領域的語言」。

我覺得這個說法和我可以回答我的問題一樣好。謝謝。

如果您需要完全一般的計算,您最終將得到一個典型的計算機語言。如果你可以縮小範圍,你可能會以一些有用的東西結束。

我可以一直縮小範圍到調用我實現的方法,但問題在於當我添加更多方法時,我想爲這些新方法附加更多詞彙表。

無論我們是否繼續使用ILOG或其他語言作爲該語言的支持基礎結構,DSL都會發展。

回答

3

實際上,您不能編寫一個接受真實自然語言並將其映射到工作代碼的工具。沒有人知道如何做到這一點。 (因此C#而不是英語)。

最好的你可以希望的是一組短語(很像你展示的BRML),它總是具有更好定義的優勢,並且「商業用戶」更難以學習,因爲他們不會「 t(想要)知道該說什麼開始,更不用說表達性的限制了。您在問題領域以歧義詞彙爲主的任何人造語言都被定義爲「特定領域的語言」。

真正的觀點是,你的語言需要包括哪些活動範圍?您的「商業」用戶的可培養程度如何(如果他們可以編碼,我想知道他們的特徵是「業務用戶」)?他們是否同意他們願意說的事情的範圍(不打賭)。如果你需要完全一般的計算,你最終會得到一種典型的計算機語言(實際上更糟糕,因爲你最終會對編程功能進行沙盤模擬,產生一個真正醜陋的嬰兒)。如果你可以縮小範圍,你可能會以一些有用的東西結束。

問題是,你可以設計一種比你打算取代的BRML更好的語言,用戶期望能夠做什麼? [我對ILOG的BRML有多好,但是你不得不認爲他們一直在試圖解決這個問題,而且由於他們仍然存在,他們一定不能有一個愚蠢的解決方案]。

如果您有信心可以,那麼您可以使用基於解析器的代碼生成器工具來實現DSL。它相當實驗;如果你現在開始,如果你的方法成功,你將不會知道一年,它可能會失敗。

良好的語言設計,無論是程序性還是DSL,都是

可行DSL通常會發生什麼情況是他們設法解決原始問題中一個有趣的部分,剩下的問題就是「以某種方式」。處理這種情況的一種方式是演進DSL:新語法,新語義等;這確實發生在成功的DSL上。期待你的發展。另一個典型的方法是提供一些標準的轉義機制(例如某種過程調用,任意表達式......),然後有人根據需要添加額外的子例程。

即使你獲得了DSL的權利,它可能不會被社會接受。 [Ada是一門非常好的語言,它被C和C++所取代,因爲程序員根本不想學習它]。

2

對於如何完成此操作,您有很多選擇。我們舉幾個例子:

  • 集成一種腳本語言。你可以例如使用VBScript或Lua。您爲自己的對象創建包裝並使其可用於腳本語言。這樣做的好處是解析器和可執行引擎已經爲您執行;

  • 使用XAML。 XAML是一種用XML定義對象結構的方法。您可以使用公式的標記擴展名,以便您可以使用例如BillDate="{DateFormula +1 days}";

  • 使用ANTLR爲您自己的DSL定義解析器。使用ANTLR,編寫解析器相對容易。您可以從匹配的結構中創建語法中的對象。