Exemplo n.º 1
0
 def __init__(self):
     self.lista_Tokens = list()
     self.lista_error = list()
     self.linea = 1
     self.columna = 1
     self.lexema = ""
     self._reporte = Report()
     self.newEntrada = ""
 def __init__(self):
     self.listado_tokens = list()
     self.pila = list()
     self.pop_pila = ''
     self.entrada = ''
     self.lista_Token = list()
     self.estado = ''
     self.cadena = ''
     self.ireport = Report()
 def __init__(self):
     self.lista_Tokens = list()
     self.lista_error = list()
     self.linea = 1
     self.columna = 1
     self.lexema = ""
     self.recorrido_automata = {}
     self._reporte = Report()
     self.now = datetime.now()
     self.bitacora = ""
 def __init__(self):
     self.lista_token = list()
     self.lista_error = list()
     self.pos_error = {}
     self.lexema = ""
     self.linea = 1
     self.columan = 1
     self.contador = 1
     self.cont_Comentario = 1
     self.cont_ComentarioAS = 1
     self.recorrido_automata = dict()
     self.newEntrada = ""
     self._reporte = Report()
class Anality_CSS():
    lista_Tokens = list()
    lista_error = list()
    linea = 1
    columna = 1
    lexema = ""
    recorrido_automata = {}
    _reporte = Report()
    bitacora = ""
    now = datetime.now()

    def __init__(self):
        self.lista_Tokens = list()
        self.lista_error = list()
        self.linea = 1
        self.columna = 1
        self.lexema = ""
        self.recorrido_automata = {}
        self._reporte = Report()
        self.now = datetime.now()
        self.bitacora = ""

    def read_caracter(self, texto):
        self.bitacora = f"---------->Bitacora CSS <---------- [{self.getTime()}] \n"
        self.entrada = texto + '$'
        self.caracterActual = ''
        self.newEntrada = texto

        x = 0
        while x < len(self.entrada):
            self.caracterActual = self.entrada[x]
            #print(self.caracterActual)
            # qo -> q1(simbolos del lenguje)
            if self.caracterActual == '{':
                self.add_tokken(TipoCSS.LLABRE, '{', "")
            elif self.caracterActual == '}':
                self.add_tokken(TipoCSS.LLCIER, '}', "")
            elif self.caracterActual == '(':
                self.add_tokken(TipoCSS.PABRE, '(', "")
            elif self.caracterActual == ')':
                self.add_tokken(TipoCSS.PCIER, ')', "")
            elif self.caracterActual == '"':
                self.add_tokken(TipoCSS.COMIDOBLE, '"', "")
            elif self.caracterActual == ',':
                self.add_tokken(TipoCSS.COMA, ',', "")
            elif self.caracterActual == ':':
                self.add_tokken(TipoCSS.DPUNTOS, ':', "")
            elif self.caracterActual == ';':
                self.add_tokken(TipoCSS.PCOMA, ';', "")

            elif self.caracterActual.isnumeric():
                #-------------------Agregar bitacora--------------------------------------
                _trasBitacora = f"[q0 -> q2;{self.caracterActual}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora
                #--------------------------------------------------------------------------

                size_lexema = self.get_size_lexema_asterisco(x)
                self.q2(x, x + size_lexema)
                x = x + size_lexema

            elif self.caracterActual.isalpha():
                #-------------------Agregar bitacora--------------------------------------
                _trasBitacora = f"[q0 -> q4;{self.caracterActual}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora
                #-------------------------------------------------------------------------
                size_lexema = self.get_size_lexema_asterisco(x)
                self.q4(x, x + size_lexema)
                x = x + size_lexema

            elif self.caracterActual == '/' and self.entrada[x + 1] == '*':
                size_lexema = self.get_size_lexema_comentario(x)
                #-------------------Agregar bitacora--------------------------------------
                _trasBitacora = f"[q0 - q7 ;{self.caracterActual}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora

                #-------------------Agregar bitacora--------------------------------------
                _trasBitacora = f"[q0 -> q8 ;{self.entrada[x + 1]}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora
                #-------------------------------------------------------------------------
                #-------------------------------------------------------------------------
                if (x + size_lexema + 2 <= len(self.entrada)):
                    #-------------------Agregar bitacora--------------------------------------
                    _trasBitacora = f"[q8 -> q6 ;{self.entrada[x + 2]}] - [{self.getHora()}] \n"
                    self.bitacora += _trasBitacora
                    #-------------------------------------------------------------------------

                    self.q6(x, x + size_lexema + 2)
                    x = x + size_lexema + 2  # PENDIENTE DE REVISAR URGE PORNER MAS size_lexema +2
                else:
                    self.q6(x, x + size_lexema)
                    x = x + size_lexema
                    self.add_error(x, self.linea, self.columna, '*/')
                    break

            elif self.caracterActual == '#' or self.caracterActual == '.':
                #-------------------Agregar bitacora--------------------------------------
                _trasBitacora = f"[q0 -> q4;{self.caracterActual}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora
                #-----------------------------------------------------------------------------

                size_lexema = self.get_size_lexema_asterisco(x)
                self.q4(x, x + size_lexema)
                x = x + size_lexema

            elif self.caracterActual == '-':
                size_lexema = self.get_size_lexema_asterisco(x)
                self.q2(x, x + size_lexema)
                x = x + size_lexema

            #elif self.caracterActual == "\n":
            #print("Salto de linea")

            elif self.caracterActual == "\n" or self.caracterActual == " " or self.caracterActual == "\t" or self.caracterActual == "\t":
                if self.caracterActual == "\n":
                    self.linea += 1
                    self.columna = 1
                    #print("Salto de linea principal")

                x += 1
                self.columna += 1
                continue

            else:
                if self.caracterActual == "$" and x == len(self.entrada) - 1:
                    print("Analicis Terminado")
                else:
                    self.add_error(x, self.linea, self.columna,
                                   self.caracterActual)

            x += 1
            self.columna += 1

        #print(self.bitacora)
        #return self.lista_error
        return self.bitacora

    # ----------------->ESTADO Q2 <--------------------------------------
    # Numero
    def q2(self, actual, fin):
        c = ''
        inicio = actual
        while actual < fin:
            c = self.entrada[actual]
            # q2 -> q2 con numero (numero)

            if c.isnumeric():
                self.lexema += c
                #transicion = f"{c},q2"
                #self.add_diccionario('q2',transicion)
                _trasBitacora = f"[q2 -> q2;{c}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora

                if (actual + 1 == fin):
                    self.add_tokken(TipoCSS.VALOR, self.lexema, "blue")

                    _trasBitacora = f"[Acepatado ;{self.lexema}] - [{self.getHora()}] \n"
                    self.bitacora += _trasBitacora

            # q2 -> q2 con  % (%)
            elif c == '%':
                self.lexema += c
                #transicion = f"{c},q7"
                #self.add_diccionario('q2',transicion)
                _trasBitacora = f"[q2 -> q2;{c}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora

                if (actual + 1 == fin):
                    self.add_tokken(TipoCSS.VALOR, self.lexema, "blue")

                    _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
                    self.bitacora += _trasBitacora

            # q2 -> q2 con . (.)
            elif c == '.':
                self.lexema += c
                #transicion = f"{c},q2"
                #self.add_diccionario('q2',transicion)
                _trasBitacora = f"[q2 -> q2;{c}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora

                if (actual + 1 == fin):
                    self.add_tokken(TipoCSS.VALOR, self.lexema, "blue")

                    _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
                    self.bitacora += _trasBitacora

            elif c == '-' and actual == inicio:
                self.lexema += c

                _trasBitacora = f"[q2 -> q2;{c}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora
                #transicion = f"{c},q2"
                #self.add_diccionario('q2',transicion)

            # q2 -> q3 con letra (letra)
            elif c.isalpha():
                #transicion = f"{c},q3"
                #self.add_diccionario('q2',transicion)
                _trasBitacora = f"[q2 -> q3;{c}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora

                self.q3(actual, fin)
                break

            else:
                #Caracter No Reconocido
                self.add_error(actual, self.linea, self.columna, c)
            actual += 1
            self.columna += 1

    # ----------------->ESTADO Q3 <--------------------------------------
    # Letra
    def q3(self, actual, fin):
        c = ''
        while actual < fin:
            c = self.entrada[actual]
            # q3 -> q3 con letra (letra)
            if c.isalpha():
                self.lexema += c
                _trasBitacora = f"[q3 -> q3;{c}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora

                if (actual + 1 == fin):
                    self.add_tokken(TipoCSS.VALOR, self.lexema, "blue")
                    _trasBitacora = f"[Acepatado ;{self.lexema}] - [{self.getHora()}] \n"
                    self.bitacora += _trasBitacora
            else:
                #Caracter No Reconocido
                self.add_error(actual, self.linea, self.columna, c)
            actual += 1
            self.columna += 1

    # ----------------->ESTADO Q6 <--------------------------------------
    # Comentario

    def q6(self, actual, fin):
        c = ''
        while actual < fin:
            c = self.entrada[actual]
            self.lexema += c
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[q6 -> q6 ;{c}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #-------------------------------------------------------------------------
            if (actual + 1 == fin):
                #-------------------Agregar bitacora--------------------------------------
                _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora
                #-------------------------------------------------------------------------
                self.add_tokken(TipoCSS.COMENTARIO, self.lexema, "gray")
            self.columna += 1
            actual += 1

    # ----------------->Estado Q4 <--------------------------------------
    #  Reservadas
    def q4(self, actual, fin):
        self.lexema = self.get_lexema(actual, fin)

        if self.lexema == "color":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.COLOR, 'color', 'red')
            return
        elif self.lexema == "border":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.BORDER, "border", "red")
            return
        elif self.lexema == "text-align":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.TEXT_ALIGN, "text-align", "red")
            return
        elif self.lexema == "font-weight":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.FONT_WEIGHT, "font-weight", "red")
            return
        elif self.lexema == "padding-left":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.PADDING_LEFT, "padding-left", "red")
            return
        elif self.lexema == "padding-top":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.PADDING_TOP, "padding-top", "red")
            return
        elif self.lexema == "line-height":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.LINE_HEIGHT, "line-height", "red")
            return
        elif self.lexema == "margin-top":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.MARGIN_TOP, "margin-top", "red")
            return
        elif self.lexema == "margin-left":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.MARGIN_LEFT, "margin-left", "red")
            return
        elif self.lexema == "display":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.DISPLAY, "display", "red")
            return
        elif self.lexema == "top":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.TOP, "top", "red")
            return
        elif self.lexema == "float":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.FLOAT, "float", "red")
            return
        elif self.lexema == "min-width":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.MIN_WIDTH, "min-width", "red")
            return
        elif self.lexema == "background-color":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.BACKGROUND_COLOR, "background-color",
                            "red")
            return
        elif self.lexema == "background":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.BACKGROUND, "background", "red")
            return
        elif self.lexema == "font-family":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.FONT_FAMILY, "font-family", "red")
            return
        elif self.lexema == "font-size":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.FONT_SIZE, "font-size", "red")
            return
        elif self.lexema == "padding-right":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.PADDING_RIGHT, "padding-right", "red")
            return
        elif self.lexema == "padding":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.PADDING, "padding", "red")
            return
        elif self.lexema == "width":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.WIDTH, "width", "red")
            return
        elif self.lexema == "margin-right":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.MARGIN_RIGHT, "margin-right", "red")
            return
        elif self.lexema == "margin":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.MARGIN, "margin", "red")
            return
        elif self.lexema == "bottom":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.BOTTOM, "bottom", "red")
            return
        elif self.lexema == "right":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.RIGHT, "right", "red")
            return
        elif self.lexema == "clear":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.CLEAR, "clear", "red")
            return
        elif self.lexema == "max-height":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.MAX_HEIGHT, "max-height", "red")
            return
        elif self.lexema == "background-image":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.BACKGROUND_IMAGE, "background-image",
                            "red")
            return
        elif self.lexema == "font-style":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.FONT_STYLE, "font-style", "red")
            return
        elif self.lexema == "font":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.FONT, "font", "red")
            return
        elif self.lexema == "padding-bottom":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.PADDING_BOTTOM, "padding-bottom", "red")
            return
        elif self.lexema == "margin-bottom":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.MARGIN_BOTTOM, "margin-bottom", "red")
            return
        elif self.lexema == "border-style":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.BORDER_STYLE, "border-style", "red")
            return
        elif self.lexema == "position":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.POSITION, "position", "red")
            return
        elif self.lexema == "left":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.LEFT, "left", "red")
            return
        elif self.lexema == "max-width":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.MAX_WIDTH, "max-width", "red")
            return
        elif self.lexema == "min-height":
            #-------------------Agregar bitacora--------------------------------------
            _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            #--------------------------------------------------------------------------
            self.add_tokken(TipoCSS.MIN_HEIGHT, "min-height", "red")
            return

        self.lexema = ""
        c = ''
        while actual < fin:
            c = self.entrada[actual]
            # q4 -> q5 (letra | numero)
            if c == '#':
                self.lexema += c
                #-------------------Agregar bitacora-----------------------------------------------
                _trasBitacora = f"[q4 -> q5;{self.entrada[actual + 1]}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora
                #----------------------------------------------------------------------------------
                self.q5(actual + 1, fin)
                break

            # q4 -> q5 (letra | numero)
            elif c == '.':
                self.lexema += c
                #-------------------Agregar bitacora---------------------------------------------------
                _trasBitacora = f"[q4 -> q5;{self.entrada[actual + 1]}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora
                #------------------------------------------------------------------------------------
                self.q5(actual + 1, fin)
                break

            # q4 -> q5 (letra | numero)
            elif c.isalpha():
                self.q5(actual, fin)
                break
            else:
                self.add_error(actual, self.linea, self.columna, c)

            actual += 1
            self.columna += 1

    # terminar de componer
    #
    #
    # --------------------------> <--------------------------------------
    # ----------------->ESTADO Q5 <--------------------------------------
    def q5(self, actual, fin):
        c = ''
        while actual < fin:
            c = self.entrada[actual]
            # q5 -> q5 (letra)
            if c.isalpha():
                self.lexema += c
                #-------------------Agregar bitacora--------------------------------------
                _trasBitacora = f"[q5 -> q5;{c}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora
                #----------------------------------------------------------------------------

                if (actual + 1 == fin):
                    #-------------------Agregar bitacora--------------------------------------
                    _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
                    self.bitacora += _trasBitacora
                    #-------------------------------------------------------------------------
                    self.add_tokken(TipoCSS.ID, self.lexema, "green")

            elif c.isnumeric():
                self.lexema += c
                #-------------------Agregar bitacora--------------------------------------
                _trasBitacora = f"[q5 -> q5;{c}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora
                #-----------------------------------------------------------------------

                if (actual + 1 == fin):
                    #-------------------Agregar bitacora--------------------------------------
                    _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
                    self.bitacora += _trasBitacora
                    #-------------------------------------------------------------------------
                    self.add_tokken(TipoCSS.ID, self.lexema, "green")

            elif c == '-':
                self.lexema += c

                #-------------------Agregar bitacora--------------------------------------
                _trasBitacora = f"[q5 -> q5 ;{c}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora
                #-------------------------------------------------------------------------
                if (actual + 1 == fin):
                    #-------------------Agregar bitacora--------------------------------------
                    _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
                    self.bitacora += _trasBitacora
                    #-------------------------------------------------------------------------

                    self.add_tokken(TipoCSS.ID, self.lexema, "green")
            # q5 -> q4 (#)
            elif c == '#' or c == '(' or c == ')' or c == '"' or c == '.' or c == '/':
                self.lexema += c

                #-------------------Agregar bitacora--------------------------------------
                _trasBitacora = f"[q5 -> q5 ;{c}] - [{self.getHora()}] \n"
                self.bitacora += _trasBitacora
                #-------------------------------------------------------------------------
                if (actual + 1 == fin):
                    #-------------------Agregar bitacora--------------------------------------
                    _trasBitacora = f"[Aceptado ;{self.lexema}] - [{self.getHora()}] \n"
                    self.bitacora += _trasBitacora
                    #-------------------------------------------------------------------------
                    self.add_tokken(TipoCSS.ID, self.lexema, "green")

            else:
                #print(self.linea)
                self.add_error(actual, self.linea, self.columna, c)

            actual += 1
            self.columna += 1

    # --------------------------> <--------------------------------------

    def get_size_lexema_asterisco(self, incio):
        longitud = 0
        for j in range(incio, len(self.entrada) - 1):
            if self.entrada[j] == "\n":
                self.linea += 1
                self.columna = 1
                #print("Salto de linea get_size_lexema")
            if self.entrada[j] == " " or self.entrada[j] == "," or self.entrada[
                    j] == ';' or self.entrada[j] == ':' or self.entrada[
                        j] == "\n" or self.entrada[j] == '<' or self.entrada[
                            j] == '>' or self.entrada[j] == '{' or self.entrada[
                                j] == '}' or self.entrada[
                                    j] == "\t" or self.entrada == "\r":
                break
            longitud += 1
        return longitud

    def get_size_lexema_comentario(self, incio):
        longitud = 0
        for j in range(incio, len(self.entrada) - 1):
            if self.entrada[j] == "\n":
                self.linea += 1
                self.columna = 1
                #print("Salto de linea comentraio")
            if self.entrada[j] == "*" and self.entrada[j + 1] == '/':
                break
            longitud += 1
        return longitud

    def get_lexema(self, inicio, fin):
        palabra = ""
        for x in range(inicio, fin):
            palabra += self.entrada[x]
            _trasBitacora = f"[q4 -> q4 ;{palabra}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            if self.entrada[x] == "\n":
                self.linea += 1
                self.columna = 1
                print("Salto de linea en get_lexema")
            self.columna += 1
        return palabra.lower()

    def add_tokken(self, tipo, valor, color):
        nuevo = TokenCSS(tipo, valor, color)
        self.lista_Tokens.append(nuevo)
        self.caracterActual = ''
        self.lexema = ""

    def add_error(self, posicion, linea, columna, caracter):
        if (caracter == '/' or caracter == '*' or caracter == '{'
                or caracter == '}' or caracter == '"' or caracter == ';'
                or caracter == ':' or caracter == ',' or caracter == '<'
                or caracter == '>' or caracter == '(' or caracter == ')'):
            pass
        else:
            _trasBitacora = f"[NO ACEPTADO ;{caracter}] - [{self.getHora()}] \n"
            self.bitacora += _trasBitacora
            newError = Error_Lexico(posicion, linea, columna, caracter)
            self.lista_error.append(newError)

    def imprimirToken(self):
        for valor in self.lista_Tokens:
            print(
                f"Tipo: {valor.getTipoToken()}; Valor: {valor.getValorToken()}"
            )
            print("--------------------------------------------------------")

    def limpiarCarcateres(self):
        self.caracterActual = ''
        self.lexema = ""
        self.entrada = ""
        self.linea = 1
        self.columna = 1
        self.lista_Tokens = list()
        self.lista_error = list()

    def get_pathComenatrio(self):
        ruta = ''
        for valor in self.lista_Tokens:
            if TipoCSS.COMENTARIO == valor.getTipoToken():
                tokenValor = valor.getValorToken()
                if (tokenValor.find("PATHW")) != -1:
                    if (tokenValor.find("c:") != -1):
                        ruta = tokenValor[tokenValor.find('c:'):tokenValor.
                                          find('*/')].strip()
                        break
                    elif (tokenValor.find("C:") != -1):
                        ruta = tokenValor[tokenValor.find('C:'):tokenValor.
                                          find('*/')].strip()
                        break

        return ruta

    def enviarReporte(self, ruta):
        #self._reporte.genenarte_Graphivz(self.recorrido_automata)
        self._reporte.writeReporte(ruta, self.newEntrada, self.lista_error,
                                   'css')
        self.newEntrada = ''

    def getTime(self):
        time = ""
        time = f"{self.getHora()} - {self.now.day}/{self.now.month}/{self.now.year}"
        return time

    def getBitacora(self):
        return self.bitacora

    def getHora(self):
        time = ""
        minuto = self.now.minute
        if (minuto <= 9):
            minuto = f"0{self.now.minute}"
            time = f"{self.now.hour}:{minuto}.{self.now.second} "
        else:
            time = f"{self.now.hour}:{self.now.minute}.{self.now.second} "

        return time
