2013-05-30 58 views
1

我有實時圖形編程和網絡發展的良好知識,我已經開始要求我的一個項目採取用戶創建的條件字符串,實際使用在這些條件碼。這對我來說是一種全新的編程問題。翻譯字符串格式的條件語句,以實際的邏輯

我試着使用循環和切片了條件串了幾個實驗......但我覺得我缺少某種技術,這將使這個更加有效和直接。我有一種感覺,正則表達式在這裏可能有用,但也許不是。

下面是一個例子的字符串:

"IF#VAR#>[email protected]@<=3" 

那些實際變量的值將來自對象的數組。此外,變量周圍的不同標記符號表示可以找到實際值的不同對象數組(變量名稱是索引)。

我完全控制條件字符串的格式(在IF/ELSE/ELSEIF和/或 周圍添加符號以及不同操作數週圍的特殊符號),所以我的選項相當開放。你會如何處理這樣的編程問題?

回答

0

你面臨的問題是所謂的parsing並且有它很多的解決方案。首先,您可以爲您的迷你語言編寫自己的「解釋器」,包括詞法分析器(將字符串拆分爲令牌),解析器(從令牌流構建樹結構)和執行器,執行器遍歷樹並計算最終價值。或者,您可以使用解析器生成器(如PEG),並自動爲您構建所有內容 - 您只需提供語言規則即可。最後,您可以使用javascript內置的解析器/評估器eval。這是迄今爲止最簡單的選擇,但eval只能理解javascript語法 - 所以在評估它之前,您必須將您的語言轉換爲JavaScript。由於eval可以運行任意代碼,因此它不適用於不受信任的環境。

下面是關於如何使用eval與樣品輸入一個例子:

expr = "#VAR#>[email protected]@<=3" 

vars = { 
    "#": {"VAR":5}, 
    "$": {"VAR2":1}, 
    "@": {"VAR3":7} 
} 

expr = expr.replace(/([#@$])(\w+)(\1)/g, function($0, $1, $2) { 
    return "vars['" + $1 + "']." + $2; 
}).replace(/OR/g, "||").replace(/AND/g, "&&") 

result = eval(expr) // returns true 
相關問題