java:计算器,BNF,AST添加&减法

时间:2012-12-04 10:00:48

标签: java substring abstract-syntax-tree indexof bnf

我正在尝试编写一个执行加法和减法的方法

使用indexOf(),lastIndexOf()

例如string 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 个答案:

答案 0 :(得分:1)

你能做的是,首先通过你的字符串,然后操作关节炎(即“1 + -1” - >“1-1”,“1--1” - >“1 + 1 “等)然后使用操作

答案 1 :(得分:1)

我将每个+和 - 视为两个不同的运算符,二元运算符和一元运算符。如果在表达式的开头看到“ - ”,或者在另一个运算符之后看到“ - ”,则它是一元 - 。如果你在两个表达式之间看到它,它就是二进制 - 。在AST形式中,一元 - 有一个孩子,二元 - 有两个孩子。

答案 2 :(得分:1)

首先,我建议为每个操作数和操作使用单独的字段,这样你就不必拆分任何东西,只需解析数字。

有一些叫做正则表达式的东西,虽然它有点高级,它可以让你使用String.split()方法更容易地完成这些操作,这个方法将一个正则表达式作为参数并将拆分的字符串作为数组返回, instance(“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

答案 3 :(得分: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>

ScriptEngine engine = manager.getEngineByName("js");<br> Object result = engine.eval("3+ -4");<br> System.out.println(result);<br>

输出: -1.0

OR

使用BeanShell http://www.beanshell.org/download.html

Interpreter interpreter = new Interpreter();

interpreter.eval("result = 3+-4");<br>
System.out.println(interpreter.get("result"));<br>
OUTPUT: -1