2010-02-18 73 views
9

我正在編寫一個允許用戶輸入布爾表達式的應用程序。我需要能夠在運行時評估輸入的布爾表達式,並且正在尋找一個解析器和一個expressoin驗證器。布爾和數學表達式解析器

解析器
解析器需要將布爾表達式作爲字符串並返回true/false。

例子:

 
string expression = "(1 == 1) && (1 > 0)"; 
Parser parser = new Parser(); 
boolean result = parser.parse(expression); // Result should be True. 

除了處理布爾表達式我還需要它來處理數學。

 
expression = "((1 + 1 * 2) == 1)"; 
result = parser.parse(expression); // Result should be False. 

驗證
所以,我可以告訴用戶,如果有正在進入我還需要一種方法來驗證語法與表達的問題。

我在使用.NET Compact Framework的C#中工作,但是如果您知道使用另一種語言編寫的內容可能會有幫助。

感謝您提供的任何幫助。 Tom

回答

3

http://www.antlr.org

ANTLR的語法可以被設計成允許雙方分析和評價。

下面是一個例子:http://www.antlr.org/wiki/display/ANTLR3/Expression+evaluator

+0

ANTLR +1。如果你看到這個並解僱它,認爲這太麻煩了,請重新考慮。我建議您使用ANTLRworks作爲語法開發工具,並將其輸出到您的Visual Studio項目樹中的詞法分析器和分析器類。它相對無縫,並且很容易迭代地調整語法,並很快在.NET世界中看到它的效果。 – 2010-02-18 21:40:48

+0

上面的「你」,我的意思是托馬斯OP。 – 2010-02-18 21:41:27

+0

@Chris Farmer:這是針對C#Compact Framework的...可能會有點沉重... – t0mm13b 2010-02-18 21:58:11

0

我不知道任何圖書館,使這更容易,但你真的只有兩個子問題在這裏。你需要爲後綴轉換器建立一箇中綴,然後爲布爾運算和數學運算編寫一個基本的計算器。

一旦你建立了布爾樹/堆棧,開始執行操作。如果您有任何不是數字的東西,請通過將字符串/表達式發送給執行infix-> postfix轉換的算術計算器來評估它,然後返回一個值。

如果你谷歌「中綴到後綴」和「堆棧rpn計算器」,你可以找到更多的資源。

+2

但是,如果您可以用「eval」掏出一種語言,問題就解決了。你尋找真假,對於其他事情,你知道你是無效的。 – 2010-02-18 20:44:10

+0

我認爲「eval」完全是錯誤的路要走。這很容易,但讓人們編寫任何在您的語言中合法的代碼是有風險的。恕我直言,更好的方法是擁有可用於這些表達式的獨特而有限的語法。 – 2010-02-18 21:47:37

0

您可能可以使用dotMath庫來執行此操作。

0

這裏有Codeproject一個很好的評估分析程序,使用eval方法和不依賴於CodeDOM的或類似的東西。這裏有一篇關於在同一網站上使用Antlr構建expression evaluator的優秀文章。

希望這會有所幫助, 祝你好運, Tom。

0

這種類型的東西是F#的麪包和黃油。你可以試試看。對於解析,使用遞歸下降,然後你可以運行結果樹。如果你有輸入語言的控制權,你可以通過報價操作來獲得。

2

假設你可以稍微改變你的語法,讓嵌入式數據庫爲你做的工作,這樣的T-SQL查詢:

select case when <Expression> then 1 else 0 end as Result 

使用你的例子:

select case when ((1 = 1) and (1 > 0)) then 1 else 0 end as Result 
select case when ((1 + 1 * 2) = 1) then 1 else 0 end as Result 
+1

根據問題,表達式實際上是由用戶輸入的。因此你的解決方案很容易被SQL注入。 – 2010-02-19 08:29:16

6

我們的項目正在使用NCalc(其中ANTLR用於lexing/parsing),我們對此非常滿意。

NCalc是一個數學表達式 .NET中的求值器。 NCalc可以解析任何 表達式並評估結果, 包括靜態或動態參數 和自定義函數。

我們的應用程序要求將它交叉編譯爲Full和Compact Frameworks。通過相對簡單的調整,我們能夠使NCalc和ANTLR都適用於兩種框架風格。