2012-12-04 3 views
0

감산 + 3 " 이 문자열을 두 개의 하위 문자열로 나누고 특정 작업을 수행하려고합니다.자바 : 계산기 BNF는 AST는 추가 & I 예 문자열 S = "3 같이 IndexOf() lastIndexOf에서도()</p> <p>를 사용하여 추가 수행에있어서, 감산</p> <p>물품려고

// 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

먼저 각 피연산자와 연산에 대해 별도의 필드를 사용하는 것이 좋습니다. 이렇게하면 아무 것도 나누지 않고 숫자를 구문 분석 할 수 있습니다.

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 
+0

대단히 감사합니다 !!! – hibc

1

당신이 할 수있는 일은 처음에는 당신의 문자열을 통과하고, doo operations arthmetics (즉 "1 + -1"-> "1-1", "1--1"-> "1 + 1" 등) 다음 작업과 함께 작동합니다.

+0

대단히 감사합니다. – hibc

1

나는 +와 - 각각을 2 개의 다른 연산자, 2 진수 연산자 및 단항 연산자로 취급합니다. 표현식의 시작 부분이나 다른 연산자 뒤에 "-"가 표시되면 단항입니다. 두 표현식 사이에서이를 볼 경우 이진입니다. AST 형식에서는 단 하나의 자식이 있고, 2 진수는 두 개의 자식이 있습니다.

+0

대단히 고마워요! – hibc

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

+1

대단히 감사합니다 !! 비록 당신의 코드가 사용하기에는 너무 앞서 보인다. @ _ @ – hibc

+0

ScriptEngineManager는 Java에서 버전 1.6부터 추가 된 클래스입니다. 그래서 당신은 쉽게 당신의 사용을 위해이 하나를 사용할 수 있습니다! –