class Analicis():

    lista_token = list()
    lista_error = list()
    pos_error = {} 
    lexema = "" 
    linea = 1
    columan = 1
    contador = 1
    cont_Comentario = 1
    cont_ComentarioAS = 1
    recorrido_automata = dict()
    newEntrada = ""
    _reporte = Report()

    def __init__(self):
        self.lista_token = list()
        self.lista_error = list()
        self.pos_error = {}
        self.lexema = ""
        self.linea = 1
        self.columan = 1
        self.contador = 1
        self.cont_Comentario = 1
        self.cont_ComentarioAS = 1
        self.recorrido_automata = dict()
        self.newEntrada = ""
        self._reporte = Report()

    def _incio(self,texto):
        self.newEntrada = texto
        self.entrada  = texto + '$'
        self.cacterActual = ''
        posicion = 0

        while posicion < len(self.entrada):
            self.cacterActual = self.entrada[posicion]
            
            
            #q0 -> q1 por que es simbolo :V
            #print(f"Pos{posicion} letra:{self.cacterActual}")
            
            if self.cacterActual == '/' and self.entrada[posicion + 1] == '*':
                self.add_token(Tipo.comenPor,'/*',"gray")
                sizeLexema = self.get_size_lexemaComentario_mul(posicion)
                self.q11(posicion+2,posicion+sizeLexema)
                posicion = posicion + sizeLexema
                

            if self.cacterActual == "{":
                self.add_token(Tipo.llAbre,"{","")
            elif self.cacterActual == "}":
                self.add_token(Tipo.llCier,"}","")
            elif self.cacterActual == "=":
                self.add_token(Tipo.igual,"=","anaranjado")
            elif self.cacterActual == '(':
                self.add_token(Tipo.paAbre,"(","")
            elif self.cacterActual == ")":
                self.add_token(Tipo.paCierr,')',"")
            elif self.cacterActual  == ":":
                self.add_token(Tipo.dpuntos,":","")
            elif self.cacterActual == ";":
                self.add_token(Tipo.pcoma,";","")
            elif self.cacterActual == "+":
                self.add_token(Tipo.mas, "+","anaranjado")
            elif self.cacterActual == "-":
                self.add_token(Tipo.menos, "-","anaranjado")
            #elif self.cacterActual == "/":
                #self.add_token(Tipo.division,"/","white")
            elif self.cacterActual == ">":
                self.add_token(Tipo.mayor,">","anaranjado")
            elif self.cacterActual == "<":
                self.add_token(Tipo.menor,"<","anaranjado")
            elif self.cacterActual == '"':
                self.add_token(Tipo.comiAbre,'"',"yellow")
            elif self.cacterActual == '.':
                self.add_token(Tipo.punto,'.',"")
            elif self.cacterActual == ',':
                self.add_token(Tipo.coma,',',"")
            elif self.cacterActual == "'":
                self.add_token(Tipo.comiSimple,'\'',"yellow")
            elif self.cacterActual == '&' and self.entrada[posicion + 1] == '&':
                self.add_token(Tipo.conjuncion,"&&" ,"anaranjado")
            elif self.cacterActual == '!':
                self.add_token(Tipo.negacion,'!' ,"anaranjado")
            elif self.cacterActual == '|' and self.entrada[posicion + 1 ] == '|':
                self.add_token(Tipo.negacion,'||' ,"anaranjado")
            elif self.cacterActual == '*':
                self.add_token(Tipo.por,'*',"")


            
        
            if self.entrada[posicion - 1] == '"' or self.entrada[posicion - 1] == "'"  or self.cacterActual == "'" or self.cacterActual == '"' :

                #--------------->Graphviz ----------------------------------
                if (self.cont_ComentarioAS < 2):
                    transicion = f"{self.entrada[posicion -1]},q10"
                    self.add_trancisiones("q0",transicion)

                    transicion = f"{self.cacterActual},q5"
                    self.add_trancisiones("q10",transicion)
                #--------------------------------------------------

                sizeLexema = self.get_size_lexemaEspecial(posicion)
                self.q5(posicion,posicion+sizeLexema)
                posicion = posicion + sizeLexema
                if (self.entrada[posicion] == "\n"):
                    self.linea += 1
               



            # q0 -> q1 Si es numero 
            elif self.cacterActual.isnumeric():
                sizeLexema = self.get_size_lexema(posicion)
                self.q2(posicion,posicion +sizeLexema)
                posicion = posicion + sizeLexema


            
            elif self.entrada[posicion - 1] == '/' and self.cacterActual == '/':
                
                #--------------->Graphviz ----------------------------------
                if (self.cont_Comentario < 2):
                    transicion = f"{self.entrada[posicion -1]},q8"
                    self.add_trancisiones("q0",transicion)

                    transicion = f"{self.cacterActual},q6"
                    self.add_trancisiones("q8",transicion)
                #--------------------------------------------------

                sizeLexema = self.get_size_lexemaComentario_un(posicion)
                self.q6(posicion+1,posicion+sizeLexema)
                posicion = posicion + sizeLexema
            
            elif self.entrada[posicion - 1] == '/' and self.cacterActual == '*':


                sizeLexema = self.get_size_lexemaComentario_mul(posicion)
                self.q11(posicion+1,posicion+sizeLexema)
                posicion = posicion + sizeLexema
             
            elif self.cacterActual.isalpha():
                #--------------->Graphviz ----------------------------------
                if (self.contador < 2):
                    transicion = f"{self.cacterActual},q7"
                    self.add_trancisiones("q0",transicion)
                #--------------------------------------------------

                sizeLexema  = self.get_size_lexema(posicion)
                self.analizador_id_reservada(posicion,posicion + sizeLexema);
                posicion = posicion + sizeLexema

            elif self.cacterActual == "\n":
                self.linea += 1
                #print(f" 1 if Salto de linea en :{self.linea}")

            else:
                if self.cacterActual == "$" and posicion == len(self.entrada) -1:
                    print("analicis terminado ..")
                else:
                    if self.cacterActual != " " and self.cacterActual != "\n"  and self.cacterActual != "\t" and self.cacterActual != "\r":
                        if (self.cacterActual != '/'):
                            if(self.cacterActual.isspace() == False and self.is_empty(self.cacterActual) == False):
                                if(self.cacterActual == '&' and self.entrada[posicion - 1] == '&'):
                                    pass
                                elif(self.cacterActual == '|' and self.entrada[posicion - 1] == '|'):
                                    pass
                                else:
                                    #self.pos_error[self.linea] = self.insert_error(posicion,self.cacterActual)
                                    self.add_error(posicion,self.linea,self.columan,self.cacterActual)
            #print(posicion)
            posicion +=1 

        #self.imprimir()
            
        return self.lista_error;

        


    #-----> Estado3 (q2) -------------------

    def q2(self,actual,fin):
        c = ''
        while actual < fin:
            c = self.entrada[actual]
            if c.isnumeric():
                self.lexema += c
                if(actual + 1 == fin):
                    self.add_token(Tipo.valor,self.lexema,"blue")

            else:
                #self.pos_error[self.linea] = self.insert_error(actual,c)
                self.add_error(actual,self.linea,self.columan,c)
            actual +=1
                
    
    #-----> Estado3 (q3) -------------------
    
    def q3(self,actual,fin):
        c = ''
        while actual < fin:
            c = self.entrada[actual]
            if c.isalpha():
                self.lexema += c
                if(actual +1 == fin):
                    self.add_token(Tipo.valor,self.lexema,"blue")
            else:
                #self.pos_error[self.linea] = self.insert_error(actual,c)
                self.add_error(actual,self.linea,self.columan,c)
    

    def analizador_id_reservada(self,actual, fin):
        self.lexema = self.get_lexema(actual,fin).lower()
        
        # q0 -> q3
        if(self.lexema == "var"):
            self.add_token(Tipo._var,"var","red")
            return
        elif(self.lexema == "for"):
            self.add_token(Tipo._for,"for","red")
            return 
        elif(self.lexema == "if"):
            self.add_token(Tipo._if,"if","red")
            return 
        elif(self.lexema == "class"):
            self.add_token(Tipo._class,"class","red")
            return 
        elif(self.lexema == "else"):
            self.add_token(Tipo._else,"else","red")
            return
        elif(self.lexema == "break"):
            self.add_token(Tipo._break,"break","red")
            return 
        elif(self.lexema == "await"):
            self.add_token(Tipo._await,"await","red")
            return
        elif(self.lexema == "case"):
            self.add_token(Tipo._case,"case","red")
            return 
        elif(self.lexema == "catch"):
            self.add_token(Tipo._catch,"catch","red")
            return 
        elif self.lexema == "const":
            self.add_token(Tipo._const,"const","red")
            return 
        elif self.lexema == "continue":
            self.add_token(Tipo._const,"continue","red")
            return
        elif self.lexema == "debugger":
            self.add_token(Tipo._debugger,"debugger","red")
            return
        elif self.lexema == "default":
            self.add_token(Tipo._default,"default","red")
            return
        elif self.lexema == "delete":
            self.add_token(Tipo._delete,"delete","red")
            return
        elif self.lexema == "do":
            self.add_token(Tipo._do,"do","red")
            return
        elif self.lexema == "export":
            self.add_token(Tipo._export,"export","red")
            return
        elif self.lexema == "extends":
            self.add_token(Tipo._extends,"extends","red")
            return
        elif self.lexema == "finally":
            self.add_token(Tipo._finally,"finally","red")
            return
        elif self.lexema == "function":
            self.add_token(Tipo._function,"function","red")
            return
        elif self.lexema == "if":
            self.add_token(Tipo._if,"if","red")
            return
        elif self.lexema == "import":
            self.add_token(Tipo._import,"import","red")
            return 
        elif self.lexema == "in":
            self.add_token(Tipo._in,"in","red")
            return
        elif self.lexema == "instanceof":
            self.add_token(Tipo._instanceof,"instanceof","red")
            return
        elif self.lexema == "new":
            self.add_token(Tipo._new,"new","red")
            return
        elif self.lexema == "return":
            self.add_token(Tipo._return,"return","red")
            return
        elif self.lexema == "super":
            self.add_token(Tipo._super,"super","red")
            return
        elif self.lexema == "switch":
            self.add_token(Tipo._switch,"switch","red")
            return
        elif self.lexema == "this":
            self.add_token(Tipo._this,"this","red")
            return
        elif self.lexema == "throw":
            self.add_token(Tipo._throw,"this","red")
            return
        elif self.lexema == "try":
            self.add_token(Tipo._try,"try","red")
            return
        elif self.lexema == "typeof":
            self.add_token(Tipo._typeof,"typeof","red")
            return
        elif self.lexema == "void":
            self.add_token(Tipo._void,"void","red")
            return
        elif self.lexema == "while":
            self.add_token(Tipo._while,"while","red")
            return
        elif self.lexema == "with":
            self.add_token(Tipo._with,"with","red")
            return
        elif self.lexema == "yield":
            self.add_token(Tipo._yield,"yield","red")
            return
        elif self.lexema == "let":
            self.add_token(Tipo._let,"let","red")
            return
        
        self.lexema = ""
        c = ''
        while actual < fin:
            c = self.entrada[actual]
            
            if c.isalpha():
                #--------------->Graphviz ----------------------------------
                if (self.contador < 2):
                    transicion = f"{self.entrada[actual + 1]},q4"
                    self.add_trancisiones("q7",transicion)
                #--------------------------------------------------
                self.q4(actual,fin)
                break
            
            else:
                #self.pos_error[self.linea] = self.insert_error(actual,c)
                self.add_error(actual,self.linea,self.columan,c)
            actual +=1

    

    def q4(self,actual,fin):
        c = ''
        while actual < fin:
            c = self.entrada[actual]
    
            if c.isalpha():
                self.lexema += c

                #--------------->Graphviz ----------------------------------
                if (self.contador < 2):
                    transicion = f"{c},q4"
                    self.add_trancisiones("q4",transicion)
                #--------------------------------------------------

                if (actual + 1 == fin):
                    self.add_token(Tipo._id,self.lexema,"green")
                    self.contador += 1
            
            elif c.isnumeric():
                self.lexema += c

                #--------------->Graphviz ----------------------------------
                if (self.contador < 2):
                    transicion = f"{c},q4"
                    self.add_trancisiones("q4",transicion)
                #--------------------------------------------------

                if (actual + 1 == fin):
                    self.add_token(Tipo._id,self.lexema,"green")
                    self.contador += 1

            elif c == "_":
                self.lexema +=c

                #--------------->Graphviz ----------------------------------
                if (self.contador < 2):
                    transicion = f"{c},q4"
                    self.add_trancisiones("q4",transicion)
                #--------------------------------------------------

                if(actual + 1 == fin):
                    self.add_token(Tipo._id,self.lexema,"green")
                    self.contador += 1
            else:
                #self.pos_error[self.linea] = self.insert_error(actual,c)
                #print(f"Error lexico :C :{c} in line:{self.linea}")
                self.add_error(actual,self.linea,self.columan,c)

            actual += 1


    def q5(self,actual,fin):
        c = ''
        fin = fin - 1 
        while actual < fin:
            c = self.entrada[actual]
            self.lexema += c

            #--------------->Graphviz ----------------------------------
            if (self.cont_ComentarioAS < 2):
                transicion = f"{c},q5"
                self.add_trancisiones("q5",transicion)
            #--------------------------------------------------

            if(actual + 1 == fin):
                self.add_token(Tipo.valor,self.lexema,"yellow")
                self.cont_ComentarioAS += 1

            actual +=1
    
    def q6(self,actual,fin):
        c = ''
        while actual < fin:
            c = self.entrada[actual]
            self.lexema += c

            #--------------->Graphviz ----------------------------------
            if (self.cont_Comentario < 2):
                transicion = f"{c},q6"
                self.add_trancisiones("q6",transicion)
            #--------------------------------------------------

            if(actual + 1 == fin):
                self.add_token(Tipo.comentario,self.lexema,"gray")
                self.cont_Comentario += 1
            
            actual +=1

    def q11(self,actual,fin):
        c = ''
        while actual < fin:
            c = self.entrada[actual]
            self.lexema += c

            if(actual + 1 == fin):
                self.add_token(Tipo.comentario,self.lexema,"gray")
            
            actual +=1

        

    def get_lexema(self,actual,fin):
        return (self.entrada[actual:fin])


    def add_token(self,tipo,valor,color):
        new  = Token(tipo,valor,color)
        self.lista_token.append(new)
        self.cacterActual = ""
        self.estado = 0
        self.lexema = ""    

    def imprimir(self):
        for valor in self.lista_token:
            print(f"Tipo:{valor.getTipoToken()}, Valor:{valor.getValorToken()}")
            print("--------------")

    


    def get_size_lexema(self, posInicial):
        longitud = 0
        for i in range(posInicial,len(self.entrada) -1 ):
                #if self.entrada[i] == "(" or self.entrada[i] == ")" or self.entrada[i] == " " or self.entrada[i] == "{" or self.entrada[i] == "}" or self.entrada[i] == "," or self.entrada[i] == ";" or self.entrada[i] == ":" or self.entrada[i] == "\n" or self.entrada[i] == "\t" or self.entrada[i] == "\r"  or self.entrada[i] == "=" or self.entrada[i] == '"' or self.entrada[i] == "//" or self.entrada[i] == "/*" or self.entrada[i] == "*/":
            if  self.entrada[i] == '/' or self.entrada[i] == "," or self.entrada[i] == "(" or self.entrada[i] == ")" or self.entrada[i] == " " or self.entrada[i] == "{" or self.entrada[i] == "}" or self.entrada[i] == "," or self.entrada[i] == ";" or self.entrada[i] == ":" or self.entrada[i] == "\n" or self.entrada[i] == "\t" or self.entrada[i] == "\r"  or self.entrada[i] == "=" or self.entrada[i] == "//" or self.entrada[i] == "/*" or self.entrada[i] == "*/" or self.entrada[i] == '.':
                if self.entrada[i] == "\n":
                    self.linea +=1 
                    self.columan = 1 
                    #print(f" size_lexema if Salto de linea en :{self.linea}")
                break
            longitud +=1
        return longitud

    # devuelve la longitul del lexima si esta en "sdf dfad" 
    def get_size_lexemaEspecial(self,inicial):
        longitud = 0
        for i in range(inicial,len(self.entrada) -1 ):
            if self.entrada[i] == "\n":
                self.linea +=1 
                #print(f" size_lexema_Especial if Salto de linea en :{self.linea}")
            if self.entrada[i] == '"' or self.entrada[i] == "'":
                break
            longitud +=1
        return longitud+1
    
    # devuelve la longitul del lexema si esta en un --> comentario uniliniea
    def get_size_lexemaComentario_un(self,inicial):
        longitud = 0
        for i in range(inicial,len(self.entrada) -1 ):
            if self.entrada[i] == "\n":
                self.linea += 1
                #print(f" size_lexema_COmentarioUni if Salto de linea en :{self.linea}")
                break
            longitud +=1
        return longitud

    # devuelve la longitul del lexema si esta en un --> comentario multilinea
    def get_size_lexemaComentario_mul(self,inicial):
        longitud = 0
        for i in range(inicial,len(self.entrada) -1 ):
            if self.entrada[i] == "\n":
                self.linea +=1 
                #print(f" size_lexema_COmentarioMulti if Salto de linea en :{self.linea}")
            if self.entrada[i] == '*' and self.entrada[i + 1] == '/':
                break
            longitud +=1
        return longitud


    def insert_error(self,poscion,letra):
        listaError = self.getListError(self.linea)
        if listaError == None:
            listaError = list()
            listaError.append(letra)
        else:
            listaError.append(letra)

        return listaError;

    def getListError(self,clave):
        for key,value  in self.pos_error.items():
            if clave == key:
                return value
        return None
    
    def getListTokens(self):
        listaClonada = []
        listaClonada = self.lista_token;
        return listaClonada;

    def is_empty(self,data_structure):
        if data_structure:
            #print("No está vacía")
            return False
        else:
            #print("Está vacía")
            return True
    

    #limpia las variables globales para otra ejecucion
    def clear_data(self):
        self.cacterActual = ""
        self.estado = 0
        self.lexema = "" 
        self.entrada = ""
        self.linea = 1
        self.columan = 1
        self.lista_token = list()
        self.lista_error = list()
        self.pos_error = {}

    # ----> Metodos de agregar estados y transiciones  al diccionario para graphviz 
    def add_trancisiones(self,clave,transicion):
        lista_Trancision = self.get_listInDiccionario(clave)
        if lista_Trancision == None:
            lista_Trancision = list()
            lista_Trancision.append(transicion)
        else:
            lista_Trancision.append(transicion)
        
        self.recorrido_automata[clave] = lista_Trancision


    def get_listInDiccionario(self,clave):
        for key,value in self.recorrido_automata.items():
            if key == clave:
                return value
        return None
    
    def add_error(self,posicion,linea,columna,caracter):
        newError = Error_Lexico(posicion,linea,columna,caracter)
        self.lista_error.append(newError)

    def get_pathComentario(self):
        ruta = ''
        for valor in self.lista_token:
            if Tipo.comentario == valor.getTipoToken():
                tokenValor = valor.getValorToken()
                if(tokenValor.find("PATHW")) != -1:
                    if(tokenValor.find("c:") != -1):
                        if(tokenValor.find("*/") != -1):
                            ruta = tokenValor[tokenValor.find('c:'):tokenValor.find('*/')].strip()
                        else:
                            ruta = tokenValor[tokenValor.find('c:'):len(tokenValor)].strip()
                        
                        break
                    elif(tokenValor.find("C:") != -1):
                        if(tokenValor.find("*/") != -1):
                            ruta = tokenValor[tokenValor.find('C:'):tokenValor.find('*/')].strip()
                        else:
                            ruta = tokenValor[tokenValor.find('C:'):len(tokenValor)].strip()
                        break
        
        return ruta
    
    def enviarReporte(self,ruta):
        self._reporte.writeReporte(ruta,self.newEntrada,self.lista_error,'js')
        self._reporte.generate_ReportGraphiv(self.recorrido_automata)
        self.newEntrada = ''
