from src.Interprete.Abstract.Instruccion import Instruccion
from src.Interprete.Abstract.Node_Ast import Node_Ast
from src.Interprete.TS.Exception import Exception
from src.Interprete.TS.Simbolo import Simbolo


class Asignacion(Instruccion):

    def __init__(self, identificador, expresion, tipo, fila, columna):
        self.identificador = identificador
        self.expresion = expresion
        self.tipo = tipo
        self.fila = fila
        self.columna = columna

    def interpretar(self, tree, table):
        value = self.expresion.interpretar(tree, table)
        if isinstance(value, Exception): return value

        if(self.tipo != None and self.tipo  != self.expresion.tipo): # Aca verifica si el tipo es el mismo.
            return Exception("Semantico", "Error de tipo, no se puede convertir de " + str(self.expresion.tipo) + " a " + str(self.tipo), self.fila, self.columna)
        self.tipo = self.expresion.tipo

        simbolo = table.getTabla(self.identificador) # Va a buscar el ID a la tabla de simbolo.
        if simbolo == None: # Si no Existe lo declara, lo agrega a la tabla de simbolo.
            simbolo = Simbolo(str(self.identificador), self.expresion.tipo, self.fila, self.columna, value)
            result = table.setTabla(simbolo)
        else: # Si ya Existe el simbolo, lo actualiza en la tabla de simbolos.
            simbolo = Simbolo(str(self.identificador), self.expresion.tipo, self.fila, self.columna, value)
            result = table.actualizarTabla(simbolo)
           
        if table.getLocal(str(self.identificador))==1:
            ambit = "Global"    
        else:
            ambit = "Local"
        dic = {"id":str(self.identificador), "tipo":self.expresion.tipo, "ambito":ambit, "fila":self.fila, "columna":self.columna}
        tree.Table.append(dic)
        if isinstance(result, Exception): return result
        return None

    
    def AST(self):
        nodo = Node_Ast("ASIGNACION")

        nodo.crearHoja(str(self.identificador))
        nodo.crearHoja("=")
        nodo.crearNodo(self.expresion.AST())
        nodo.crearHoja("::")
        nodo.crearHoja(str(self.expresion.tipo))

        return nodo
f644b17b3bf915b4a0cff215f408f920f65655e6
<mask token>


class Asignacion(Instruccion):
    <mask token>
    <mask token>

    def AST(self):
        nodo = Node_Ast('ASIGNACION')
        nodo.crearHoja(str(self.identificador))
        nodo.crearHoja('=')
        nodo.crearNodo(self.expresion.AST())
        nodo.crearHoja('::')
        nodo.crearHoja(str(self.expresion.tipo))
        return nodo

<mask token>


class Asignacion(Instruccion):

    def __init__(self, identificador, expresion, tipo, fila, columna):
        self.identificador = identificador
        self.expresion = expresion
        self.tipo = tipo
        self.fila = fila
        self.columna = columna
    <mask token>

    def AST(self):
        nodo = Node_Ast('ASIGNACION')
        nodo.crearHoja(str(self.identificador))
        nodo.crearHoja('=')
        nodo.crearNodo(self.expresion.AST())
        nodo.crearHoja('::')
        nodo.crearHoja(str(self.expresion.tipo))
        return nodo

<mask token>


class Asignacion(Instruccion):

    def __init__(self, identificador, expresion, tipo, fila, columna):
        self.identificador = identificador
        self.expresion = expresion
        self.tipo = tipo
        self.fila = fila
        self.columna = columna

    def interpretar(self, tree, table):
        value = self.expresion.interpretar(tree, table)
        if isinstance(value, Exception):
            return value
        if self.tipo != None and self.tipo != self.expresion.tipo:
            return Exception('Semantico', 
                'Error de tipo, no se puede convertir de ' + str(self.
                expresion.tipo) + ' a ' + str(self.tipo), self.fila, self.
                columna)
        self.tipo = self.expresion.tipo
        simbolo = table.getTabla(self.identificador)
        if simbolo == None:
            simbolo = Simbolo(str(self.identificador), self.expresion.tipo,
                self.fila, self.columna, value)
            result = table.setTabla(simbolo)
        else:
            simbolo = Simbolo(str(self.identificador), self.expresion.tipo,
                self.fila, self.columna, value)
            result = table.actualizarTabla(simbolo)
        if table.getLocal(str(self.identificador)) == 1:
            ambit = 'Global'
        else:
            ambit = 'Local'
        dic = {'id': str(self.identificador), 'tipo': self.expresion.tipo,
            'ambito': ambit, 'fila': self.fila, 'columna': self.columna}
        tree.Table.append(dic)
        if isinstance(result, Exception):
            return result
        return None

    def AST(self):
        nodo = Node_Ast('ASIGNACION')
        nodo.crearHoja(str(self.identificador))
        nodo.crearHoja('=')
        nodo.crearNodo(self.expresion.AST())
        nodo.crearHoja('::')
        nodo.crearHoja(str(self.expresion.tipo))
        return nodo

