def analizar(self, TS, Errores): funcion = TS.obtenerfunc(self.nombre) if funcion is None: Errores.insertar( N_Error("Semantico", "No existe funcion " + self.nombre, self.fila, self.columna)) return TIPO_DATOS.ERROR if len(funcion.parametros) == len(self.elementos): cuenta = 0 for nodo in self.elementos: tipo1 = nodo.analizar(TS, Errores) tipo2 = funcion.parametros[cuenta].tipo.tipo if tipo1 != tipo2: N_Error( "Semantico", "Error llamada, no coincides tipos en parametros " + self.nombre, self.fila, self.columna) return TIPO_DATOS.ERROR else: Errores.insertar( N_Error( "Semantico", "Error llamada, no posee mismo numero de parametros que funcion " + self.nombre, self.fila, self.columna)) return TIPO_DATOS.ERROR return funcion.tipo.tipo
def analizar(self,TS,Errores): sim = Simbolo(self.tipo.tipo, self.nombre, "", TS.nombre) if not TS.push(sim): Errores.insertar(N_Error("Semantico",'Variable '+self.nombre+' ya esta definida'),self.fila,self.columna) return TIPO_DATOS.ERROR if not (isinstance(self.valor,Lista) or isinstance(self.valor,primitivo)): Errores.insertar(N_Error("Semantico", 'Solo se puede asignar tipo list a arreglo', self.fila, self.columna)) return TIPO_DATOS.ERROR tipo=self.valor.analizar(TS,Errores) if tipo==TIPO_DATOS.ERROR: return TIPO_DATOS.ERROR
def analizar(self, TS, Errores): simbolo = TS.obtener(self.nombre) if simbolo is None: Errores.insertar( N_Error("Semantico", "No existe variable " + self.nombre, self.fila, self.columna)) return TIPO_DATOS.ERROR return simbolo.tipo
def analizar(self,TS,Errores): temporal={} for nodo in self.atributos: if nodo.nombre in temporal: Errores.insertar(N_Error("Semantico","Nombre de atributo "+nodo.nombre+' repetido en struct '+self.nombre, self.fila,self.columna)) return TIPO_DATOS.ERROR temporal[nodo.nombre]=nodo
def analizar(self,TS,Errores): if self.isestruct: return sim = Simbolo(self.tipo.tipo, self.nombre, "", TS.nombre) if not TS.push(sim): Errores.insertar(N_Error("Semantico", 'Variable ' + self.nombre + ' ya esta definida', self.fila, self.columna)) return sim.posicion=TS.getParametro()
def analizar(self, TS, Errores): tipo = self.Exp1.analizar(TS, Errores) if tipo == TIPO_DATOS.INT or tipo == TIPO_DATOS.CHAR or tipo == TIPO_DATOS.FLOAT or tipo == TIPO_DATOS.DOUBLE: return tipo else: Errores.insertar( N_Error("Semantico", "No es posible incremento/decremento", self.fila, self.columna)) return TIPO_DATOS.ERROR
def analizar(self, TS, Errores): if TS.existestruct(self.tipo): Errores.insertar( N_Error("Semantico", "Error instancia, no existe struct " + self.nombre, self.fila, self.columna)) return TIPO_DATOS.ERROR if self.dimensiones is not None: dimensiones = len(self.dimensiones) else: dimensiones = 0 sim = Simbolo(self.tipo, self.nombre, "", TS.nombre, dimensiones) if not TS.push(sim): Errores.insertar( N_Error("Semantico", 'Variable ' + self.nombre + ' ya esta definida', self.fila, self.columna)) return TIPO_DATOS.ERROR
def analizar(self,TS,Errores): #Buscando si variable ya esta declarada sim = Simbolo.Simbolo(self.tipo.tipo, self.nombre, "", TS.nombre) if not TS.push(sim): Errores.insertar(N_Error("Semantico",'Variable '+self.nombre+' ya esta definida',self.fila,self.columna)) return if self.valor is not None: tipo=self.valor.analizar(TS,Errores) if tipo==TIPO_DATOS.ERROR: return TIPO_DATOS.ERROR
def analizar(self, TS, Errores): tipo = self.analizar(TS, Errores) if not (tipo == TIPO_DATOS.INT or tipo == TIPO_DATOS.CHAR or tipo == TIPO_DATOS.DOUBLE or tipo == TIPO_DATOS.FLOAT): Errores.insertar( N_Error("Semantico", "La el tipo de condicion no es valido en ternario ", self.fila, self.columna)) return TIPO_DATOS.ERROR tipo2 = self.Exp1.analizar(TS, Errores) tipo3 = self.Exp2.analizar(TS, Errores) if tipo == TIPO_DATOS.ERROR or tipo2 == TIPO_DATOS.ERROR or tipo3 == TIPO_DATOS.ERROR: return TIPO_DATOS.ERROR
def analizar(self, TS, Errores): tipo = self.Exp.analizar(TS, Errores) if self.op == '~': if tipo == TIPO_DATOS.INT or tipo == TIPO_DATOS.CHAR: return TIPO_DATOS.INT else: Errores.insertar( N_Error( "Semantico", "No es posible operador unario " + self.op + ' con tipo de dato ' + str(tipo.nombre), self.fila, self.columna)) return TIPO_DATOS.ERROR else: if tipo == TIPO_DATOS.INT or tipo == TIPO_DATOS.CHAR or tipo == TIPO_DATOS.DOUBLE or tipo == TIPO_DATOS.FLOAT: return TIPO_DATOS.INT else: Errores.insertar( N_Error( "Semantico", "No es posible operador unario " + self.op + ' con tipo de dato ' + str(tipo.nombre), self.fila, self.columna)) return TIPO_DATOS.ERROR
def p_error(t): if not t: print('end of file') return errores.insertar( err.N_Error("Sintactico", str(t.value), t.lineno, find_column(input, t))) while True: tok = parser.token() if not tok or tok.type == 'pyc': break
def analizar(self, TS, Errores): sim = TS.obtener(self.Atributo1.nombre) if sim is None: Errores.insertar( N_Error( "Semantico", "Error acceso Struct, struct " + self.Atributo1.nombre + ' no esta definido', self.fila, self.columna)) return TIPO_DATOS.ERROR struct = TS.obtenerstruct(sim.tipo) for nodo in struct.atributos: if nodo.nombre == self.Atributo2.nombre: return Errores.insertar( N_Error("Semantico", "Acceso no valido, porque no esta definido en struct", self.fila, self.columna)) return TIPO_DATOS.ERROR
def analizar(self, TS, Errores): tipo = self.EXP.analizar(TS, Errores) if not (tipo == TIPO_DATOS.INT or tipo == TIPO_DATOS.CHAR or tipo == TIPO_DATOS.DOUBLE or tipo == TIPO_DATOS.FLOAT): Errores.insertar( N_Error("Semantico", "Tipo de dato de switch no es valido ", self.fila, self.columna)) return TIPO_DATOS.ERROR for nodo in self.SENTENCIAS: tipo = nodo.analizar(TS, Errores) if tipo == TIPO_DATOS.ERROR: return tipo
def analizar(self, TS, Errores): tipo1 = self.Exp1.analizar(TS, Errores) tipo2 = self.Exp2.analizar(TS, Errores) if (tipo1 == TIPO_DATOS.INT or tipo1 == TIPO_DATOS.CHAR) and (tipo2 == TIPO_DATOS.INT or tipo2 == TIPO_DATOS.CHAR): return TIPO_DATOS.INT else: Errores.insertar( N_Error( "Semantico", "No es posible operacion entre " + str(tipo1.nombre) + ' ' + self.op + ' ' + str(tipo2.nombre), self.fila, self.columna)) return TIPO_DATOS.ERROR
def analizar(self, TS, Errores): if self.Incial is not None: tipo = self.Incial.analizar(TS, Errores) if tipo == TIPO_DATOS.ERROR: return TIPO_DATOS.ERROR tipo = self.Condicion.analizar(TS, Errores) if not (tipo == TIPO_DATOS.INT or tipo == TIPO_DATOS.CHAR or tipo == TIPO_DATOS.DOUBLE or tipo == TIPO_DATOS.FLOAT): Errores.insertar( N_Error("Semantico", "Tipo de dato de switch no es valido ", self.fila, self.columna)) return TIPO_DATOS.ERROR if self.Incremento is not None: tipo = self.Incremento.analizar(TS, Errores) if tipo == TIPO_DATOS.ERROR: return TIPO_DATOS.ERROR for nodo in self.Sentencias: tipo = nodo.analizar(TS, Errores) if tipo == TIPO_DATOS.ERROR: return tipo
def t_error(t): errores.insertar( err.N_Error("Lexico", "Caracter ilegal '%s'" % t.value[0], t.lineno, find_column(input, t))) print("Illegal character '%s'" % t.value[0]) t.lexer.skip(1)
def analizar(self, TS, Errores): tipo1 = self.Exp1.analizar(TS, Errores) tipo2 = self.Exp2.analizar(TS, Errores) if self.op == '+': if (tipo1 == TIPO_DATOS.INT or tipo1 == TIPO_DATOS.CHAR or tipo1 == TIPO_DATOS.FLOAT or tipo1 == TIPO_DATOS.DOUBLE) and (tipo2 == TIPO_DATOS.CHAR or tipo2 == TIPO_DATOS.INT or tipo2 == TIPO_DATOS.FLOAT or tipo2 == TIPO_DATOS.DOUBLE): if tipo1 == TIPO_DATOS.INT and tipo2 == TIPO_DATOS.INT: return TIPO_DATOS.FLOAT elif tipo1 == TIPO_DATOS.CHAR or tipo2 == TIPO_DATOS.CHAR: return TIPO_DATOS.INT return TIPO_DATOS.FLOAT else: return TIPO_DATOS.CHAR elif self.op == '-' or self.op == '*': if (tipo1 == TIPO_DATOS.INT or tipo1 == TIPO_DATOS.CHAR or tipo1 == TIPO_DATOS.FLOAT or tipo1 == TIPO_DATOS.DOUBLE) and (tipo2 == TIPO_DATOS.CHAR or tipo2 == TIPO_DATOS.INT or tipo2 == TIPO_DATOS.FLOAT or tipo2 == TIPO_DATOS.DOUBLE): if tipo1 == TIPO_DATOS.INT and tipo2 == TIPO_DATOS.INT: return TIPO_DATOS.INT elif tipo1 == TIPO_DATOS.CHAR or tipo2 == TIPO_DATOS.CHAR: return TIPO_DATOS.INT return TIPO_DATOS.FLOAT else: Errores.insertar( N_Error( "Semantico", "No es posible operacion entre " + str(tipo1.name) + ' ' + self.op + ' ' + str(tipo2.name), self.fila, self.columna)) return TIPO_DATOS.ERROR elif self.op == '/': if (tipo1 == TIPO_DATOS.INT or tipo1 == TIPO_DATOS.CHAR or tipo1 == TIPO_DATOS.FLOAT or tipo1 == TIPO_DATOS.DOUBLE) and (tipo2 == TIPO_DATOS.CHAR or tipo2 == TIPO_DATOS.INT or tipo2 == TIPO_DATOS.FLOAT or tipo2 == TIPO_DATOS.DOUBLE): return TIPO_DATOS.FLOAT else: Errores.insertar( N_Error( "Semantico", "No es posible operacion entre " + str(tipo1.nombre) + ' ' + self.op + ' ' + str(tipo2.nombre), self.fila, self.columna)) return TIPO_DATOS.ERROR elif self.op == '%': if (tipo1 == TIPO_DATOS.INT or tipo1 == TIPO_DATOS.CHAR) and ( tipo2 == TIPO_DATOS.CHAR or tipo2 == TIPO_DATOS.INT): return TIPO_DATOS.INT else: Errores.insertar( N_Error( "Semantico", "No es posible operacion entre " + str(tipo1.nombre) + ' ' + self.op + ' ' + str(tipo2.nombre), self.fila, self.columna)) return TIPO_DATOS.ERROR