class Sintactico():
    listado_tokens = list()
    pila = list()
    pop_pila = ''
    entrada = ''
    lista_Token = list()
    estado = ''
    cadena = ''
    ireport = Report()
    def __init__(self):
        self.listado_tokens = list()
        self.pila = list()
        self.pop_pila = ''
        self.entrada = ''
        self.lista_Token = list()
        self.estado = ''
        self.cadena = ''
        self.ireport = Report()

    def q0(self,texto):
        print(texto)
        self.cadena = texto
        self.entrada = f"{texto}$"
        self.caracterActual = ''
        self.pila.append('#')
        x = 0
        self.q1(x)
        self.reset_analicis()
        
  
    def q1(self,actual):
        x = actual 
        while x < len(self.entrada):
            self.caracterActual = self.entrada[x]

            if self.caracterActual == '(':
                self.pila.append(self.caracterActual)
            elif self.caracterActual == ')':
                bandera = self.get_pilaPop()
                if bandera != None:
                    self.q3(x+1)
                else:
                    print("Cadena invalida :(")
                break
            elif self.caracterActual.isalpha():
                pass
            elif self.caracterActual.isnumeric():
                pass
            elif self.caracterActual == '*'or self.caracterActual == '/'or self.caracterActual == '+'or self.caracterActual == '-':
                pass

            elif self.caracterActual == '$' and x == len(self.entrada) -1:
                bandera = self.get_pilaPop()
                if bandera != None:
                    if self.pop_pila == '#':
                        print('Cadena valida (:')
                        self.estado = 'Cadena valida (:'
                        
                    else:
                        print("Cadena invalida :(")
                        self.estado = 'Cadena invalida ):'
                else:
                    print("Cadena invalida :(")
                    self.estado = 'Cadena invalida ):'
                break
            x += 1
        

    def q3(self,actual):
        
        while actual < len(self.entrada):
            self.caracterActual = self.entrada[actual]

            if self.caracterActual == ')':
                bandera = self.get_pilaPop()
                if bandera == None:
                    print("Cadena invalida :(")
                    self.estado = 'Cadena invalida ):'
                    break
            elif self.caracterActual == '(':
                self.pila.append(self.caracterActual)
                self.q1(actual + 1)
                break
            elif self.caracterActual == '*'or self.caracterActual == '/'or self.caracterActual == '+'or self.caracterActual == '-':
                pass
            elif self.caracterActual == '$' and actual == len(self.entrada) -1:
                bandera = self.get_pilaPop()
                if bandera != None:
                    if self.pop_pila == '#':
                        print('Cadena Valida (:')
                        self.estado = 'Cadena Valida (:'
                    else:
                        print('Cadena Invalida :c')
                        self.estado = 'Cadena invalida ):'
                else:
                    print('Cadena Invalida :c')
                    self.estado = 'Cadena invalida ):'
                break

            actual += 1


    def q4(self):
        pass


    def get_pilaPop(self):
        size = len(self.pila)
        print(size)
        if size != 0:
            self.pop_pila = self.pila.pop()
            return self.pop_pila
        else:
            return None
    
    def get_estado(self):
        return self.estado,self.cadena

    def reset_analicis(self):
        self.caracterActual = ''
        self.pop_pila = ''
        self.pila = list()

    def getRuta(self):
        filename = ''
        path_SINT = ''
        filename = filedialog.asksaveasfilename(initialdir = "/",title = "Select CSV file",filetypes = (("HTML files","*.html"),("all files","*.*")))
        if filename != '':
            path_SINT = f"{filename}.html" 
        else:
            print("No se selecciono ninguna ruta")
        return path_SINT
    
    def generateReport(self):
        path_SINT = self.getRuta()
        estado,cadena = self.get_estado()
        self.ireport.reporte_sintactico(path_SINT,estado,cadena)
