2008-12-09 116 views
5

所以這就是我期望實現的。我想給我的用戶一個單一的谷歌類似的文本框,他們可以鍵入他們的查詢。我希望他們能夠表達半自然語言,比如解析用戶的查詢

"view all between 1/1/2008 and 1/2/2008" 

它的確定,如果語法有相當的結構,並僅限於這個特定的領域......這些都是專業用戶誰將會使用這個。

最後,我想我會的解析結果可作爲某種表達式樹的。但是,如果你對於什麼樣的數據結構可能會更好有一些其他想法。

這是C#:-)

回答

4

您正在描述一種編程語言。授予它是一種小語言(通常稱爲小語言,或域特定語言(DSL))。如果你從來沒有聽說過遞歸下降解析器這個術語,那麼你最好遵循Paul的建議並使用一些描述的下拉框。

然而,再次,我會同意他的觀點,如果你想這樣做,ANTLR的是要走的路。網站上有教程可以幫助你入門。基本上,您將需要描述如何使用Backus-Naur Form表示法的語法。

然後,您將在您的語法庫上運行Antlr,並生成解析器。然後,您可以將來自教科書的輸入提供給抽象語法樹。然後您可以使用該樹來生成您的查詢。這聽起來並不難,但有一點點。

如果你真的想要和/或想擴展你的編程翅膀,你可以閱讀Dragon Book,AKA編譯器:原理,技術和工具。

祝你好運我的朋友。

-1

試圖解析這些東西將是一場災難,並ultimatley非常有限的用戶,從而挫敗他們更然後幫助他們。我建議使用預定義的查詢類,以及某種查詢生成器工具,它具有下拉式表單中的所有可用選項。你可以爲不同的數據類型使用不同的布爾運算符(大於,小於數字,比如不像字符串等),但是我認爲這會比實際解析出用戶輸入的內容更有意義。

+0

我們已經實施了下拉菜單......我們的用戶必須做很多點擊才能將動態元素添加到他們的查詢中,這是非常令人沮喪的。注意我說「我們的用戶」,我知道一般來說你的建議可能更容易,但這些人知道我們的應用程序上下,並得到培訓:-) – 2008-12-09 15:03:19

1

表達式樹是一個好主意。在那裏有許多優秀的通用解析器和解析器生成器,可以將正確的查詢字符串轉換爲表達式樹。

+0

你可以給我/我們一些這些解析器和解析器生成器的例子參考? – 2008-12-09 14:54:48

2

我一直在這種情況之前。經過多次討論,我們認爲上下文敏感的下拉菜單比單純的文本框更好。

例如,有4個下拉菜單,但最後3個禁用。然後,當用戶從第一個選項中選擇一個選項時,它填充並啓用其他選項。因此,他們會選擇「查看所有」,然後選擇「之間」,然後可能會彈出文本框或最後兩個日曆。

Here's an example that's kind of like what I am talking about

3

對於一個非常簡單的語言,我會用正則表達式去。你的主要好處是你不必處理任何代碼生成。儘管如此,調試模式匹配基本上是零。

如果你的語言比較複雜(你不會介意在一個語法文件中指定整個事物),我會使用Coco/R - 這是快速,易於使用,並使極其可調試的代碼。

對於更復雜的語言,我目前最喜歡的是Antlr v3。支持多文件語法(通過'import'語句),這非常好。生成的代碼是可調試的,但在調試之前需要花費一些時間來考慮「簡單」。

0

我不知道這是否會對你有幫助,但是我們做了什麼:我們給了用戶預定義的標準,比如日期選擇,我們給了他們兩個日曆彈出窗口,以便他們可以從中選擇日期範圍。 ..我們沒有強制它..所以日期過濾器的使用只適用於當用戶指定日期...同樣,你也可以給用戶一個預先定義的標準選擇...除此之外,表達式樹似乎是一個很好的解決方法。

1

使用Oslo,它是專門爲此設計的...

0

GOLD Parser Generator具有用於設計和測試你的語法,相當不錯的教程和文檔一個有用的UI,並且很容易從C#中使用。