逆ポーランド電卓

逆ポーランド電卓ってまだあるんだな。アマゾンでも売ってる。
というわけでちょっと作ってみた。

import sys

class InvalidToken(Exception):
    pass

class RPNCalc:
    def __init__(self):
        self.stack = []

    def calc(self, expr):
        try:
            tokens = expr
            if not tokens[-1] in '+-*/':
                raise InvalidToken
            for token in tokens:
                if token.isdigit():
                    self.stack.append(int(token))
                elif token == '+':
                    a = self.stack.pop()
                    b = self.stack.pop()
                    self.stack.append(b + a)
                elif token == '-':
                    a = self.stack.pop()
                    b = self.stack.pop()
                    self.stack.append(b - a)
                elif token == '*':
                    a = self.stack.pop()
                    b = self.stack.pop()
                    self.stack.append(b * a)
                elif token == '/':
                    a = self.stack.pop()
                    b = self.stack.pop()
                    self.stack.append(b / a)
                else:
                    raise InvalidToken
        except:
            print 'Invalid expression'
            exit()
        return self.stack.pop()

calculator = RPNCalc()
expr = sys.argv[1:]
print calculator.calc(expr)
^o^ > rpncalc.py 6 2 + 5  3 - 2 * /
2

やっつけの手抜きなので、正しく入力しないとエラーにならずに間違った答えを返す。そのうち気が向いたら直すかも。

^o^ > rpncalc.py 1 2 3 +
5