class Source {
private int pos;
this.str = str;
}
public final int peek() {
if (pos < str.length()) {
return str.charAt(pos);
}
return -1;
}
public final void next() {
++pos;
}
}
super(str);
}
public final int number() {
StringBuilder sb = new StringBuilder();
int ch;
while ((ch
= peek
()) >= 0 && Character.
isDigit(ch
)) { sb.append((char) ch);
next();
}
return Integer.
parseInt(sb.
toString()); }
// expr = term, {("+", term) | ("-", term)}
public final int expr() {
int x = term();
for (;;) {
switch (peek()) {
case '+':
next();
x += term();
continue;
case '-':
next();
x -= term();
continue;
}
break;
}
return x;
}
// term = factor, {("*", factor) | ("/", factor)}
public final int term() {
int x = factor();
for (;;) {
switch (peek()) {
case '*':
next();
x *= factor();
continue;
case '/':
next();
x /= factor();
continue;
}
break;
}
return x;
}
// factor = factor = [spaces], ("(", expr, ")") | number, [spaces]
public final int factor() {
int ret;
spaces();
if (peek() == '(') {
next();
ret = expr();
if (peek() == ')') {
next();
}
} else {
ret = number();
}
spaces();
return ret;
}
public void spaces() {
while (peek() == ' ') {
next();
}
}
}
public class Main {
}
public static void main
(String[] args
) { test("1 + 2" );
test("123" );
test("1 + 2 + 3" );
test("1 - 2 - 3" );
test("1 - 2 + 3" );
test("2 * 3 + 4" );
test("2 + 3 * 4" );
test("100 / 10 / 2" );
test("( 2 + 3 ) * 4");
}
}
Y2xhc3MgU291cmNlIHsKCiAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzdHI7CiAgICBwcml2YXRlIGludCBwb3M7CgogICAgcHVibGljIFNvdXJjZShTdHJpbmcgc3RyKSB7CiAgICAgICAgdGhpcy5zdHIgPSBzdHI7CiAgICB9CgogICAgcHVibGljIGZpbmFsIGludCBwZWVrKCkgewogICAgICAgIGlmIChwb3MgPCBzdHIubGVuZ3RoKCkpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5jaGFyQXQocG9zKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHB1YmxpYyBmaW5hbCB2b2lkIG5leHQoKSB7CiAgICAgICAgKytwb3M7CiAgICB9Cn0KCmNsYXNzIFBhcnNlciBleHRlbmRzIFNvdXJjZSB7CgogICAgcHVibGljIFBhcnNlcihTdHJpbmcgc3RyKSB7CiAgICAgICAgc3VwZXIoc3RyKTsKICAgIH0KCiAgICBwdWJsaWMgZmluYWwgaW50IG51bWJlcigpIHsKICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICBpbnQgY2g7CiAgICAgICAgd2hpbGUgKChjaCA9IHBlZWsoKSkgPj0gMCAmJiBDaGFyYWN0ZXIuaXNEaWdpdChjaCkpIHsKICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSBjaCk7CiAgICAgICAgICAgIG5leHQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoc2IudG9TdHJpbmcoKSk7CiAgICB9CgogICAgLy8gZXhwciA9IHRlcm0sIHsoIisiLCB0ZXJtKSB8ICgiLSIsIHRlcm0pfQogICAgcHVibGljIGZpbmFsIGludCBleHByKCkgewogICAgICAgIGludCB4ID0gdGVybSgpOwogICAgICAgIGZvciAoOzspIHsKICAgICAgICAgICAgc3dpdGNoIChwZWVrKCkpIHsKICAgICAgICAgICAgICAgIGNhc2UgJysnOgogICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgICAgICB4ICs9IHRlcm0oKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgICAgICAgICB4IC09IHRlcm0oKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHg7CiAgICB9CgogICAgLy8gdGVybSA9IGZhY3RvciwgeygiKiIsIGZhY3RvcikgfCAoIi8iLCBmYWN0b3IpfQogICAgcHVibGljIGZpbmFsIGludCB0ZXJtKCkgewogICAgICAgIGludCB4ID0gZmFjdG9yKCk7CiAgICAgICAgZm9yICg7OykgewogICAgICAgICAgICBzd2l0Y2ggKHBlZWsoKSkgewogICAgICAgICAgICAgICAgY2FzZSAnKic6CiAgICAgICAgICAgICAgICAgICAgbmV4dCgpOwogICAgICAgICAgICAgICAgICAgIHggKj0gZmFjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICBjYXNlICcvJzoKICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgeCAvPSBmYWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHg7CiAgICB9CgogICAgLy8gZmFjdG9yID0gZmFjdG9yID0gW3NwYWNlc10sICgiKCIsIGV4cHIsICIpIikgfCBudW1iZXIsIFtzcGFjZXNdCiAgICBwdWJsaWMgZmluYWwgaW50IGZhY3RvcigpIHsKICAgICAgICBpbnQgcmV0OwogICAgICAgIHNwYWNlcygpOwogICAgICAgIGlmIChwZWVrKCkgPT0gJygnKSB7CiAgICAgICAgICAgIG5leHQoKTsKICAgICAgICAgICAgcmV0ID0gZXhwcigpOwogICAgICAgICAgICBpZiAocGVlaygpID09ICcpJykgewogICAgICAgICAgICAgICAgbmV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0ID0gbnVtYmVyKCk7CiAgICAgICAgfQogICAgICAgIHNwYWNlcygpOwogICAgICAgIHJldHVybiByZXQ7CiAgICB9CgogICAgcHVibGljIHZvaWQgc3BhY2VzKCkgewogICAgICAgIHdoaWxlIChwZWVrKCkgPT0gJyAnKSB7CiAgICAgICAgICAgIG5leHQoKTsKICAgICAgICB9CiAgICB9Cn0KCnB1YmxpYyBjbGFzcyBNYWluIHsKCiAgICBzdGF0aWMgdm9pZCB0ZXN0KFN0cmluZyBzKSB7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHMgKyAiID0gIiArIG5ldyBQYXJzZXIocykuZXhwcigpKTsKICAgIH0KCiAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CiAgICAgICAgdGVzdCgiMSArIDIiICAgICAgICApOwogICAgICAgIHRlc3QoIjEyMyIgICAgICAgICAgKTsKICAgICAgICB0ZXN0KCIxICsgMiArIDMiICAgICk7CiAgICAgICAgdGVzdCgiMSAtIDIgLSAzIiAgICApOwogICAgICAgIHRlc3QoIjEgLSAyICsgMyIgICAgKTsKICAgICAgICB0ZXN0KCIyICogMyArIDQiICAgICk7CiAgICAgICAgdGVzdCgiMiArIDMgKiA0IiAgICApOwogICAgICAgIHRlc3QoIjEwMCAvIDEwIC8gMiIgKTsKICAgICAgICB0ZXN0KCIoIDIgKyAzICkgKiA0Iik7CiAgICB9Cn0K