Ejemplo n.º 1
0
    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
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
 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
Ejemplo n.º 5
0
 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()
Ejemplo n.º 6
0
 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
Ejemplo n.º 7
0
    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
Ejemplo n.º 9
0
 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
Ejemplo n.º 10
0
 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
Ejemplo n.º 11
0
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
Ejemplo n.º 12
0
    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
Ejemplo n.º 13
0
    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
Ejemplo n.º 14
0
    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
Ejemplo n.º 15
0
    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
Ejemplo n.º 16
0
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)
Ejemplo n.º 17
0
    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