public class Calc2 {
Token input;
int pos;
String tok;
public Calc2(String s) {
input = new Token(s, " \t()+*/%");
}
public void init() {
next();
}
public double parse() {
return addsub();
}
double addsub() {
double left = muldiv();
while (true) {
char ch =
input.tok.charAt(0);
if (ch == '+') {
debug("addsub:add");
next();
left += muldiv();
} else if (ch == '-') {
debug("addsub:sub");
next();
left -= muldiv();
} else {
debug("addsub:other > " + input.tok);
break;
}
}
return left;
}
double muldiv() {
double left = element();
while (true) {
char ch =
input.tok.charAt(0);
if (ch == '*') {
debug("muldiv:mul");
next();
left *= element();
} else if (ch == '/') {
debug("muldiv:div");
next();
left /= element();
} else if (ch == '%') {
debug("muldiv:mod");
next();
left %= element();
} else {
debug("muldiv:other > " + input.tok);
break;
}
}
return left;
}
void debug(String s) {
//System.out.println("DEBUG:"+s);
}
void next() {
while (input.hasNext()) {
if (isSpace(input.next()))
{
continue;
} else {
return ;
}
}
}
double element() {
double res = 0;
while (true) {
char ch =
input.tok.charAt(0);
if (ch == '(') {
debug("element:lpar");
next();
res = addsub();
char ch2 =
input.tok.charAt(0);
if (ch2 != ')') {
throw new
RuntimeException(") required.");
}
next();
} else {
debug("element:element");
try {
res =
Double.valueOf(input.tok).doubleValue();
next();
} catch
(NumberFormatException e) {
// 記号
}
break;
}
}
return res;
}
public void parseAndResult() {
input.reset();
init();
double d = parse();
System.out.println(input.getString() + " = " + d);
}
public void print() {
while (input.hasNext()) {
String ss = input.next();
if (isSpace(ss)) continue;
debug("RES:'" + ss + "'");
}
}
boolean isSpace(String ss) {
if (ss.length() == 1 &&
(ss.charAt(0) == ' ' || ss.charAt(0) == '\t'))
return true;
return false;
}
public static class Token {
char[] de;
char[] in;
int pos;
String tok;
String org;
public Token(String s, String de)
{
org = s;
in = s.toCharArray();
this.de =
de.toCharArray();
pos = 0;
}
public void reset() {
pos = 0;
tok = null;
}
public String getString() {
return org;
}
public boolean hasNext() {
return pos < in.length;
}
public String next() {
StringBuffer sb = new
StringBuffer();
while (pos < in.length) {
char ch =
in[pos++];
if (match(ch)) {
if
(sb.length() > 0) {
pos--;
break;
} else {
sb.append(ch);
break;
}
} else {
sb.append(ch);
}
}
// System.out.println("SB=>"
+ sb.toString());
tok = sb.toString();
return tok;
}
boolean match(char ch) {
for (char cc : de) {
if (cc == ch) {
return
true;
}
}
return false;
}
}
public static void main(String[] args) {
Calc2 c = new Calc2(args[0]);
c.print();
c.parseAndResult();
}
}
/*
使い方:
java Calc2 "1+2+3+4*50"
*/