我有一個基於標記索引的文檔提供查詢方法的語料庫。用戶手動(!)輸入一個需要解析和評估的查詢字符串。然後語料庫應該返回與給定查詢字符串匹配的所有文檔的列表。查詢語言的特點是簡單的布爾運算符AND,NOT和OR,它們也可以通過括號來區分優先級。 經過一番研究,我已經使用ANTLR將給定的查詢字符串解析到語法樹中。如何評估和處理C#中的簡單字符串語法樹?
例如:查詢
"Bill OR (John AND Jim) OR (NOT Simon AND Mike)"
在下面的語法樹翻譯:
編輯:請參閱巴特煮布鍋後正確的圖形(複製到此處):
樹中的所有節點都是簡單的字符串,並且每個節點都知道其母公司和但不是兄弟姐妹。 正如您所看到的,ANTLR語法已經決定了需要執行操作的順序:樹底部的順序首先出現。
所以我可能需要做的是recusively(?)評估樹中的所有操作數。 在一般情況下,我可以做使用樹中的每個葉子(如「條例」或「約翰」)的方法獲取(串項)我的文集一個簡單的搜索。 Get()返回包含葉中詞的文檔列表。我也可以評估每一片葉子的父親,以識別一個可能的NOT運算符,然後這個運算符會導致不包含該葉子中詞語的結果列表(使用方法Not()而不是Get())。
AND和OR操作人員應被轉化爲其中需要兩個參數的方法調用:
- ,應該調用一個方法相交(列表1,列表2),它返回在列表1並在list2中的文件清單。
- OR應該調用的方法聯盟(列表1,列表2),它返回的是無論是在列表1或列表2的文件清單。
參數list1和list2包含我在使用Get()或Not()之前收到的文檔。
我的問題是:我如何 - 語義和語法在C#中 - 評估所有必要的檢索詞,並用它們來調用正確的順序正確的操作方法?直覺上它聽起來像遞歸,但不知何故我無法想象它 - 特別是因爲並非所有需要調用的方法都具有相同數量的參數。或者,有沒有其他方法可以完成這個?
完全脫離主題,但您使用什麼工具製作該圖形? – Cameron 2011-03-22 18:05:49
「不是西蒙」是否應該返回一組人,但是西蒙,還是一個會爲西蒙評價爲假的表達,或者是......? – 2011-03-22 18:08:03
@Cameron:集成快速格式化的Microsoft PowerPoint 2010 :) – Shackles 2011-03-22 18:09:25