2009-05-05 77 views
3

我試圖創建一個邏輯表達式分析器的表達式如下: ((VariableA - > VariableB)AND NOT VariableC) 解析器應該能夠返回,無論結果是真還是假變量的值。邏輯表達式分析器

基本上,表達式將只包含變量,邏輯運算符(或,和,蘊含,等價,否定和括號)。

我想問一下實現這種解析器的最佳方式是什麼(使用AST樹或逆波蘭標記)?或者,也許已經有一些可以完成這項工作的開源解析器?

+0

實現遞歸下降解析器。邏輯表達式非常簡單,可以通過這種方式輕鬆解析。解析操作可以評估變量,從堆棧中推送/彈出中間值。這應該是~~ 50行的C代碼。 – 2010-08-13 03:14:20

回答

1

如果我是你,我會使用RPN。在解析它的時候,這會爲你節省一些痛苦,算法應該像操作員進來時一樣簡單地推入和彈出一堆值。你也不必用括號來愚弄,這會讓生活變得更容易。唯一的缺點是大多數人不熟悉postfix(AKA RPN)符號。

堆棧可能比樹更容易使用。

只是我的2¢:)

2

您定位什麼語言?

如果你想創建一個解析器,也許ANTLR將爲你做的伎倆。它最初是基於java的,但它有各種語言的生成器(例如,我用它來生成一個C#解析器),並且不難拾取。 它有一個很好的編輯器(ANTLRWorks),允許測試語法,這是一個很好的加。

0

我確定已經有工具可以做到這一點(邏輯評估),但我找不到任何東西。如果您使用諸如Bison(YACC,對於C)或ANTLR(生成多種語言,但使用Java)的工具,則不必擔心解析。 Coco/R是另一個可以生成許多不同語言的解析器生成器。如果你想自己做,我會使用RPN或前綴符號(我認爲它比RPN簡單)。這將使解析更簡單,但會惹惱用戶。

0

這聽起來像:-)

首先,你必須遞歸定義你的語言一門功課。

一個變量被很好地形成形式(WFF)

如果X是一個WFF然後不X是WFF

如果X和Y是WFF然後(X - > Y)是一個WFF

如果X和Y是WFF然後(X和Y),一個WFF

一旦語法定義使用LEX或Flex或等值的Java 或你寫一個簡單的掃描儀喜歡的語言。

使用YACC或Bison或等價物編寫後代遞歸分析器。

稍後,將屬性添加到語法中,以便以後代遞歸方式評估要評估的表達式。

+0

的Yacc和Bison不創建遞歸下降語法分析器,但表驅動移位減少(即,自底向上)的解析器。 – ackb 2009-05-05 21:08:49

0

你見過http://ncalc.codeplex.com

它的可擴展性,快速(如擁有自己的高速緩存),使您能夠提供自定義功能和通過處理EvaluateFunction/EvaluateParameter事件在運行時varaibles。例如表達式它可以解析:

表達式E =新表達式( 「回合(POW(PI,2)+的Pow([PI2],2)+ X,2)」);

e.Parameters [ 「PI2」] =新表達式( 「PI *裨」); e.Parameters [「X」] = 10;

e.EvaluateParameter + =委託(字符串名稱,ParameterArgs參數) { 如果(名稱== 「PI」) args.Result = 3.14; };

Debug.Assert的(117.07 == e.Evaluate()); 它也處理unicode &許多數據類型本地。如果您想更改語法,它會附帶一個鹿角文件。還有一個支持MEF加載新功能的分支。