Exemplo n.º 8
0
class Anality_HTML():
    lista_Tokens = list()
    lista_error = list()
    linea = 1
    columna = 1
    lexema = ""
    _reporte = Report()
    newEntrada = ""

    def __init__(self):
        self.lista_Tokens = list()
        self.lista_error = list()
        self.linea = 1
        self.columna = 1
        self.lexema = ""
        self._reporte = Report()
        self.newEntrada = ""

    def read_caracter(self, texto):
        self.newEntrada = texto
        self.entrada = texto + '$'
        self.cActual = ''

        x = 0
        #print("inicio a leer")
        while x < len(self.entrada):
            self.cActual = self.entrada[x]
            print(self.cActual)

            if self.cActual == '<' and self.entrada[
                    x + 1] == '!' and self.entrada[x + 2] == '-':
                if self.entrada[x + 3] == '-':
                    size_lexama = self.get_size_lexemaComentario(x)
                    self.q4(x, x + size_lexama + 3)
                    x = x + size_lexama

            elif self.cActual == '<' and self.entrada[x + 1] == '!':
                size_lexema = self.get_size_lexema(x)
                self.q1(x, x + size_lexema)
                x = x + size_lexema

            elif self.cActual == '<':
                size_lexema = self.get_size_lexema(x)
                self.q1(x, x + size_lexema)
                x = x + size_lexema

            elif self.cActual.isalpha() or self.cActual.isnumeric():
                size_lexema = self.get_size_lexemaValor(x)
                self.q3(x, x + size_lexema)
                print(f"antes de la suma:{x}")
                x = x + (size_lexema - 1)

            elif self.cActual == "\n" or self.cActual == " " or self.cActual == "\t" or self.cActual == "\t":
                if self.cActual == "\n":
                    self.linea += 1
                    self.columna = 1
                    print("Salto de linea principal")

                x += 1
                self.columna += 1
                continue

            else:
                if self.cActual == "$" and x == len(self.entrada) - 1:
                    print("Analicis Terminado")
                else:
                    pass

            x += 1
            self.columna += 1

        #self.imprimir_token()
        return self.lista_error

    def q1(self, actual, fin):
        c = ''
        while actual < fin:
            c = self.entrada[actual]
            if c.isnumeric():
                self.lexema += c
                if (actual + 1 == fin):
                    self.add_token(TipoHTML.ID, self.lexema, "")
            elif c == '!':
                self.lexema += c
            elif c.isalpha():
                self.lexema += c
                if (actual + 1 == fin):
                    self.add_token(TipoHTML.ID, self.lexema, "")
            elif c == '/':
                self.lexema += c
                if (actual + 1 == fin):
                    self.add_token(TipoHTML.ID, self.lexema, "")
            elif c == '=':
                self.lexema += c
                if (actual + 1 == fin):
                    self.add_token(TipoHTML.ID, self.lexema, "")
            elif c == '\n' or c == ' ' or c == "\t":
                self.lexema += c
                if (actual + 1 == fin):
                    self.add_token(TipoHTML.ID, self.lexema, "")
            elif c == '"' or c == "'":
                self.lexema += c
                if (actual + 1 == fin):
                    self.add_token(TipoHTML.ID, self.lexema, "")
                else:
                    self.q2(actual + 1, fin)
                    break
            else:
                print(actual)
                self.add_error(actual, self.linea, self.columna, c)
                if (actual + 1 == fin):
                    self.add_token(TipoHTML.ID, self.lexema, "")

            actual += 1
            self.columna += 1

    def q2(self, actual, fin):
        while actual < fin:
            c = self.entrada[actual]

            if c == '"' or c == "'":
                self.lexema += c
                if (actual + 1 == fin):
                    self.add_token(TipoHTML.ID, self.lexema, "")
                else:
                    self.q1(actual + 1, fin)
                    break
            else:
                self.lexema += c

            actual += 1
            self.columna += 1

    def q3(self, actual, fin):
        while actual < fin:
            c = self.entrada[actual]
            self.lexema += c
            if (actual + 1 == fin):
                self.add_token(TipoHTML.VALOR, self.lexema, '')

            actual += 1

    def q4(self, actual, fin):
        while actual < fin:
            c = self.entrada[actual]
            self.lexema += c
            if (actual + 1 == fin):
                self.add_token(TipoHTML.COMENTARIO, self.lexema, 'gray')

            actual += 1

    def get_lexema(self, actual, fin):
        poscicion = self.entrada[actual:fin].find(" ")
        if (poscicion == -1):
            return (self.entrada[actual:fin], '', actual)
        else:
            return (self.entrada[actual:poscicion],
                    self.entrada[poscicion + 1:fin], poscicion + 1)

    def get_pathComentario(self):
        print("Analizando Comentario")
        ruta = ''
        for valor in self.lista_Tokens:
            if TipoHTML.COMENTARIO == valor.getTipoToken():
                tokenValor = valor.getValorToken()

                posicion = tokenValor.find("PATHW")
                if posicion != -1:
                    if (tokenValor.find("c:") != -1):
                        ruta = tokenValor[tokenValor.find('c:'):tokenValor.
                                          find('-->')].strip()
                        break
                    elif (tokenValor.find("C:") != -1):
                        ruta = tokenValor[tokenValor.find('C:'):tokenValor.
                                          find('-->')].strip()
                        break
        #print(ruta)
        return ruta

    def add_token(self, tipo, valor, color):
        nuevo = TokenHTML(tipo, valor, color)
        self.lista_Tokens.append(nuevo)
        self.cActual = ''
        self.lexema = ""

    def add_error(self, posicion, linea, columna, caracter):
        if (caracter == '<' or caracter == '>'):
            pass
        else:
            newError = Error_Lexico(posicion, linea, columna, caracter)
            self.lista_error.append(newError)

    def imprimir_token(self):
        for valor in self.lista_Tokens:
            print(
                f"Tipo: {valor.getTipoToken()}; Valor: {valor.getValorToken()}"
            )
            print("--------------------------------------------------------")

    def get_size_lexema(self, incio):
        longitud = 0
        for j in range(incio, len(self.entrada) - 1):
            if self.entrada[j] == "\n":
                self.linea += 1
                self.columna = 1
                print(f"Salto de linea comentrio {self.linea} ")
            if self.entrada[j] == '>':
                break
            longitud += 1
        return longitud

    def get_size_lexemaComentario(self, incio):
        longitud = 0
        for j in range(incio, len(self.entrada) - 1):
            if self.entrada[j] == "\n":
                self.linea += 1
                self.columna = 1
                print(f"Salto de linea comentrio {self.linea} ")
            if self.entrada[j] == '-' and self.entrada[
                    j + 1] == '-' and self.entrada[j + 2] == '>':
                break
            longitud += 1
        return longitud

    def get_size_lexemaValor(self, inicio):
        longitud = 0
        for j in range(inicio, len(self.entrada) - 1):
            if self.entrada[j] == "\n":
                self.linea += 1
                self.columna = 1
                print(f"Salto de linea comentrio {self.linea} ")
            if self.entrada[j] == '<':
                break
            longitud += 1
        return longitud

    def enviarReporte(self, ruta):
        #self.reporte.writeReporte(ruta,self.newEntrada,self.lista_error)
        print("Enviar Reporte")
        self._reporte.writeReporte(ruta, self.newEntrada, self.lista_error,
                                   'html')

    def limpiarCaracter(self):
        self.cActual = ''
        self.lexema = ""
        self.lista_Tokens = list()
        self.lista_error = list()
        self.linea = 1
        self.columna = 1
        self.entrada = ''
        print('se limpio el carcater')