2011-08-29 62 views
2

如何分析這樣的查詢爲sql ..或 你知道任何開源解析器可以解析它:C#:如何分析用戶查詢

(((adsfa ≤ "value") AND (adsfa > "value")) OR (adsfa = "value")) 
AND (adsfa ≤ "value") OR ((adsfa ≤ "value") AND (adsfa ≤ "value")) 
AND (adsfa ≤ "value") 

我試圖建立我自己的算法與string.Split(stringSeparators,StringSplitOptions.RemoveEmptyEntries) 算法越來越複雜,但我找到了更多的組合,它無法解析。


  • adsfa是列名
  • ≤是運營商
  • 「價值」 是價值

更新:謝謝大家,可能我會用解析器之一在下一個版本中。

+2

給近親:這裏有什麼不可理解的? O_o –

回答

4

我使用Irony庫開發了類似這樣的東西。它仍然是阿爾法,但到目前爲止我一直很穩定。請注意,我用它來解析由其他程序員編寫的表達式,而不是用戶輸入。

這裏有另一個想法 - 如果你信任查詢的來源,只需要將其轉換爲適當的SQL,也許幾個簡單的string.Replace()就足夠了?它實際上已經是SQL了,只是操作符是怪異的字符。

+0

在一天結束時,我發現這個僞代碼看起來像SQL。可能你是對的 - 最簡單的方法就是string.Replace() – 1gn1ter

0

這看起來像真正的麻煩。 通常情況下,我會像F#中的FParsec那樣使用解析器生成器/ combinator庫這樣做。但我不認爲有這樣的事情對於C#(路加福音Hoben沒有類似的東西here

您可以切換到F#爲您的項目的一部分?

1

如果這些是您需要解析的唯一表達式,那麼可以在C#中手動編寫解析器。對於括號你需要遞歸,因爲你不知道他們可以嵌套多深。看看this article我寫了一段時間,你可以重寫它以適應你的需求。

當事情變得更加複雜時,手動編寫解析器變得困難,那麼您可能會更好地使用工具包。我在FParsec這幾天選擇了我的武器,儘管它在F#而不是C#中。這非常非常強大和靈活。

其他我對ANTLR有很好的體驗。

也許你不需要有完整的解析器等。告訴我們你想要做什麼,你爲什麼要閱讀這些表達式?也許還有另一種方式。

GJ