我正在構建一個表達式分析器,我想從中生成數據庫查詢代碼,但已經相當遠了,但我堅持精確地解析BinaryExpressions。將它們分解爲左和右是相當容易的,但我需要檢測括號並相應地生成我的代碼,我看不出如何執行此操作。在BinaryExpression中檢測括號
爲例[請忽略硬傷邏輯:)]:
a => a.Line2 != "1" && (a.Line2 == "a" || a.Line2 != "b") && !a.Line1.EndsWith("a")
我需要在中間檢測「設置」,並維護他們的分組,但我看不到在表達什麼區別正常BinaryExpression解析過程中(我討厭檢查字符串表示括號)
任何幫助,將不勝感激。
(我也許應該提到,我使用C#)
- 編輯 - 我沒有提到,我使用標準的.NET表達式類建立表達式(System.Linq的。表達式命名空間)
- 編輯2--好吧我不解析文本到代碼中,我解析代碼到文本中。所以,我的解析器類有這樣的方法:
void FilterWith<T>(Expression<Func<T, bool>> filterExpression);
,它允許你寫這樣的代碼:
FilterWith<Customer>(c => c.Name =="asd" && c.Surname == "qwe");
這是很容易使用標準的.NET類分析,我的挑戰是解析這個表達式:
FilterWith<Customer>(c => c.Name == "asd" && (c.Surname == "qwe" && c.Status == 1) && !c.Disabled)
我的挑戰是保持括號之間的表達式作爲一個單一的集合。 .Net類正確地將括號中的部分與其他部分分開,但由於括號的原因,沒有指出它是一個集合。
我只會觀察到,這比想象中更難(已經做了幾次),並且是許多「玩具」解析示例無法解決的問題。 – 2011-05-30 13:10:13
遞歸體裁解析器很容易上手,任何有關編譯器構建的大學級別介紹性文本都會討論它。括號由生產expr =「(」+ expr +「)」處理。儘管如此,幾乎不需要重新創建這種代碼。即使.NET有一個:DataTable.Compute()。 – 2011-05-30 15:34:15
小心分享你在這個問題上所做的一切嗎?我同意,這個例子是這個主題的基本方法... – 2011-05-30 15:37:14