RegEx用于解析数学表达式?

时间:2012-12-16 20:53:15

标签: javascript regex math string-parsing

嘿,我用JavaScript和HTML5编写了一个分形生成程序(here's the link),这是一个大约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))))));
}

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

1 个答案:

答案 0 :(得分:2)

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

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