2012-12-16 46 views
1

嗨我寫了一個分形生成程序的JavaScript和HTML5(here's the link),這是一個爲期約2年的過程,包括我對複數學和分形方程所做的所有研究,並且我正在尋找更新界面,對於人們來說,這是相當嚇人的。在查看代碼的同時,我發現我的一些舊技術非常低效,比如我的Complex.parseFunction用於解析數學表達式的RegExp?

我正在尋找一種方法來使用RegExp解析表達式的組件,如函數,運算符和變量,以及實現表達式的正確操作順序。下面的例子可能證明我的意思:

//the first example parses an expression with two variables and outputs to string 
console.log(Complex.parseFunction("i*-sinh(C-Z^2)", ["Z","C"], false)) 

"Complex.I.mult(Complex.neg(Complex.sinh(C.sub(Z.cPow(new Complex(2,0,2,0))))))" 

//the second example parses the same expression but outputs to function 
console.log(Complex.parseFunction("i*-sinh(C-Z^2)", ["Z","C"], true)) 

function(Z,C){ 
    return Complex.I.mult(Complex.neg(Complex.sinh(C.sub(Z.cPow(new Complex(2,0,2,0)))))); 
} 

我知道如何使用正則表達式和String.prototype.replace所有的處理,所有我需要的是正則表達式本身。請注意,它應該能夠通過注意它是否直接位於一個後面來區分減法運算符(例如「CZ^2」)和負函數(例如「i * - (Z^2 + C)」)變量或運算符分別。

+2

我的建議是不使用正則表達式這樣的事情。這樣的問題(如果可能的話)的正則表達式必須非常複雜,很難讀取和維護,甚至可能比其他解析方法更差。你可能想要使用正則表達式來分析已知可用於特定角色的字符串的小部分,但根據我的經驗,這種通用和全面情況的正則表達式通常不是要走的路。 –

+0

我見過用於將整個URL解析爲URI格式的正則表達式,並且它們完美高效地工作。這並沒有太大的不同。是的,我知道RegExp本身很難創建,但它**會更有效地解析表達式。 –

回答

2

雖然可以使用正則表達式作爲表達式解析器的一部分,例如打破標記,但正則表達式不具備解析正確嵌套的數學表達式的計算能力。這實質上是計算理論的核心結果之一(有限狀態自動機與下推自動機)。你可能想看看像遞歸下降或LR解析。

我也不會過分擔心解析表達式的效率,只要你只做一次。鑑於你正在做的其他數學,我懷疑它是物質。

+0

你能詳細解釋一下LR解析嗎?我對此並不熟悉。 –

+1

http://en.wikipedia.org/wiki/LR_parser – acjay

+0

它只是一種生成解析器的方法。甚至可能有工具可用於從表達式語法的描述中生成代碼。當然,對於很多其他語言,但我不知道JavaScript的一個手。如果寫你自己的,從遞歸下降開始 - 這更容易理解。通常這些東西在編譯器或語言理論的書籍中都有涉及。 – DrC