2011-08-26 54 views
2

我正在研究需要驗證數學表達式的JavaScript應用程序,我不知道如何執行此操作。驗證JavaScript中的數學表達式?

我的語法例子是

(keyword1 + keyword2) * (keyword1/(keyword1 + keyword1)) 

這裏,keyword1keyword2可以是任意數字,和有效的運營商是標準的加,減,乘,除。

有沒有人有任何想法如何做到這一點,可能使用正則表達式?

+0

您的語法示例具有不匹配的圓括號。 – nnnnnn

回答

0

簡單soultion是我們可以發送Ajax請求到服務器可能與表達數據庫,如果它返回正確的值沒有錯誤我的表情是其他有效無效

簡單的哈〜

6

有很多方法可以解決這個問題。我建議你閱讀關於上下文無關文法/語言。這有點簡單(雖然它確實是一個CFG),但瞭解語法和解析技術總是有幫助的。

我應該注意,你在這裏描述的語言是不規則的,所以沒有正則表達式能夠解析它(抽象引理的一個簡單使用證明了這一點)。此外,我建議不要以有意義的方式使用它們 - 它們不是強大的解析工具。

你可以使用解析庫解決更復雜的語法並實現你的簡單情況。如果您尋找的是一個更直接的解決方案,遞歸是你的朋友:

Let's定義一個有效的表達式爲:

expression ::= literal | expression op expression | (expression) 
op ::= + | - |/| * 

其中literal是一個數字。

想想如何調整的定義可以更改語言,特別是想想如何實現不同可以用不同的策略解決這個問題:左到右的評價,或者相反,等等

+0

感謝您的回覆我怎麼能在這個 –

+3

@Roshan上編寫regule表達式,單靠正則表達式不足以解析這個問題。編寫一個簡單的定義爲語法的遞歸實現將更容易,更易於管理。 – davin

+0

@達文,如果你的詞法單元足夠簡單(在數字的情況下,我會說「很可能」),使用regexps來完成lex是完全理智的。但是,這取決於域,所以這不是一個通用規則。一個合適的解析器真的是要走的路。 – Vatine

1

由於@davin指出,這不是你可以用正則表達式來分析。但是,您可以使用上下文無關語法來解析它。認識到你需要一個CFG在這裏是一個很大的步驟,但從CFG到分析算法可能有點棘手。

爲了解析這個表達式,我建議使用兩步法,就像在編譯器中找到的方法一樣。首先,你要將標記爲這個字符串變成一組邏輯單元。也就是說,你的字符串

(1 + 6) * 7 

轉換成列表

["(", "1", "+", "6", ")", "*", "7"] 

有很多方法可以做到這一步。你可以編寫一個手動標記器,或者使用一組正則表達式來分割字符串。此時,您可以檢測到詞彙錯誤,您在此報告該字符串是否包含任何不應存在的內容。例如,字符「,」在任何這些表達式中都沒有業務,您可以在這裏檢測到。

將字符串標記後,您會想要解析標記流以驗證其是否有效,並可選擇爲數學表達式構建適當的內部表示形式。其中最着名的(也是最簡單的)算法是Dijkstra's Shunting-Yard algorithm,您可以在一個小時內輕鬆寫出。如果您對解析這些表達式的算法更重量級感興趣,您應該考慮查看解析器生成器,它能夠處理更復雜的表達式。如果你想做解析客戶端,快速搜索出現this LALR(1) parser generator for JavaScript。如果您想處理服務器上的解析,請考慮查看野牛或ANTLR工具,它們是非常強大的解析器生成器。

希望這會有所幫助!

+0

好的答案謝謝 –