Ejemplo n.º 1
0
 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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
 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()
Ejemplo n.º 4
0
    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()
Ejemplo n.º 5
0
Archivo: main.py Proyecto: rv0lt/PDL
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 = (
Ejemplo n.º 6
0
 def __init__(self):
     self.contextoActual = 0
     self.pilaValores = collections.deque()
     self.tablaDeSimbolosActual = TablaSimbolos(None,0)
Ejemplo n.º 7
0
 def __init__(self, an):
     #super(GramaticaExtListener,self)
     self.tablaDeSimbolosActual = TablaSimbolos(None, 0)
     self.pilaValores = collections.deque()
     self.an = an