// 構文解析セット typedef string::const_iterator State; class ParseError {}; ll number(State &begin) { ll ret = 0; while (isdigit(*begin)) { ret *= 10; ret += *begin - '0'; begin++; } return ret; } ll term(State &begin) { ll ret = number(begin); for (;;) { if (*begin == '*') { begin++; ret *= number(begin); } else if (*begin == '/') { begin++; ret /= number(begin); } else { break; } } return ret; } ll expression(State &begin) { ll ret = term(begin); for (;;) { if (*begin == '+') { begin++; ret += term(begin); } else if (*begin == '-') { begin++; ret -= term(begin); } else { break; } } return ret; } // 構文解析セットおわり
- 追記:括弧に未対応
//使い方 string s = "1+2*3"; State it = s.begin(); ll value = expression(it);
参考
https://gist.github.com/draftcode/1357281