我試圖創建一個邏輯表達式分析器的表達式如下: ((VariableA - > VariableB)AND NOT VariableC) 解析器應該能夠返回,無論結果是真還是假變量的值。邏輯表達式分析器
基本上,表達式將只包含變量,邏輯運算符(或,和,蘊含,等價,否定和括號)。
我想問一下實現這種解析器的最佳方式是什麼(使用AST樹或逆波蘭標記)?或者,也許已經有一些可以完成這項工作的開源解析器?
我試圖創建一個邏輯表達式分析器的表達式如下: ((VariableA - > VariableB)AND NOT VariableC) 解析器應該能夠返回,無論結果是真還是假變量的值。邏輯表達式分析器
基本上,表達式將只包含變量,邏輯運算符(或,和,蘊含,等價,否定和括號)。
我想問一下實現這種解析器的最佳方式是什麼(使用AST樹或逆波蘭標記)?或者,也許已經有一些可以完成這項工作的開源解析器?
如果我是你,我會使用RPN。在解析它的時候,這會爲你節省一些痛苦,算法應該像操作員進來時一樣簡單地推入和彈出一堆值。你也不必用括號來愚弄,這會讓生活變得更容易。唯一的缺點是大多數人不熟悉postfix(AKA RPN)符號。
堆棧可能比樹更容易使用。
只是我的2¢:)
您定位什麼語言?
如果你想創建一個解析器,也許ANTLR將爲你做的伎倆。它最初是基於java的,但它有各種語言的生成器(例如,我用它來生成一個C#解析器),並且不難拾取。 它有一個很好的編輯器(ANTLRWorks),允許測試語法,這是一個很好的加。
這聽起來像:-)
首先,你必須遞歸定義你的語言一門功課。
一個變量被很好地形成形式(WFF)
如果X是一個WFF然後不X是WFF
如果X和Y是WFF然後(X - > Y)是一個WFF
如果X和Y是WFF然後(X和Y),一個WFF
一旦語法定義使用LEX或Flex或等值的Java 或你寫一個簡單的掃描儀喜歡的語言。
使用YACC或Bison或等價物編寫後代遞歸分析器。
稍後,將屬性添加到語法中,以便以後代遞歸方式評估要評估的表達式。
的Yacc和Bison不創建遞歸下降語法分析器,但表驅動移位減少(即,自底向上)的解析器。 – ackb 2009-05-05 21:08:49
如果您在Python的工作,嘗試this expression parser/evaluator,使用pyparsing寫的,作爲一個起點。
它的可擴展性,快速(如擁有自己的高速緩存),使您能夠提供自定義功能和通過處理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加載新功能的分支。
實現遞歸下降解析器。邏輯表達式非常簡單,可以通過這種方式輕鬆解析。解析操作可以評估變量,從堆棧中推送/彈出中間值。這應該是~~ 50行的C代碼。 – 2010-08-13 03:14:20