IIUC, дерево выражений подобно Абстрактному синтаксическому дереву, но выражение обычно yiels единственное значение, тогда как AST может представить всю программу (с классами, пакетами, функцией, операторами, и т.д.)
Так или иначе, для выражение (2 + 3) * 5, дерево:
*
/ \
+ 5
/ \
2 3
Оценивают каждый узел рекурсивно (вверх дном) для получения значения в корневом узле, т.е. значения выражения.
Вы можете, конечно, иметь унарный (отрицание) или trinary (if-then-else) операторы также и функции (не, т.е. любое число операции в секунду), если Ваш язык выражения позволяет его.
типы Оценки и выполнение управления типа сделан по подобным деревьям.
Вы можете передать его в BeanShell bsh.Interpreter
, примерно так:
Interpreter interpreter = new Interpreter();
interpreter.eval("result = 5+4*(7-15)");
System.out.println(interpreter.get("result"));
Вы должны убедиться, что строка, которую вы оцениваете, взята из надежный источник и обычные меры предосторожности, но в противном случае он будет работать сразу.
Если вы хотите использовать более сложный (но более безопасный) подход, вы можете использовать ANTLR (который, как я подозреваю, имеет математическую грамматику как отправная точка) и фактически составьте / интерпретируйте утверждение самостоятельно.
Probably not in as straight forward a manner as you are hoping!
But perhaps you could use a javax.script.ScriptEngine and treat the string as a ECMAScript expression, for example?
Take a look at: Scripting for the Java Platform.
Нет встроенного способа сделать это. Но вы можете использовать один из многих калькуляторов с открытым исходным кодом .
There is no direct support in the Java SDK for doing this.
You will either have to implement it yourself (possibly using a parser generator such as JavaCC), or use an existing library.
One option would be JEP (commercial), another JEval (free software).