示例#1
0
    def on_clickInterpreter(self):
        self.textEditprocessedSourceCode.clear()
        BaseASTNode.clean_result()
        # Limpio la variable resultado, ya que de tener un valor es de la ejecucion anterior
        BaseASTNode.clean_result()
        # Create lexer
        print("Tokenizando...")
        lexer = ToyLexer()
        # print(self.textEditSourceCode.toPlainText())
        # Create parser
        print("Parseando...")
        parser = ToyParser()
        # ast es el arbol AST expresado a traves de un objeto principal Statements
        ast = parser.parse(
            lexer.tokenize(self.textEditSourceCode.toPlainText()))
        try:
            ast.eval()
        except ValueError as valueError:
            print("Error Semantico; {0}".format(valueError))
        except AttributeError as attributeError:
            # ValueError, TypeError, NameError,
            print("Error Sintactico; {0}".format(attributeError))
        except:
            print("Error inesperado:", sys.exc_info()[0])

        # Imprimiendo el resultado de la lista de resultados del programa
        for op in BaseASTNode.get_result():
            self.textEditprocessedSourceCode.appendPlainText(str(op))
示例#2
0
 def get_symbol(self, symbol):
     # Una vez que consulto el elemento, debo tener cuidado de no eliminarlo de la pila
     heap = self.symbols.get(symbol)
     if heap:
         value = heap.desapilar()
         heap.apilar(value)
         return value
     else:
         BaseASTNode.add_result(
             "Error Semantico; Variable {} no fue declarada o no se encuentra dentro del scope"
             .format(symbol))
         raise ValueError(
             "Error Semantico; Variable {} no fue declarada o no se encuentra dentro del scope"
             .format(symbol))
示例#3
0
    def on_clickTokenizar(self):
        print('Tokenizer button click')
        self.textEditprocessedSourceCode.clear()
        BaseASTNode.clean_result()
        # Create lexer
        print("Tokenizando...")
        lexer = ToyLexer()
        try:
            for tok in lexer.tokenize(self.textEditSourceCode.toPlainText()):
                BaseASTNode.add_result('TOKEN: {token:'
                                       '<15} {val:'
                                       '>15}'.format(token=tok.type,
                                                     val=tok.value))
        except (ValueError, RuntimeError, TypeError, NameError):
            print('Error tokenizando entrada')

        for op in BaseASTNode.get_result():
            self.textEditprocessedSourceCode.appendPlainText(op)
示例#4
0
    def remove_scope_variables(self, scope):
        # Si los hay, elimino todos los objetos del scope actual

        # print('Imprimiendo todas las variables del la tabla de simbolos')
        # for sym in self.symbols.keys():
        #     print('Variable : ' + str(sym)
        #           + ' = ' + str(self.get_symbol(sym).get_value())
        #           + ' - ' + self.get_symbol(sym).get_type()
        #           + ' - ' + self.get_symbol(sym).get_location()
        #           + ' - ' + str(self.get_symbol(sym).get_scope()))

        #print('Eliminado elementos para el scope objetivo:' + str(scope))
        # Itero a traves del diccionario mediante una lista. Esto me permite editar la estructura mientras la recorro
        for sym in list(self.symbols):
            # Desapilo elementos de cada una de las Pilas, para ver si corresponden al Scope, en cuyo caso
            # las elimina, caso contrario las deja
            heap = self.symbols.get(sym)
            # Una vez creada una entrada en el diccionario la Pila siempre existe, aunque puede estar varia
            if heap is None:
                raise ValueError(
                    "Error Semantico; Entrada en diccionario sin definicion de Pila"
                    .format(sym))
                BaseASTNode.add_result(
                    "Error Semantico; Entrada en diccionario sin definicion de Pila"
                    .format(sym))
            else:
                same_value_and_scope = True
                while same_value_and_scope:
                    # Tengo que desapilar los variables repetidas
                    value = heap.desapilar()
                    # Si el elemento desapilado no corresponde al scope lo vuelvo a apilar
                    # Asumo que los elementos de la arriba de la Pila son de scopes superiores, por lo tanto cuando encuentro
                    # un elemento con scope diferente salgo
                    if not scope == value.get_scope():
                        heap.apilar(value)
                        same_value_and_scope = False
                    # else:
                    # print('Se elimino variable :' + value.get_name())
                    # Siempre que la Pila este vacia elimino la entrada del diccionario
                    if heap.es_vacia():
                        # Si la Pila esta vacia, porque acabo de eliminar el unico elemento que tenia, puedo
                        # asumir que voy a eliminar una entrada en el diccionario que siempre existe
                        del self.symbols[sym]
                        same_value_and_scope = False
