1

嘿,我用 JavaScript 和 HTML5 编写了一个分形生成程序(这里是链接),这是一个大约 2 年的过程,包括我对复杂数学和分形方程所做的所有研究,我正在寻找更新界面,因为人们看起来很吓人。在查看代码时,我注意到我做事的一些旧技术非常低效,例如我的Complex.parseFunction

我正在寻找一种方法来使用 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))))));
}

我知道如何使用 RegExp 来处理String.prototype.replace所有这些,我所需要的只是 RegExp 本身。请注意,它应该能够通过注意它是否直接在a之后来区分减法运算符(例如“CZ^2”)和负函数(例如“i*-(Z^2+C)”)变量或运算符。

4

1 回答 1

2

虽然您可以将正则表达式用作表达式解析器的一部分,例如分解标记,但正则表达式不具备解析正确嵌套的数学表达式的计算能力。这本质上是计算理论的核心结果之一(有限状态自动机与下推自动机)。您可能想查看诸如递归下降或 LR 解析之类的内容。

如果你只做一次,我也不会太担心解析表达式的效率。鉴于您正在做的所有其他数学运算,我怀疑它是否重要。

于 2012-12-16T21:04:04.343 回答