Python - Fatal Python error: Cannot recover from stack overflow.

 
Vista:
Imágen de perfil de HDB PROGRAMMING
Val: 174
Ha disminuido 1 puesto en Python (en relación al último mes)
Gráfica de Python

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:
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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder