2009-09-17 62 views
2

我正在尋找可以在查詢過濾器上操作的解析器。但是,我不太清楚術語,所以它證明了辛勤工作。我希望有人能幫助我。我已經閱讀了「遞歸下降解析器」,但是我想知道這些是否適用於全面的語言解析器,而不是我正在尋找的邏輯表達式評估。查詢過濾器表達式樹的解析器

理想情況下,我在尋找.NET代碼(C#),但也使用了類似的T-SQL中的解析器。

我想要的是什麼解析例如:

((A = B)|(E = 1))&(C < = d)

理想的情況下,運營商可以自定義(例如'<'vs'lt','='vs'=='vs'eq'等),我們可以指定函數類型標籤(例如(left(x,1)='e'))。解析器加載它,服從命令優先級(理想地處理缺少任何括號),然後用表達式回調我的代碼以評估布爾結果 - 例如, 'A = B'?)。我不希望解析器理解表達式中的自定義函數(儘管一些基本的函數會很有用,比如字符串分割)。將表達式(分成左側和右側部分)很好。

解析器最好問最少數量的問題必須計算出最終結果 - 例如,如果AND的一邊是假的,則沒有評估另一邊的點,並且首先評估最容易的一面(即,在上面的表達式中,'c < = d'應該被假定爲更快並且因此首先被評估。

我可以想象,這是很多工作要做,然而,相當普遍。任何人都可以給我任何指針嗎?如果沒有像上面那樣靈活的解析器,是否有任何基本的解析器可以使用作爲一個開始?

非常感謝

回答

1

看看this。ANTLR是一個很好的解析器生成器,鏈接到的文章具有可以適應您的需求的工作代碼。

+0

謝謝Vinay。這真的很有幫助,而且自從我發佈這個問題以來,我學到了更多關於解析的知識。我一直在看.NET表達式樹,並想知道這是否會起作用?看起來,定義語法的靈活性較低,但它是框架的一部分。唯一的問題是我找不到一個將字符串加載到樹中,然後被「回調」以評估個體表達式的示例。我會繼續尋找,但ANTLR目前看起來像解決方案。 謝謝,李 – 2009-09-17 14:25:55

+0

@李:您可以編寫代碼將您的ANTLR樹轉換爲.Net表達式樹,以便使用ANTLR中的AST功能進行評估。 – user7116 2009-11-02 15:32:46

0

嘗試Vici.Parser:download it here (free),它是迄今爲止我找到的最靈活的表達式解析器/評估器。

+0

感謝Roel,但是這看起來專門針對C#語法和代碼的後期執行。我更喜歡指定我自己的語法的靈活性,也不希望代碼被系統執行,但被我的代碼所忽略。 再次感謝您抽出時間。 – 2009-09-17 14:23:01

0

如果可能,請使用.Net 3.5表達式。

編譯器會爲您解析表達式,併爲您提供表達樹,您可以根據需要分析和使用表達式樹。不是很簡單但可行(實際上IQueryable接口的所有實現都是這樣做的)。

+0

感謝康斯坦丁 - 你知道任何例子嗎?特別提供一些源文本,然後評估樹中的表達式? – 2009-09-17 15:31:21

1

您可以檢出Irony。有了它,您可以使用離bnf不遠的語法在C#代碼中定義您的語法。他們甚至在他們的網站上有一個簡單的例子(表達式評估器),這個例子看起來非常接近你想要達到的目標。

編輯:在今年的Lang.Net研討會上,有一個talk about Irony

希望這會有所幫助!

+0

嗨 - 這是我一直在考慮的 - 與TinyPG一起。我喜歡TinyPG,因爲它沒有任何依賴性,但是,Irony現在似乎更加活躍。你知道Irony在性能上與其他解決方案相比有多好? Lee – 2009-11-02 10:04:36

+0

嗨,不,我不,我只是玩了一下。但作者似乎(非常)能幹,而且他確信它比較好。他在今年的Lang.Net研討會上發表了關於諷刺的文章(我已經編輯了我的答案,其中包括該演講的鏈接)。 – andyp 2009-11-02 15:24:13

0

您可以爲此使用.NET表達式樹。這個例子其實很簡單。

Expression<Func<int, int, int, int, bool>> test = (int a, int b, int c, int d) => ((a == b) | (c == 1)) & (c <= d); 

然後只要看看調試器中的「測試」。一切已經爲你解析,你可以使用它。

唯一的問題是,在.NET 3.5中,在Func中最多隻能有4個參數。所以,我在一個地方將「e」改爲「c」。在4.0這個限制改爲16.

+0

嗨 我不知道這是如何幫助解析表達式字符串。有Dynamic Linq,但似乎並不支持自己的(即none-c#,none-vb)語言。 – 2009-11-03 09:10:03

+0

哦,對不起。我以爲你想解析實際的代碼。 – 2009-11-03 18:05:31