“Chyba podaje wyniki dobrze”!? skąd taki wniosek - testujesz jakoś swój kod? Bo jeżeli testujesz na konsoli-terinalu używając klawiatury, to jak chcesz skończyć podawanie danych? - zasymulować EOF - poszukaj w necie 
Jeżeli nie testujesz lub testujesz jak wyżej to zainteresuj się przekierowaniami standartowych strumieni z i do plików.
Możesz też testować na ideone wklejając testy do okienka stdin: https://ideone.com/BdJvOY
Skoro jest błąd, można by zamknąć pętlę w bloku Try: , służy on do wyłapywania systuacji niespodziewanych, wyjątkowych. Czy EOF jest jednak takim wyjątkowym/niespodziewanym zdarzeniem? Od początku wiemy, że wystąpi i się go spodziewamy, oczekujemy.
Można więc, ale to nie jedyny sposób, np tak: https://ideone.com/YhPIhq
Widzę sporo nadmiarowego i zbędnego kodu w twoim programie - warto abyś postudiował jakiś podręcznik do pythona… .
x = input().split()
a, b, c = x
lub
a, b, c = input().split()
b = int(b)
c = ......
=============================================
if a == 'z':
tab[b] = c
x = tab[b] <----- po co jest ta linijka!?
elif a == '+':
c = tab[b] + tab[c]
print(int(c)) <------- int jest tu zbędny
albo po prostu:
elif a == '+':
print(tab[b] + tab[c])
i wszędzie podobnie
Zamiast if - elif - może lepiej switch?