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))
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))
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)
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
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()
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))
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
def on_clickCleanResults(self): print('Limpiar resultados') self.textEditprocessedSourceCode.clear() BaseASTNode.clean_result()