Как проанализировать математическое выражение, данное как строка, и возвратить число? [дубликат]

IIUC, дерево выражений подобно Абстрактному синтаксическому дереву, но выражение обычно yiels единственное значение, тогда как AST может представить всю программу (с классами, пакетами, функцией, операторами, и т.д.)

Так или иначе, для выражение (2 + 3) * 5, дерево:

    *
   / \ 
  +   5
 / \
2   3

Оценивают каждый узел рекурсивно (вверх дном) для получения значения в корневом узле, т.е. значения выражения.

Вы можете, конечно, иметь унарный (отрицание) или trinary (if-then-else) операторы также и функции (не, т.е. любое число операции в секунду), если Ваш язык выражения позволяет его.

типы Оценки и выполнение управления типа сделан по подобным деревьям.

39
задан Mark Rotteveel 3 October 2015 в 07:59
поделиться

4 ответа

Вы можете передать его в BeanShell bsh.Interpreter , примерно так:

Interpreter interpreter = new Interpreter();
interpreter.eval("result = 5+4*(7-15)");
System.out.println(interpreter.get("result"));

Вы должны убедиться, что строка, которую вы оцениваете, взята из надежный источник и обычные меры предосторожности, но в противном случае он будет работать сразу.

Если вы хотите использовать более сложный (но более безопасный) подход, вы можете использовать ANTLR (который, как я подозреваю, имеет математическую грамматику как отправная точка) и фактически составьте / интерпретируйте утверждение самостоятельно.

33
ответ дан 27 November 2019 в 02:27
поделиться

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.

5
ответ дан 27 November 2019 в 02:27
поделиться

Нет встроенного способа сделать это. Но вы можете использовать один из многих калькуляторов с открытым исходным кодом .

4
ответ дан 27 November 2019 в 02:27
поделиться

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).

1
ответ дан 27 November 2019 в 02:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: