如何动态解析包含变量的数学表达式(可能会多次出现)。
只需要基本操作符(+ - * /)
。
示例表达式(x = 10
):
4x * (4 - (8 / 4)) + (5x - (2 * 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'