#include <iostream>
#include <cctype>
using namespace std;
bool eval_expr(const char **pe, int &lhs, bool inside = false);
char skip_ws(const char **pe) {
while (**pe == ' ') ++(*pe);
return **pe;
}
bool eval_prim(const char **pe, int &res) {
char c = skip_ws(pe);
if (c == '(') {
++(*pe);
if (!eval_expr(pe, res, true)) return false;
++(*pe);
return true;
}
if (isdigit(c)) {
res = 0;
while (isdigit(c)) {
res = 10*res + c - '0';
c = *(++(*pe));
}
return true;
}
return false;
}
bool eval_expr(const char **pe, int &lhs, bool inside) {
if (!eval_prim(pe, lhs)) return false;
char op;
while ((op = skip_ws(pe)) && (op == '+' || op == '-' || op == '*' || op == '/')) {
++(*pe);
int rhs;
if (!eval_prim(pe, rhs)) return false;
switch (op) {
case '+': lhs += rhs; break;
case '-': lhs -= rhs; break;
case '*': lhs *= rhs; break;
case '/': lhs /= rhs; break;
}
}
return inside ? op == ')' : !op;
}
bool evaluate(const char *e, int &result) {
return eval_expr(&e, result);
}
int main() {
int res;
if (evaluate("2", res)) {
cout << res << endl;
} else {
cout << "invalid" << endl;
}
if (evaluate("2+3", res)) {
cout << res << endl;
} else {
cout << "invalid" << endl;
}
if (evaluate("2*3-4", res)) {
cout << res << endl;
} else {
cout << "invalid" << endl;
}
if (evaluate("(1+2)+5", res)) {
cout << res << endl;
} else {
cout << "invalid" << endl;
}
if (evaluate("", res)) {
cout << res << endl;
} else {
cout << "invalid" << endl;
}
if (evaluate("2+", res)) {
cout << res << endl;
} else {
cout << "invalid" << endl;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2N0eXBlPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiAgICBib29sIGV2YWxfZXhwcihjb25zdCBjaGFyICoqcGUsIGludCAmbGhzLCBib29sIGluc2lkZSA9IGZhbHNlKTsKICAgIGNoYXIgc2tpcF93cyhjb25zdCBjaGFyICoqcGUpIHsKICAgICAgICB3aGlsZSAoKipwZSA9PSAnICcpICsrKCpwZSk7CiAgICAgICAgcmV0dXJuICoqcGU7CiAgICB9CiAgICBib29sIGV2YWxfcHJpbShjb25zdCBjaGFyICoqcGUsIGludCAmcmVzKSB7CiAgICAgICAgY2hhciBjID0gc2tpcF93cyhwZSk7CiAgICAgICAgaWYgKGMgPT0gJygnKSB7CiAgICAgICAgICAgICsrKCpwZSk7CiAgICAgICAgICAgIGlmICghZXZhbF9leHByKHBlLCByZXMsIHRydWUpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICsrKCpwZSk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoaXNkaWdpdChjKSkgewogICAgICAgICAgICByZXMgPSAwOwogICAgICAgICAgICB3aGlsZSAoaXNkaWdpdChjKSkgewogICAgICAgICAgICAgICAgcmVzID0gMTAqcmVzICsgYyAtICcwJzsKICAgICAgICAgICAgICAgIGMgPSAqKCsrKCpwZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBib29sIGV2YWxfZXhwcihjb25zdCBjaGFyICoqcGUsIGludCAmbGhzLCBib29sIGluc2lkZSkgewogICAgICAgIGlmICghZXZhbF9wcmltKHBlLCBsaHMpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgY2hhciBvcDsKICAgICAgICB3aGlsZSAoKG9wID0gc2tpcF93cyhwZSkpICYmIChvcCA9PSAnKycgfHwgb3AgPT0gJy0nIHx8IG9wID09ICcqJyB8fCBvcCA9PSAnLycpKSB7CiAgICAgICAgICAgICsrKCpwZSk7CiAgICAgICAgICAgIGludCByaHM7CiAgICAgICAgICAgIGlmICghZXZhbF9wcmltKHBlLCByaHMpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIHN3aXRjaCAob3ApIHsKICAgICAgICAgICAgICAgIGNhc2UgJysnOiBsaHMgKz0gcmhzOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJy0nOiBsaHMgLT0gcmhzOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJyonOiBsaHMgKj0gcmhzOyBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJy8nOiBsaHMgLz0gcmhzOyBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaW5zaWRlID8gb3AgPT0gJyknIDogIW9wOwogICAgfQoKICAgIGJvb2wgZXZhbHVhdGUoY29uc3QgY2hhciAqZSwgaW50ICZyZXN1bHQpIHsKICAgICAgICByZXR1cm4gZXZhbF9leHByKCZlLCByZXN1bHQpOwogICAgfQoKaW50IG1haW4oKSB7CiAgICBpbnQgcmVzOwogICAgaWYgKGV2YWx1YXRlKCIyIiwgcmVzKSkgewogICAgICAgIGNvdXQgPDwgcmVzIDw8IGVuZGw7CiAgICB9IGVsc2UgewogICAgICAgIGNvdXQgPDwgImludmFsaWQiIDw8IGVuZGw7CiAgICB9CiAgICBpZiAoZXZhbHVhdGUoIjIrMyIsIHJlcykpIHsKICAgICAgICBjb3V0IDw8IHJlcyA8PCBlbmRsOwogICAgfSBlbHNlIHsKICAgICAgICBjb3V0IDw8ICJpbnZhbGlkIiA8PCBlbmRsOwogICAgfQogICAgaWYgKGV2YWx1YXRlKCIyKjMtNCIsIHJlcykpIHsKICAgICAgICBjb3V0IDw8IHJlcyA8PCBlbmRsOwogICAgfSBlbHNlIHsKICAgICAgICBjb3V0IDw8ICJpbnZhbGlkIiA8PCBlbmRsOwogICAgfQogICAgaWYgKGV2YWx1YXRlKCIoMSsyKSs1IiwgcmVzKSkgewogICAgICAgIGNvdXQgPDwgcmVzIDw8IGVuZGw7CiAgICB9IGVsc2UgewogICAgICAgIGNvdXQgPDwgImludmFsaWQiIDw8IGVuZGw7CiAgICB9CiAgICBpZiAoZXZhbHVhdGUoIiIsIHJlcykpIHsKICAgICAgICBjb3V0IDw8IHJlcyA8PCBlbmRsOwogICAgfSBlbHNlIHsKICAgICAgICBjb3V0IDw8ICJpbnZhbGlkIiA8PCBlbmRsOwogICAgfQogICAgaWYgKGV2YWx1YXRlKCIyKyIsIHJlcykpIHsKICAgICAgICBjb3V0IDw8IHJlcyA8PCBlbmRsOwogICAgfSBlbHNlIHsKICAgICAgICBjb3V0IDw8ICJpbnZhbGlkIiA8PCBlbmRsOwogICAgfQogICAgcmV0dXJuIDA7Cn0=