Ваша проблема в том, что в вашем коде есть несколько мест, где вы передаете число 1
вместо списка токенов l
. Например:
def simple_exp(l):
if l[0].value is "+" or l[0].value is "-":
return term(1)
… и:
def term(l):
if l[0].value is "*" or l[0].value is "/":
mul_op(1)
Все ваши функции ожидают получения списка токенов в виде l
, а не числа. Первый раз, когда один из них попытается выполнить l[0].value
или аналогичный, когда l
- это число 1
, это вызовет именно то исключение, о котором вы спрашиваете:
TypeError: 'int' object has no attribute '__getitem__'
Я не знаю, какой из этих опечаток вызвал вашу конкретную проблему, но это не имеет значения; вам, очевидно, нужно исправить все из них.
И, как предположил Рори Даултон в первом комментарии, именно поэтому l
является ужасным именем переменной. Если бы ваша переменная называлась tokens
или lst
или почти что-нибудь еще, вы могли бы сразу сказать, что 1
была ошибкой, но, поскольку она l
, которая выглядит почти идентично 1
, вы не можете видеть проблема даже после того, как она была указана вам.
Конечно, у вас есть и другие ошибки в вашем коде (например, l.remove(l[0])
, за которым следует l.remove(l[1])
, удалит первый и третий элементы, а не первые два, и, на более глубоком уровне, ваш term
isn ' вообще не проверяю термин, это просто проверяет mul_op
), но именно он блокирует вас.