示例#5
0
def main():
    content = ""  # Esta variable mandendra el contenido del archivo de entrada leido
    path = os.getcwd()

    print('|-|-|-|-|-|-|-|-|-|-|-|-|-|-  Starting Interpreter  |-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|- \n')
    print("Leyendo archivo...")

    # Verifico que el usuario haya ingresado el nombre del archivo como parametro
    try:
        fileName = sys.argv[1]
    except:
        print(
            "[ERROR] Se esperaba el nombre de archivo, como parametro para iniciar procesamiento, por ejemplo: 'demo.x'")
        return

    # Chequeo si la extension del archivo es correcta
    if fileName[len(fileName) - 2:len(fileName)] != ".x":
        print("[ERROR] Extension de archivo no reconocida, asegurese que la extension del archivo sea '.x'")
        return

    # Abre el archivo de entrada (en modo lectura) y lo graba en la variable 'content'
    try:
        with open(path + "/" + fileName, "r") as sourceCodeFile:
            content = sourceCodeFile.read()
    except:
        print('[ERROR] No se puede encontrar el archivo "' + fileName + '"')

    # Create lexer
    print("Tokenizando...")
    lexer = ToyLexer()

    for tok in lexer.tokenize(content):
        BaseASTNode.add_result(
            'LEXEMA: {token:' '<15} {val:' '>15}'.format(token=tok.type, val=tok.value))

    # Create parser
    print("Parseando...")
    parser = ToyParser()
    # ast es el arbol AST expresado a traves de un objeto principal Statements
    ast = parser.parse(lexer.tokenize(content))
    # Inicializacion del arbol AST y evaluacion del mismo son instantes diferentes, no mezclar ni confundir
    ast.eval()
示例#6
0
 def set_symbol_value(self, symbol, value):
     # Value es el valor de un IDentificador. Busco el ID en el diccionario
     # Cuando se elimina el elemento de la pila se debe eliminar tambien del diccionario
     if symbol in self.symbols.keys():
         # La Pila debe existir si o si
         heap = self.symbols[symbol]
         if heap:
             sw = heap.desapilar()
             if sw:
                 # Seteo el valor y vuelvo a apilar el elemento
                 sw.set_value(value)
                 heap.apilar(sw)
             else:
                 BaseASTNode.add_result(
                     "Error Semantico; Variable {} no posee su estructura de datos interna con datos"
                     .format(symbol))
                 raise ValueError(
                     "Error Semantico; Variable {} no posee su estructura de datos interna con datos"
                     .format(symbol))
         else:
             BaseASTNode.add_result(
                 "Error Semantico; Variable {} no posee su estructura de datos interna asociada"
                 .format(symbol))
             raise ValueError(
                 "Error Semantico; Variable {} no posee su estructura de datos interna asociada"
                 .format(symbol))
     else:
         BaseASTNode.add_result(
             "Error Semantico; Variable {} no fue declarada".format(symbol))
         raise ValueError(
             "Error Semantico; Variable {} no fue declarada".format(symbol))
示例#7
0
 def error(self, t):
     columna = self.find_column(self.text, t)
     BaseASTNode.add_result(
         'Error en Lexer; Caracter inesperado. Linea {}, Columna {}, Valor {} '
         .format(self.lineno, columna, t.value[0]))
     self.index += 1
示例#8
0
 def on_clickCleanResults(self):
     print('Limpiar resultados')
     self.textEditprocessedSourceCode.clear()
     BaseASTNode.clean_result()