Java: калькулятор, BNF, AST сложение и вычитание
Я пытаюсь написать метод, который делает сложение и вычитание
используя indexOf(), lastIndexOf()
например, строка s = "3 + 3" Я хочу разбить эту строку на две подстроки, затем выполнить определенную операцию.
// for addition
String s = "3 + 3";
int indexOfPlus = s.indexOf('+');
String beforePlus = s.substring(0,indexOfPlus);
String afterPlus= s.substring(indexOfPlus+1);
.....
.....
// for subtraction
String s = "3 - 3";
int indexOfMinus = s.indexOf('-');
String beforeMinus = s.substring(0,indexOfMinus);
String afterMinus = s.substring(indexOfMinus+1);
....
....
МОЙ ВОПРОС: Однако я не уверен, как мне разбить строку, такую как "3+ -1" или "3 +1", на подстроки.
4 ответа
Прежде всего, я бы посоветовал использовать отдельные поля для каждого операнда и операции, так что вам не придется ничего разбивать и просто разбирать числа.
есть что-то, называемое regex, хотя оно немного продвинуто и позволит вам намного проще выполнять эти операции с помощью метода String.split(), этот метод принимает регулярное выражение в качестве параметра и возвращает разделенные строки как массив, например ("5+5"). Split("[-+]") вернет 5 и 5 каждый в виде строки.
using indexOf only I would do something like this (for "3- +1"):
int i1,i2;
String op;
i1 = s.indexOf("-");
i2= s.indexOf("+");
if ( i1<0 || i2<0)
//only one operation
else if(i1<i2)
//minus logic;
else if (i2<i1)
// plus logic
Я бы рассматривал каждый из + и - как два разных оператора, бинарный оператор и унарный оператор. Если вы видите "-" в начале выражения или после другого оператора, это унарный символ. Если вы видите это между двумя выражениями, это двоичный код. В форме AST унарный - имеет одного ребенка, двоичный - имеет двух детей.
То, что вы могли бы сделать, это сначала пройтись по вашей строке и выполнить операции doo (т.е. "1+-1" -> "1-1", "1--1" -> "1+1" и т. д.), затем с операциями
Используйте javax.script.ScriptEngineManager:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");<br> Object result = engine.eval("3+ -4");<br> System.out.println(result);<br>
ВЫХОД: -1.0
ИЛИ ЖЕ
Используйте BeanShell http://www.beanshell.org/download.html
Interpreter interpreter = new Interpreter();
interpreter.eval("result = 3+-4");<br> System.out.println(interpreter.get("result"));<br>
ВЫХОД: -1