-
Notifications
You must be signed in to change notification settings - Fork 0
/
traductorFunctions.py
197 lines (157 loc) · 5.82 KB
/
traductorFunctions.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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
import re
from generalFunctions import sintax_error, borrar_nulos
class Proc(object):
def __init__(self):
pass
PROC = False
def llamado_proc_valido(linea):
cortado = re.split("\((.*)\)", linea)
if cortado and len(cortado) > 1:
if re.search("\(|\)", cortado[1]):
sintax_error("Se realizo llamado de funcion dentro de llamado de funcion")
return True
return False
def formatear_llamado_proc(linea):
if re.search("\(\s*\)", linea):
return "pass"
a = re.split("\((.*)\)", linea)[1]
b = re.split("\s", a)
return b[0]+"("+", ".join(map(nombre_valor_valido, b[1:]))+")"
def creacion_variable_valido(linea):
if re.search("^PARAM[0-9]+$", linea):
sintax_error("Uso de nombre reservado para creacion de variable")
return
def nombre_variable_valido(linea):
if len(borrar_nulos(re.split("\s*", linea))) != 1:
if len(re.split("[^a-zA-Z]*", linea)) != 1:
sintax_error("Uso de caracteres no permitidos para una variable")
return
def nombre_valor_valido(linea):
if linea_vacia(linea):
sintax_error("No hay valor para asignar a la variable")
elif re.search("^PARAM[0-9]+$", linea):
return "params["+re.split("PARAM", linea)[1]+"]"
elif revisarifelse(linea):
return formatearifelse(linea)
elif llamado_proc_valido(linea):
return formatear_llamado_proc(linea)
elif len(re.split("^TRUE$", linea)) == 2:
return "True"
elif len(re.split("^FALSE$", linea)) == 2:
return "False"
elif len(re.split("[[\-0-9]*|[0-9]*]", linea)) == 2:
return eliminar_espacios(linea)
elif not nombre_variable_valido(linea):
return eliminar_espacios(linea)
else:
sintax_error("Asignacion de variable invalida")
return
def revisar_creacion_variable(linea):
return re.search('^VAR\((.*)\)(.*)\s+<=\s+(.*)$', linea) or re.search('^(.*)\s+=>\s+VAR\((.*)\)$', linea)
def linea_vacia(linea):
return re.search("^\s*$", linea)
def revisar_reasignacion_variable(linea):
if re.search("VAR", linea):
return False
return re.search('^(.*)<=(.*)$', linea) or re.search('^(.*)=>(.*)$', linea)
def eliminar_espacios(linea):
return re.sub("\s+", "", linea)
def param_funcion(linea):
param = re.split("PARAM", linea)
if len(param) > 1:
if Proc.PROC:
return "params["+param[1]+"]"
else:
sintax_error("Uso de la palabra reservada PARAM fuera de una funcion")
return
def asignacion_asignosa(variable, valor):
creacion_variable_valido(variable)
param = param_funcion(variable)
if param:
variable = param
nombre_variable_valido(variable)
valor = nombre_valor_valido(valor)
param = param_funcion(valor)
if param:
valor = param
variable = eliminar_espacios(variable)
return variable, valor
def generar_valor_variable(asignacion_izq, asignacion_der):
if len(asignacion_izq) > 1:
variable = re.split("VAR\(\s*(.*)\)", asignacion_izq[0])
if len(variable) == 1:
sintax_error("Asignacion de una variable sin el uso de VAR")
variable = variable[1]
valor = asignacion_izq[1]
elif len(asignacion_der) > 1:
variable = re.split("VAR\(\s*(.*)\)", asignacion_der[1])
if len(variable) == 1:
sintax_error("Asignacion de una variable sin el uso de VAR")
variable = variable[1]
valor = asignacion_der[0]
else:
sintax_error("Expresion invalida")
return
return variable, valor
def generar_asignacion(linea):
if linea_vacia(linea):
return ""
asignacion_izq = re.split('<=', linea)
asignacion_der = re.split('=>', linea)
variable, valor = generar_valor_variable(asignacion_izq, asignacion_der)
return asignacion_asignosa(variable, valor)
def revisar_proc_inicio(linea, proc):
nombre = re.sub("\)", "", linea)
nombre = re.split("\$\^PROC\s*\(", nombre)
if proc and re.search("\$\^PROC", linea):
sintax_error("Funcion dentro de funcion")
if proc:
return proc, None
if re.search("\$\^PROC\s*\(", linea):
return True, nombre[1]
return False, None
def revisar_proc_fin(linea, proc):
if not proc and re.search("\^\$", linea):
sintax_error("Cierre de funcion sin entrar en ella")
if re.search("\^\$", linea):
return False
if proc:
return proc
return False
def revisar_return(linea):
formato_return = re.search("^\s*#", linea)
if formato_return:
if not Proc.PROC:
sintax_error("Return fuera de una funcion")
sin_espacios = " ".join(re.split("#|\s+", linea)[1:])
retorno = nombre_valor_valido(sin_espacios)
if retorno:
return "return "+retorno
return ""
def revisarifelse(linea):
if re.search("^\s*IFELSE\s+", linea):
newlinea = re.sub("\s*IFELSE\s+", "", linea)
cortado = re.split("\)\s+|\s+\(", newlinea)
return len(borrar_nulos(cortado)) == 3
return False
def agregar_parentesis(linea, verificar=False):
if verificar and not re.search("\(|\)", linea):
return linea
if not re.search("\(", linea):
linea = "("+linea
if not re.search("\)", linea):
linea += ")"
return linea
def formatearifelse(linea):
newlinea = re.sub("\s*IFELSE\s+", "", linea)
newlinea = re.split("\)\s+|\s+\(", newlinea)
si = agregar_parentesis(newlinea[0])
condicion = agregar_parentesis(newlinea[1], True)
sino = agregar_parentesis(newlinea[2])
if llamado_proc_valido(si) and llamado_proc_valido(sino):
si, sino = formatear_llamado_proc(si), formatear_llamado_proc(sino)
if llamado_proc_valido(condicion):
condicion = formatear_llamado_proc(condicion)
else:
condicion = nombre_valor_valido(condicion)
return si+" if "+condicion+" else "+sino