baslie
elif ch in ['(', ')', '+', '-', '*', '/', '%']:
baslie
def isdigit(ch):
for i in ch:
if not i.isdigit() and i != '.':
return False
return True
что это за функция ?
она две точки воспримет
(
parser() тоже одни точки посчитает числом)
baslie
print "eval()\t" + str(eval(e)) + "\ncalc():\t" + str(calc(e)) + "\n"
>>> print "eval():\t{0}\ncalc():\t{1}\n".format(eval(e), calc(e))
eval(): 3
calc(): 3
>>>
baslie
Но все-таки как лучше считывать лексемы? Есть другие варианты, кроме list?
этот список - промежуточное звено, его удобно заполнять из любого источника
есть
collections.dequeу Страуструпа используется специальная лексема для возврата, потому что в поток нельзя вернуть её
у тебя же можно вернуть в поток лексему, причём не одну, так как у тебя поток лексем, а не поток символов
(зря ты сделал отдельную переменную для возвращаемой лексемы; то, что было вначале, было лучше)
class Buffer(object):
def __init__(self, expr):
self.expr = expr
def get(self):
if self.expr:
return self.expr.pop(0)
def putback(self, val):
self.expr.insert(0, val)
class Buffer(list):
def get(self):
if self:
return self.pop(0)
def putback(self, val):
self.insert(0, val)
class Buffer(list):
def __init__(self, expr):
list.__init__(self, expr)
def get(self):
if self:
return self.pop(0)
def putback(self, val):
self.insert(0, val)
ещё пара вариантов: один - простой, другой - с возможностью каких-нибудь изменений
>>> class Buffer(list):
... def __init__(self, expr):
... list.__init__(self, expr * 2)
... def get(self):
... if self:
... return self.pop(0)
... def putback(self, val):
... self.insert(0, val)
...
>>> buf = Buffer(['10', '+', '20', '*', '30'])
>>> buf
['10', '+', '20', '*', '30', '10', '+', '20', '*', '30']
>>> buf.get()
'10'
>>> buf.get()
'+'
>>> buf
['20', '*', '30', '10', '+', '20', '*', '30']
>>> buf.putback('+')
>>> buf
['+', '20', '*', '30', '10', '+', '20', '*', '30']
>>>
пример изменений