Fatal Python error: Cannot recover from stack overflow.
Publicado por HDB PROGRAMMING (2 intervenciones) el 17/09/2020 20:44:23
Yo estoy haciendo una especie de intérprete en Python que toma fórmulas matemáticas (por ahora muy básicas) y he avanzado bastante, pero cuando arranco el archivo main.py me tira el error Fatal Python error: Cannot recover from stack overflow. Aquí van los códigos:
main.py:
mods/mlang.py:
test.math (fichero de prueba):
Se arranca con python main.py test.math o en vez de python, python3 pero siempre ejecutar con python 3. Muchas gracias de antemano.
main.py:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import sys
from mods import mlang
# Intern modules
from colorama import Fore
# Extern libraries
VERSION = '0.1.0'
RUNNER = mlang.interpreter()
# Constants
if __name__ == '__main__':
if len(sys.argv) < 2:
print(f'Matlang v{VERSION}:')
print('ERROR: ' + Fore.RED + 'No input files' + Fore.WHITE)
else:
code = open(sys.argv[1], 'r')
code = code.read(8192)
code = ' '.join(code.split('\n'))
RUNNER.run(code)
mods/mlang.py:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
operators = [
'+',
'-',
'*',
'/',
'%',
'^',
'='
]
# Matlang operators
class interpreter:
# The Matlang interpreter
word_counter = 0
variables = {
'NONE': 0,
'RES': 0,
}
def __init__(self):
return None
def run(self, code):
for word in code.split(' '):
# Here we execute the code
execode = code.split(' ')
self.execute(word, self.word_counter, execode)
self.word_counter += 1
# Function to run code
def execute(self, code, word_counter, arr_code):
try:
float(code)
self.word_counter += 1
self.execute(arr_code[word_counter+1], self.word_counter, arr_code)
except Exception:
if code in operators:
if code == '+':
print(arr_code[word_counter-1] + float(arr_code[word_counter+1]))
self.return_val(float(arr_code[word_counter-1]) + float(arr_code[word_counter+1]))
# Adding numbers
elif code == '-':
self.return_val(float(arr_code[word_counter-1]) - float(arr_code[word_counter+1]))
# Substracting numbers
elif code == '*':
self.return_val(float(arr_code[word_counter-1]) * float(arr_code[word_counter+1]))
# Multiplying numbers
elif operator == '/':
self.return_val(float(arr_code[word_counter-1]) / float(arr_code[word_counter+1]))
# Dividing numbers
elif operator == '%':
self.return_val(int(arr_code[word_counter-1]) % int(arr_code[word_counter+1]))
# Remainer operator
elif operator == '^':
self.return_val(float(arr_code[word_counter-1]) ** int(arr_code[word_counter+1]))
# Power operator
elif operator == '=':
self.word_counter += 1
self.execute(arr_code[word_counter+1], self.word_counter, arr_code)
self.assign(code)
# Assigner operator
else:
try:
print(variables[f'{code}'])
except Exception:
self.word_counter += 1
self.execute(code, self.word_counter, arr_code)
print(code)
# Function to execute the code
def return_val(self, number):
variables['RES'] = number
print(variables['RES'])
# Function to return values
def assign(self, var: str):
variables[var] = variables['RES']
def assign(self, var: str, val: str):
variables[var] = val
# Functions to assign valuesSi No
Descripción...
def function(self, name: str):
pass
test.math (fichero de prueba):
1
2
X = 1 + 4
X
Se arranca con python main.py test.math o en vez de python, python3 pero siempre ejecutar con python 3. Muchas gracias de antemano.
Valora esta pregunta


0