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')
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 __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 __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 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
def __init__(self): self.g = Separador() self.lexico = AnalizadorLexico()
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)]
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)]