def visitIterable_filter(self, ctx): iterab = super(GramaticaExtVisitor, self).visit(ctx.iterable()) if iterab == None: ln = -1 self.raiseError(ln, 'Error al evaluar el iterador', "iterator-eval") if iterab.tipo != "ITERATOR": ln = -1 self.raiseError(ln, 'El objeto especificado no es de tipo iterable', "iterable-expected") if iterab.subtipo == "TUPLE": ln = -1 self.raiseError( ln, 'No es posible realizar un recorrido sobre una tupla', "iterable-tuple") filtrada = None if iterab.subtipo == "LIST": filtrada = [] else: filtrada = {} self.tablaDeSimbolosActual = TablaSimbolos( self.tablaDeSimbolosActual, self.tablaDeSimbolosActual.contexto) for tmp in iterab.valor: ac = None ty = None if iterab.subtipo == "LIST": ac = tmp.valor ty = tmp.tipo else: ac = iterab.valor[tmp].valor ty = iterab.valor[tmp].tipo simbolo = Simbolo(ctx.lambda_test().NAME(), ty, ac) self.tablaDeSimbolosActual.agregarSimbolo(simbolo.nombre, simbolo) res = super(GramaticaExtVisitor, self).visit(ctx.lambda_test().test()) if res.tipo != "BOOL": ln = -1 self.raiseError( ln, 'No es posible filtrar bajo la funcion especificada', "lambda-filter-error") if res.valor == True and iterab.subtipo == "LIST": filtrada.append(tmp) elif res.valor == True and iterab.subtipo == "MAP": filtrada[tmp] = iterab.valor[tmp] self.tablaDeSimbolosActual = self.tablaDeSimbolosActual.destruirTabla() nodo = Nodo() nodo.subtipo = iterab.subtipo nodo.tipo = "ITERATOR" nodo.valor = filtrada print(nodo) return nodo
def evaluarFuncion(self, ctx): simbolo = self.tablaDeSimbolosActual.resolver(ctx.NAME()) if simbolo == None: ln = -1 self.raiseError(ln, 'Error en el simbolo', ctx.NAME()) if simbolo.tipo != "FUNCION": ln = -1 self.raiseError( ln, 'Error, el simbolo no puede ser evaluado como una funcion', ctx.NAME()) parametros = [] if ctx.parameters() != None: parametros.append(ctx.parameters().test()) if len(ctx.parameters().sub_parameters()) > 0: for param in ctx.parameters().sub_parameters(): parametros.append(param.test()) if len(parametros) != len(simbolo.argumentos): ln = -1 self.raiseError(ln, "Error en la cantidad de parametros", ctx.NAME()) nuevaTablaSimbolos = TablaSimbolos( None, self.tablaDeSimbolosActual.contexto + 1) for i in xrange(0, len(parametros)): argument = self.evaluarArgumento(parametros[i]) #print("argumento: "+str(argument)) simboloNuevo = Simbolo(simbolo.argumentos[i], argument[0], argument[1]) nuevaTablaSimbolos.agregarSimbolo(simbolo.argumentos[i], simboloNuevo) nuevaTablaSimbolos.padre = self.tablaDeSimbolosActual self.tablaDeSimbolosActual = nuevaTablaSimbolos ret = super(GramaticaExtVisitor, self).visit(simbolo.valor) self.tablaDeSimbolosActual = self.tablaDeSimbolosActual.destruirTabla() print("Evaluando: " + str(ctx.NAME()) + " con valor de retorno " + str(ret)) if ret != self._NONE: return ret return self._NONE
def visitFor_stmt(self, ctx): nm = ctx.NAME() iterab = super(GramaticaExtVisitor, self).visit(ctx.iterable()) if iterab == None: ln = -1 self.raiseError(ln, 'No es posible obtener el iterable', "iterable-gen") elif iterab.tipo != "ITERATOR": ln = -1 self.raiseError(ln, 'El simbolo no es iterable', "iterable-expected") elif iterab.subtipo == "TUPLE": ln = -1 self.raiseError( ln, 'No es posible realizar un recorrido sobre una tupla', "iterable-tuple") self.tablaDeSimbolosActual = TablaSimbolos( self.tablaDeSimbolosActual, self.tablaDeSimbolosActual.contexto) self.tablaDeSimbolosActual.agregarSimbolo(nm, Simbolo(nm, None, None)) for tmp in iterab.valor: self.tablaDeSimbolosActual.agregarSimbolo( nm, Simbolo(nm, tmp.tipo, tmp.valor)) self.evaluarInstrucciones(ctx.stmt()) self.tablaDeSimbolosActual = self.tablaDeSimbolosActual.destruirTabla()
def ejecutar_analisis(self): #self.consola.setText("****** Preparando Analisis ******") self.consola.clear() indextab = self.editores.tabText(self.editores.currentIndex()) ##self.consola.setText("Archivo a analizar: "+indextab) tab = self.editores.widget(self.editores.currentIndex()) items = tab.children() codigo = items[0].toPlainText() ast = None analisis_semantico = False lst = [] print( "___________INICIA PROCESO DE ANALISIS LEXICO Y SINTACTICO_______________" ) try: if self.analizador_cambiado: gramaticaD.lst_errores = [] ast = gramaticaD.parse(codigo) arbolparser = GramaticaDG.parse(codigo) graficaAST = GraficarArbol(args=(arbolparser, "ASPDescendente"), daemon=True) graficaAST.start() graficaGramatical = GraficarGramatica( args=(gramaticaD.lstGrmaticales, "ReporteGramatical"), daemon=True) graficaGramatical.start() lst = gramaticaD.lst_errores gramaticaD.lstGrmaticales = [] else: gramatica.lst_errores = [] ast2 = gramatica.parse(codigo) ast = ast2.instruccion graficaAST = GraficarArbol(args=(ast2.nodo, "ASPAscendente"), daemon=True) graficaAST.start() graficaGramatical = GraficarGramatica( args=(gramatica.lstGrmaticales, "ReporteGramatical"), daemon=True) graficaGramatical.start() gramatica.lstGrmaticales = [] lst = gramatica.lst_errores except: self.consola.append( "/\\/\\/\\/\\/\\ERROR DE LEXICO, SINTACTICO/\\/\\/\\/\\") self.consola.append("REVISAR REPORTE DE ERRORES") finally: if not self.analizador_cambiado: gramatica.graficarErrores() else: gramaticaD.graficarErrores() ts = TablaSimbolos() global in_console if self.debug_mode: in_console = Debuger(args=(ast if (ast != None) else ast, ts, lst, "", items[0], self.consola, self.GTS), daemon=True) else: in_console = Ejecutor(args=(ast if (ast != None) else ast, ts, lst, "", items[0], self.consola, self.GTS), daemon=True) if ast != None: try: print( "___________INICIA PROCESO DE ANALISIS SEMANTICO_______________" ) recolector = Recolectar(ast, ts, lst) print("******FIN CONSTRUCTOR**********") recolector.procesar() recolector.getErrores() print("******FIN RECOLECCION*******") print("********** FIN DE CONSTRUCTOR ********") in_console.start() except: self.consola.append( "/\\/\\/\\/\\/\\ERROR DE EJECUCION/\\/\\/\\/\\") self.consola.append("REVISAR REPORTE DE ERRORES") ts.graficarSimbolos()
import ply.lex as lex from ply.lex import TOKEN import sys import re from TablaSimbolos import TablaSimbolos from TablaSimbolos import Fun from gramatica import parser import gramatica lexema = "" tipo = None comentario = False tabla_simbolos = TablaSimbolos() estoy_en_fun = False #sirve para indicar si voy a leer una funcion flagFor = False flagFor2 = False contador = 0 contReturn = 0 contParentesis_1 = 0 flagIf = False metaFlagIf = False flagExpresion = False anotherFlag = False opEsp = False checkParentesis = False funPass = False listaExpresion = [] listaTokens = [] #Para pasarle al sintactico funcion = Fun() funcionAux = Fun() tipos = (
def __init__(self): self.contextoActual = 0 self.pilaValores = collections.deque() self.tablaDeSimbolosActual = TablaSimbolos(None,0)
def __init__(self, an): #super(GramaticaExtListener,self) self.tablaDeSimbolosActual = TablaSimbolos(None, 0) self.pilaValores = collections.deque() self.an = an