队友的nb代码,学习一下。
#include <bits/stdc++.h>
using namespace std;
const int MAXS = 100;
using sss = stringstream;
char buf[MAXS];
int parseOr(sss& ss);
int parseInt(sss& ss) {
int ret;
ss >> ret;
return ret;
}
int parseBracket(sss& ss) {
if (ss.peek() == '(') {
ss.get();
int x = parseOr(ss);
ss.get();
return x;
}
return parseInt(ss);
}
int parseSign(sss& ss) {
char op = ss.peek();
if (op == '+') {
ss.get();
return parseSign(ss);
}
if (op == '-') {
ss.get();
return -parseSign(ss);
}
if (op == '~') {
ss.get();
return ~parseSign(ss);
}
return parseBracket(ss);
}
int parseMul(sss& ss) {
int ret = parseSign(ss);
if (ss.peek() == '*') ss.get(), ret = ret * parseMul(ss);
return ret;
}
int parseAdd(sss& ss) {
int ret = parseMul(ss);
while (true) {
char op = ss.peek();
if (op != '+' && op != '-') break;
ss.get();
int x = parseMul(ss);
if (op == '+')
ret += x;
else
ret -= x;
}
return ret;
}
int parseAnd(sss& ss) {
int ret = parseAdd(ss);
if (ss.peek() == '&') ss.get(), ret &= parseAnd(ss);
return ret;
}
int parseXor(sss& ss) {
int ret = parseAnd(ss);
if (ss.peek() == '^') ss.get(), ret ^= parseXor(ss);
return ret;
}
int parseOr(sss& ss) {
int ret = parseXor(ss);
if (ss.peek() == '|') ss.get(), ret |= parseOr(ss);
return ret;
}
int main() {
string s;
cin >> s;
sss ss(s);
printf("%d\n", parseOr(ss));
}