求解包含变量的数学表达式

时间:2015-05-19 22:48:34

标签: java math

如何动态解析包含变量的数学表达式(可能会多次出现)。

只需要基本操作符(+ - * /)

示例表达式(x = 10):

4x * (4 - (8 / 4)) + (5x - (2 * 3))

3 个答案:

答案 0 :(得分:4)

Shunting Yard algorithm是解析数学中缀表达式的标准算法。

答案 1 :(得分:1)

我已经多次这样做了,但是最好的方法往往随着每个主要版本的Java而改变。做好准备,这是满口的。

对于这样的事情,我鼓励你看看java.util.function。我会通过设置每个运算符(* / + - )到BiFunction的映射来描述如何执行它。您还需要一个优先顺序,因此+没有给出比*更高的操作顺序。

接下来,您将要构建一个正则表达式,用于提取括号的内部内容,而不包括括号本身。构造一个操作符及其操作数的树,以便将其转换为反向抛光表示法;一次做这个最里面的括号 - 设置。一旦您有一组有序的BiFunction操作并且可以检索数值,请将括号替换为值,然后再次扫描,直到没有括号。然后,通过独立解决它来完成这件事。

像我说的那样,满口;但你基本上是在看一个无上下文的语法。如果你想要更多的细节和很多示例代码(用Java),我现在正在写一本关于此的书。您可以在https://michaelericoberlin.wordpress.com/category/software-language-engineering/

找到很多我的初始材料,无论是最终编辑

祝你好运,我知道这比看起来要大得多。

答案 2 :(得分:0)

您可以为表达式编写解析器。一旦您拥有表达式语言的Recursive Descent Parser定义,BNF就可以非常简单地实现:

expression  :  '-'? term (( '+' | '-' ) term)*
      term  :  factor (('*' | '/') factor)*
    factor  :  NUMBER | VAR | '(' expression ')'

    NUMBER  :  ('0'..'9')+
       VAR  :  'a'..'z'