double symbol() {
if (nextToken() == '(') {
expression();
if (nextToken() != ')'
throw error;
} else {
return getNumber();
}
}
double dice() {
double n = symbol();
do {
if (nextToken() == 'd') {
return rolldice(n, dice());
else
break;
}while(1);
return n;
}
double factor() {
double n = dice();
do {
if (nextToken() == '*') {
n*=factor();
else if (nextToken() == '/') {
double r = factor();
if (r==0)
throw div0;
n/=r;
else if (nextToken() == '%') {
double r = factor();
if (r==0)
throw div0;
n%=r;
} else
return break;
}while(1);
return n;
}
double term() {
double n = factor();
do {
if (nextToken() == '+') {
n+=term();
else if (nextToken() == '-') {
n-=term();
else
break;
} while(1);
return n;
}
double parse() {
return term();
}
ZG91YmxlIHN5bWJvbCgpIHsKICAgIGlmIChuZXh0VG9rZW4oKSA9PSAnKCcpIHsKICAgICAgICBleHByZXNzaW9uKCk7CiAgICAgICAgaWYgKG5leHRUb2tlbigpICE9ICcpJwogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGdldE51bWJlcigpOwogICAgfSAgICAgICAgCn0KCmRvdWJsZSBkaWNlKCkgewogICAgZG91YmxlIG4gPSBzeW1ib2woKTsKICAgIGRvIHsKICAgICAgICBpZiAobmV4dFRva2VuKCkgPT0gJ2QnKSB7CiAgICAgICAgICAgIHJldHVybiByb2xsZGljZShuLCBkaWNlKCkpOwogICAgICAgIGVsc2UgCiAgICAgICAgICAgIGJyZWFrOwogICAgfXdoaWxlKDEpOwogICAgcmV0dXJuIG47Cn0KCmRvdWJsZSBmYWN0b3IoKSB7CiAgICBkb3VibGUgbiA9IGRpY2UoKTsKICAgIGRvIHsKICAgICAgICBpZiAobmV4dFRva2VuKCkgPT0gJyonKSB7CiAgICAgICAgICAgIG4qPWZhY3RvcigpOwogICAgICAgIGVsc2UgaWYgKG5leHRUb2tlbigpID09ICcvJykgewogICAgICAgICAgICBkb3VibGUgciA9IGZhY3RvcigpOwogICAgICAgICAgICBpZiAocj09MCkKICAgICAgICAgICAgICAgIHRocm93IGRpdjA7CiAgICAgICAgICAgIG4vPXI7CiAgICAgICAgZWxzZSBpZiAobmV4dFRva2VuKCkgPT0gJyUnKSB7CiAgICAgICAgICAgIGRvdWJsZSByID0gZmFjdG9yKCk7CiAgICAgICAgICAgIGlmIChyPT0wKQogICAgICAgICAgICAgICAgdGhyb3cgZGl2MDsKICAgICAgICAgICAgbiU9cjsKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgcmV0dXJuIGJyZWFrOwogICAgIH13aGlsZSgxKTsKICAgICByZXR1cm4gbjsKfQoKZG91YmxlIHRlcm0oKSB7CiAgICBkb3VibGUgbiA9IGZhY3RvcigpOwogICAgZG8gewogICAgICAgIGlmIChuZXh0VG9rZW4oKSA9PSAnKycpIHsKICAgICAgICAgICAgIG4rPXRlcm0oKTsKICAgICAgICAgZWxzZSBpZiAobmV4dFRva2VuKCkgPT0gJy0nKSB7CiAgICAgICAgICAgICBuLT10ZXJtKCk7CiAgICAgICAgIGVsc2UKICAgICAgICAgICAgIGJyZWFrOwogICAgfSB3aGlsZSgxKTsKICAgIHJldHVybiBuOwp9Cgpkb3VibGUgcGFyc2UoKSB7CiAgICByZXR1cm4gdGVybSgpOwp9