perogram

構文解析セット

// 構文解析セット
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

追記