from src.Interprete.Abstract.Instruccion import Instruccion
from src.Interprete.Abstract.Node_Ast import Node_Ast
from src.Interprete.TS.Exception import Exception
from src.Interprete.TS.Simbolo import Simbolo


class Asignacion(Instruccion):

    def __init__(self, identificador, expresion, tipo, fila, columna):
        self.identificador = identificador
        self.expresion = expresion
        self.tipo = tipo
        self.fila = fila
        self.columna = columna

    def interpretar(self, tree, table):
        value = self.expresion.interpretar(tree, table)
        if isinstance(value, Exception):
            return value
        if self.tipo != None and self.tipo != self.expresion.tipo:
            return Exception('Semantico', 
                'Error de tipo, no se puede convertir de ' + str(self.
                expresion.tipo) + ' a ' + str(self.tipo), self.fila, self.
                columna)
        self.tipo = self.expresion.tipo
        simbolo = table.getTabla(self.identificador)
        if simbolo == None:
            simbolo = Simbolo(str(self.identificador), self.expresion.tipo,
                self.fila, self.columna, value)
            result = table.setTabla(simbolo)
        else:
            simbolo = Simbolo(str(self.identificador), self.expresion.tipo,
                self.fila, self.columna, value)
            result = table.actualizarTabla(simbolo)
        if table.getLocal(str(self.identificador)) == 1:
            ambit = 'Global'
        else:
            ambit = 'Local'
        dic = {'id': str(self.identificador), 'tipo': self.expresion.tipo,
            'ambito': ambit, 'fila': self.fila, 'columna': self.columna}
        tree.Table.append(dic)
        if isinstance(result, Exception):
            return result
        return None

    def AST(self):
        nodo = Node_Ast('ASIGNACION')
        nodo.crearHoja(str(self.identificador))
        nodo.crearHoja('=')
        nodo.crearNodo(self.expresion.AST())
        nodo.crearHoja('::')
        nodo.crearHoja(str(self.expresion.tipo))
        return nodo

from src.Interprete.Abstract.Instruccion import Instruccion
from src.Interprete.Abstract.Node_Ast import Node_Ast
from src.Interprete.TS.Exception import Exception
from src.Interprete.TS.Simbolo import Simbolo


class Asignacion(Instruccion):

    def __init__(self, identificador, expresion, tipo, fila, columna):
        self.identificador = identificador
        self.expresion = expresion
        self.tipo = tipo
        self.fila = fila
        self.columna = columna

    def interpretar(self, tree, table):
        value = self.expresion.interpretar(tree, table)
        if isinstance(value, Exception): return value

        if(self.tipo != None and self.tipo  != self.expresion.tipo): # Aca verifica si el tipo es el mismo.
            return Exception("Semantico", "Error de tipo, no se puede convertir de " + str(self.expresion.tipo) + " a " + str(self.tipo), self.fila, self.columna)
        self.tipo = self.expresion.tipo

        simbolo = table.getTabla(self.identificador) # Va a buscar el ID a la tabla de simbolo.
        if simbolo == None: # Si no Existe lo declara, lo agrega a la tabla de simbolo.
            simbolo = Simbolo(str(self.identificador), self.expresion.tipo, self.fila, self.columna, value)
            result = table.setTabla(simbolo)
        else: # Si ya Existe el simbolo, lo actualiza en la tabla de simbolos.
            simbolo = Simbolo(str(self.identificador), self.expresion.tipo, self.fila, self.columna, value)
            result = table.actualizarTabla(simbolo)
           
        if table.getLocal(str(self.identificador))==1:
            ambit = "Global"    
        else:
            ambit = "Local"
        dic = {"id":str(self.identificador), "tipo":self.expresion.tipo, "ambito":ambit, "fila":self.fila, "columna":self.columna}
        tree.Table.append(dic)
        if isinstance(result, Exception): return result
        return None

    
    def AST(self):
        nodo = Node_Ast("ASIGNACION")

        nodo.crearHoja(str(self.identificador))
        nodo.crearHoja("=")
        nodo.crearNodo(self.expresion.AST())
        nodo.crearHoja("::")
        nodo.crearHoja(str(self.expresion.tipo))

        return nodo