Esempio n. 1
0
class AnalizadorSintactico:
    def __init__(self):
        self.gramatica = SeparadorGramatica()
        self.lexico = AnalizadorLexico()
        self.matriz = [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0],
                       [0, 4, 3, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0],
                       [0, 0, 5, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 0],
                       [0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 10, 0, 9, 0, 0, 0, 0],
                       [0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0],
                       [0, 0, 0, 0, 12, 0, 0, 13, 0, 0, 0, 0, 0, 0],
                       [0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0],
                       [0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 15, 15, 0],
                       [0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 19, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 0],
                       [22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

    def lldriver(self):
        if len(self.lexico.tabla_errores
               ) > 0:  #si la tabla de errores esta vacia, continua
            return

        no_terminales = self.gramatica.no_terminales  #lista columnas
        terminales = self.gramatica.terminales  #lista filas
        stack = ['program']  #introduce simbolo inicial en pila vacia
        x = stack[0]  #asigna x a la parte alta de la pila
        a = self.lexico.siguiente()  #asigna a el token de entrada
        print(x, a)  #imprime parte alta de pila y token a leer

        while len(stack) > 0:  #mientras la pila no este vacia
            if x in self.gramatica.no_terminales:  #si x esta en los no terminales
                if self.matriz[no_terminales.index(x)][terminales.index(
                        a)] != 0:  #y si la posicion de a y x no es 0
                    produccion = self.gramatica.get_produccion(self.matriz[
                        no_terminales.index(x)][terminales.index(a)] - 1)
                    #print(produccion)
                    x = produccion[0]
                    # Ciclo de push
                    for element in produccion:
                        stack.append(element)
                else:
                    print('Error de sintáxis 1')  #simbolo inexistente
                    #print(stack) #imprime la pila
                    return
            else:
                if x == a:
                    #print(stack)
                    stack.pop()
                    a = self.lexico.siguiente()
                else:
                    print('Error de sintáxis 2')
                    #print(stack)
                    return

        print('Sintáxis correcta')
Esempio n. 2
0
 def __init__(self):
     self.gramatica = SeparadorGramatica()
     self.lexico = AnalizadorLexico()
     self.matriz = [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0],
                    [0, 4, 3, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0],
                    [0, 0, 5, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 0],
                    [0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0, 10, 0, 9, 0, 0, 0, 0],
                    [0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0],
                    [0, 0, 0, 0, 12, 0, 0, 13, 0, 0, 0, 0, 0, 0],
                    [0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0],
                    [0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 15, 15, 0],
                    [0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 19, 0, 0, 0],
                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 0],
                    [22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
Esempio n. 3
0
    def __init__(self):

        self.caracteres_simples = (',', ';', '.', ':', '{', '}', '[', ']', '(',
                                   ')', '&', '%', '+', '-', '*', '/', '!', '|',
                                   '=', '>', '<', '"', '\'')
        self.gramatica = SeparadorGramatica()
        self.lexico = AnalizadorLexico()
        self.matriz = [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0],
                       [0, 4, 3, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0],
                       [0, 0, 5, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 0],
                       [0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 10, 0, 9, 0, 0, 0, 0],
                       [0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0],
                       [0, 0, 0, 0, 12, 0, 0, 13, 0, 0, 0, 0, 0, 0],
                       [0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0],
                       [0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 15, 15, 0],
                       [0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 19, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 0],
                       [22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
Esempio n. 4
0
 def __init__(self):
     self.gramatica = SeparadorGramatica()
     self.lexico = AnalizadorLexico()
     self.matriz = [[
         1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         0, 0
     ],
                    [
                        2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0
                    ],
                    [
                        3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0
                    ],
                    [
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        4, 4, 4, 4, 4, 4, 0
                    ],
                    [
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5,
                        6, 6, 6, 6, 6, 6, 6
                    ],
                    [
                        7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0
                    ],
                    [
                        0, 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, 0, 0, 0, 0,
                        0, 0, 0, 0, 0, 0, 0, 0, 0
                    ],
                    [
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 19, 20, 21, 22,
                        23, 0, 0, 0, 0, 0, 0, 0
                    ],
                    [
                        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                        24, 25, 26, 27, 28, 29, 0
                    ]]
Esempio n. 5
0
    def iniciar(self):

        analizador_lexico = AnalizadorLexico()

        if int(sys.argv[1]) == 0:
            archivo_prueba = open('mi_cancion.dje', 'r')
            analizador_lexico.analizar(archivo_prueba.read())
        else:
            while True:
                cadena = input('Ingresa una cadena: ')
                analizador_lexico.analizar(cadena)
                if input('otra? s/N') != 's':
                    break
Esempio n. 6
0
 def __init__(self):
     self.g = Separador()
     self.lexico = AnalizadorLexico()
Esempio n. 7
0
class AnalizadorSintactico:
    def __init__(self):
        self.gramatica = SeparadorGramatica()
        self.lexico = AnalizadorLexico()
        self.matriz = [[
            1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0
        ],
                       [
                           2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                           0, 0, 0, 0, 0, 0, 0
                       ],
                       [
                           3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                           0, 0, 0, 0, 0, 0, 0
                       ],
                       [
                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                           4, 4, 4, 4, 4, 4, 0
                       ],
                       [
                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 5,
                           6, 6, 6, 6, 6, 6, 6
                       ],
                       [
                           7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                           0, 0, 0, 0, 0, 0, 0
                       ],
                       [
                           0, 0, 0, 0, 11, 12, 13, 14, 15, 16, 17, 0, 0, 0, 0,
                           0, 0, 0, 0, 0, 0, 0, 0, 0
                       ],
                       [
                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 19, 20, 21, 22,
                           23, 0, 0, 0, 0, 0, 0, 0
                       ],
                       [
                           0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
                           24, 25, 26, 27, 28, 29, 0
                       ]]

    def lldriver(self):
        if len(self.lexico.tabla_errores) > 0:
            return

        no_terminales = self.gramatica.no_terminales
        # terminales = self.gramatica.terminales
        stack = []
        stack.append('inicio')
        x = stack[0]
        a = self.lexico.siguiente()
        vacio = 'E'

        while len(stack) > 0:
            x = stack[len(stack) - 1]
            if x in no_terminales:
                if self.predict(x, a) != 0:
                    produccion = self.gramatica.get_produccion(
                        self.predict(x, a) - 1)
                    x = produccion[0]
                    stack.pop()
                    # Ciclo de push
                    produccion.reverse()
                    for element in produccion:
                        stack.append(element)
                else:
                    print('Error de sintáxis 1')
                    return
            else:
                if x == vacio:
                    stack.pop()
                elif x == a:
                    stack.pop()
                    a = self.lexico.siguiente()
                    if a == '$':
                        break
                else:
                    print('Error de sintáxis 2')
                    return
        print('Sintáxis correcta')

    def predict(self, x, a):
        return self.matriz[self.gramatica.no_terminales.index(x)][
            self.gramatica.terminales.index(a)]
Esempio n. 8
0
class AnalizadorSintactico:
    def __init__(self):

        self.caracteres_simples = (',', ';', '.', ':', '{', '}', '[', ']', '(',
                                   ')', '&', '%', '+', '-', '*', '/', '!', '|',
                                   '=', '>', '<', '"', '\'')
        self.gramatica = SeparadorGramatica()
        self.lexico = AnalizadorLexico()
        self.matriz = [[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0],
                       [0, 4, 3, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 0],
                       [0, 0, 5, 0, 0, 6, 0, 0, 7, 0, 0, 0, 0, 0],
                       [0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 10, 0, 9, 0, 0, 0, 0],
                       [0, 0, 11, 0, 0, 0, 11, 0, 0, 0, 11, 0, 0, 0],
                       [0, 0, 0, 0, 12, 0, 0, 13, 0, 0, 0, 0, 0, 0],
                       [0, 0, 14, 0, 0, 0, 14, 0, 0, 0, 14, 0, 0, 0],
                       [0, 0, 0, 0, 16, 0, 0, 16, 0, 0, 0, 15, 15, 0],
                       [0, 0, 18, 0, 0, 0, 17, 0, 0, 0, 19, 0, 0, 0],
                       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 0],
                       [22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

    def lldriver(self):

        no_terminales = self.gramatica.no_terminales  #columnas de no terminales
        stack = []  #pila vacia
        stack.append('program')  #agrega simbolo inicial a pila
        x = stack[0]  #Asigna x a inicio de pila
        a = self.lexico.siguiente()  #asigna a a simbolo a leer
        vacio = 'E'  #vacio es E

        while len(stack) > 0:  #mientras la pila no este vacia
            x = stack[len(stack) - 1]  #asigna x a ultimo elemento en pila -1
            #print('----------------------------',x, 'es el ultimo en pila-----------------------------------')
            if x in no_terminales:  #si x esta en no terminales
                if self.predict(
                        x, a
                ) != 0:  #si la ocurrencia entre ultimo pila y simbolo a leer no es 0
                    print('ocurrencia ', self.predict(x, a), ' entre ', x,
                          ' y ', a, '\n')

                    #print('-----------------------',stack, 'pila')
                    produccion = self.gramatica.get_produccion(
                        self.predict(x, a) -
                        1)  #lista de las producciones a leer
                    x = produccion[0]
                    print('producciones a leer ', produccion)
                    print('-----------------------', stack, 'pila')
                    stack.pop()  #saca la produccion al tope de la pila
                    #print('-------------------------------hice pop-------------------------------------------')
                    # Ciclo de push
                    produccion.reverse()  #invierte lista de producciones
                    for element in produccion:  #para cada elemento en produccion
                        if (a == '(' or a == ')'):
                            continue
                        stack.append(element)  #agregalo al final de la pila
                        #print('---------------------agregue en pila a', element,'--------------------------------')
                        print(stack, 'nueva pila')
                else:
                    print('Error de sintáxis 1')
                    #print(stack)
                    return
            else:
                if x == vacio or x == '(' or x == ')':

                    stack.pop()
                elif x == a:
                    stack.pop()
                    a = self.lexico.siguiente()
                    if a == "end":
                        print("encontre end")
                        break
                else:
                    print('Error de sintáxis 2')
                    print("x es ", x, " por eso no esntra al if")
                    return
        print('Sintáxis correcta')

    def predict(self, x, a):  #devuelve simbolo de ocurrencia que pides
        return self.matriz[self.gramatica.no_terminales.index(x)][
            self.gramatica.terminales.index(a)]