def traducir(self, ent, arbol, ventana): condicion3D = self.condicion.traducir(ent, arbol, ventana) if (condicion3D == None): return None if (condicion3D.codigo3D != ""): ventana.editor.append("\n" + condicion3D.codigo3D) etiquetaSalida = temp.etiqueta() etiquetaDefault = temp.etiqueta() temp.listaBreak(0, etiquetaSalida) listaElseIf = [] #SE CARGAN LAS ETIQUETAS DE LOS CASE Y SE IMPRIMEN LAS CONDICIONES for ins in self.lista_case: etiquetaTrueElseIf = temp.etiqueta() resultConditionElseIf = ins.condicion.traducir(ent, arbol, ventana) if (resultConditionElseIf == None): return None if (resultConditionElseIf.codigo3D != ""): ventana.editor.append("\n" + resultConditionElseIf.codigo3D) ventana.editor.append("\n" + "if(" + condicion3D.temporal.utilizar() + "==" + resultConditionElseIf.temporal.utilizar() + ") goto " + etiquetaTrueElseIf + ";") listaElseIf.append(etiquetaTrueElseIf) if (self.default != None): ventana.editor.append("\n" + "goto " + etiquetaDefault + ";") else: ventana.editor.append("\n" + "goto " + etiquetaSalida + ";") contador = 0 for ins in self.lista_case: tsElseIf = TS.Entorno(ent) ventana.editor.append("\n" + listaElseIf[contador] + ":") for inss in ins.instrucciones: try: inss.traducir(tsElseIf, arbol, ventana) except: pass #ventana.editor.append("\n"+"goto "+etiquetaSalida+";") contador = contador + 1 arbol.entornoGlobal.tabla = { **tsElseIf.tabla, **arbol.entornoGlobal.tabla } if (self.default != None): ventana.editor.append("\n" + etiquetaDefault + ":") entDefault = TS.Entorno(ent) for ins in self.default.instrucciones: try: ins.traducir(entDefault, arbol, ventana) except: pass arbol.entornoGlobal.tabla = { **entDefault.tabla, **arbol.entornoGlobal.tabla } ventana.editor.append("\n" + etiquetaSalida + ":") temp.listaBreak(2, etiquetaSalida)
def traducir(self, ent, arbol, ventana): condicion3D = self.condicion.traducir(ent, arbol, ventana) if (condicion3D == None): return None etiquetaWhile = temp.etiqueta() etiquetaSalida = temp.etiqueta() temp.listaContinue(0, etiquetaWhile) temp.listaBreak(0, etiquetaSalida) ventana.editor.append("\n" + etiquetaWhile + ":") tsWhile = TS.Entorno(ent) for ins in self.instrucciones: try: ins.traducir(tsWhile, arbol, ventana) except: pass if (condicion3D.codigo3D != ""): ventana.editor.append("\n" + condicion3D.codigo3D) ventana.editor.append("\n" + "if(" + condicion3D.temporal.utilizar() + ") goto " + etiquetaWhile + ";") ventana.editor.append("\n" + etiquetaSalida + ":") temp.listaContinue(2, etiquetaWhile) temp.listaBreak(2, etiquetaSalida) arbol.entornoGlobal.tabla = { **tsWhile.tabla, **arbol.entornoGlobal.tabla }
def debugger(self): self.tableWidget.setRowCount(0) self.tableWidget.setRowCount(100) self.tableWidget.setItem(0, 0, QTableWidgetItem("No.")) self.tableWidget.setItem(0, 1, QTableWidgetItem("Simbolo")) self.tableWidget.setItem(0, 2, QTableWidgetItem("Valor")) if (self.hilo_terminado): sys.setrecursionlimit(2147483644) self.consola.clear() ReporteErrores.func(None, True) g.func(0, None) texto = analizar(self.editor.text()) self.gramatica = getGrammar() self.simbolos = getSimbols() g.textoEntrada = texto instrucciones = g.parse(texto) self.instrucciones = instrucciones ts_global = TS.Entorno(None) ast = AST.AST(instrucciones) declaracion1 = Declaracion.Declaracion('$ra', 0, 0, 0, "", "GLOBAL") declaracion2 = Declaracion.Declaracion('$sp', 0, 0, 0, "", "GLOBAL") declaracion1.ejecutar(ts_global, ast, self, True) declaracion2.ejecutar(ts_global, ast, self, True) bandera = False if (instrucciones != None): for ins in instrucciones: try: if (bandera == False and ins.id != "main"): error = Error.Error( "SEMANTICO", "Error semantico, La primera etiqueta debe ser la etiqueta main:", ins.linea, ins.columna) ReporteErrores.func(error) break else: bandera = True if (ast.existeEtiqueta(ins)): error = Error.Error( "SEMANTICO", "Error semantico, Ya existe la etiqueta " + ins.id, ins.linea, ins.columna) ReporteErrores.func(error) else: ast.agregarEtiqueta(ins) except: pass self.ts_global = ts_global self.ast = ast self.listado_gramatical = g.func(1, None).copy() self.debug()
def scan1(self): inputValue = self.tex.get("1.0", "end-1c") tkinter.messagebox.showwarning(title=None, message=inputValue) # asc.texto = inputValue.lower() asc.texto = "CREATE DATABASE casa" sentencias = asc.parse(inputValue) self.sentencias = sentencias tkinter.messagebox.showwarning(title=None, message="1 asc") Ent = Entorno.Entorno(None) ast = Ast.Ast(sentencias) bandera = False if (sentencias != None): for x in sentencias: try: a = True if (ast.exist_label(x)): valueaagregar = Error("SEMANTICO", "Ya existe la variable " + x.value, x.line, x.column) Reporte.agregar(valueaagregar) else: ast.agregarlabel(x) except: pass tkinter.messagebox.showwarning(title=None, message="2") A = ast.getlabels() if (A != None): for W in A: try: if (W.ejecutar(Ent, ast) == True): break except: pass else: valueaagregar = Error("SEMANTICO", "Arbol vacio para compilar ", 0, 0) Reporte.agregar(valueaagregar) self.ent = Ent self.ast = ast
def scan1(self): SentenciasR = Sentencias.ReporteD() SentenciasR.Abrir() ast = [] Ent = [] execr = N.Nodo() execr.start() inputValue=self.tex.get("1.0","end-1c") tkinter.messagebox.showwarning(title=None, message=inputValue) # asc.texto = inputValue.lower() asc.texto ="CREATE DATABASE casa" sentencias = asc.parse(inputValue) self.sentencias = sentencias #tkinter.messagebox.showwarning(title=None, message="1 asc") Ent = Entorno.Entorno(None) print("recorrera") ast = Ast.Ast(sentencias) bandera = False if(sentencias != None): for x in sentencias: try: a = True print("testeara --- ") print(x.id) if(ast.exist_label(x)): print("Ya existe la variable ") print("Ya existe la variable ",x.id) valueaagregar = Datos("SEMANTICO","Ya existe la variable "+x.id,x.line,x.column) Reporte.agregar(valueaagregar) else: print("testeara -exist_label ") print(x.id) ast.agregarlabel(x) except: pass #tkinter.messagebox.showwarning(title=None, message="2") print("parseara") A = ast.getlabels() if(A != None): print("1 ") for W in A: try: print("ejecutara2 ---------------------- ", W) except: pass for W in A: try: print("ejecutara ---------------------- ", W) print("2 ") print("3 ") try: W.ejecutar(Ent,ast) print("4b ") except: print("3b ") pass except: pass print("4 ") else: valueaagregar = Datos("SEMANTICO","Arbol vacio para compilar ",0,0) Reporte.agregar(valueaagregar) self.ent = Ent self.ast = ast
def inicializar(self,ent,arbol,ventana): self.entorno = TS.Entorno(ent) self.temporales = [] for parametro in self.parametros: temporal = parametro.traducir(self.entorno,arbol,ventana) if(temporal != None): self.temporales.append(temporal)
def ascendente(self): sys.setrecursionlimit(2147483644) self.consola.clear() global codigoAug ReporteErrores.func(None,True) g.textoEntrada = codigoAug g.func(0,None) instrucciones = g.parse(codigoAug) self.instrucciones = instrucciones ts_global = TS.Entorno(None) ts_global.asignarConsola(self.consola) ast = AST.AST(instrucciones) declaracion1 = Declaracion.Declaracion('$ra',0,0,0,"","GLOBAL") declaracion2 = Declaracion.Declaracion('$sp',0,0,0,"","GLOBAL") declaracion1.ejecutar(ts_global,ast,self,False) declaracion2.ejecutar(ts_global,ast,self,False) #PRIMERA PASADA PARA GUARDAR TODAS LAS ETIQUETAS bandera = False if(instrucciones != None): for ins in instrucciones: try: if(bandera == False and ins.id != "main"): error = Error.Error("SEMANTICO","Error semantico, La primera etiqueta debe ser la etiqueta main:",ins.linea,ins.columna) ReporteErrores.func(error) break else: bandera = True if(ast.existeEtiqueta(ins)): error = Error.Error("SEMANTICO","Error semantico, Ya existe la etiqueta "+ins.id,ins.linea,ins.columna) ReporteErrores.func(error) else: ast.agregarEtiqueta(ins) except: pass main = ast.obtenerEtiqueta("main") if(main != None): salir = False for ins in main.instrucciones: try: if(isinstance(ins,Asignacion.Asignacion) or isinstance(ins,Conversion.Conversion)): ins.setAmbito("main") if(ins.ejecutar(ts_global,ast,self,False) == True): salir = True break except: pass if(not salir): siguiente = ast.obtenerSiguienteEtiqueta("main") if(siguiente!=None): siguiente.ejecutar(ts_global,ast,self,False) else: error = Error.Error("SEMANTICO","Error semantico, No puede iniciarse el programa ya que no existe la etiqueta main:",0,0) ReporteErrores.func(error) listado = ReporteErrores.func(None) if(len(listado)>0): QMessageBox.critical(self.centralwidget, "Errores en Ejecución", "Se obtuvieron errores en la ejecución del Código Ingresado, verifique reporte de Errores") self.ts_global = ts_global self.ast = ast self.listado_gramatical = g.func(1,None).copy()
def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(1011, 738) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.frameCodigo = QtWidgets.QFrame(self.centralwidget) self.frameCodigo.setGeometry(QtCore.QRect(0, 30, 661, 471)) self.frameCodigo.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frameCodigo.setFrameShadow(QtWidgets.QFrame.Raised) self.frameCodigo.setObjectName("frameCodigo") self.scrollDebug = QtWidgets.QScrollArea(self.centralwidget) self.scrollDebug.setGeometry(QtCore.QRect(660, 30, 341, 471)) self.scrollDebug.setWidgetResizable(False) self.scrollDebug.setObjectName("scrollDebug") self.scrollAreaWidgetContents = QtWidgets.QWidget() self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 339, 469)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.tableWidget = QtWidgets.QTableWidget(self.scrollAreaWidgetContents) self.tableWidget.setGeometry(QtCore.QRect(0, 0, 341, 471)) self.tableWidget.setObjectName("tableWidget") self.tableWidget.setColumnCount(0) self.tableWidget.setRowCount(0) self.scrollDebug.setWidget(self.scrollAreaWidgetContents) self.frameConsola = QtWidgets.QFrame(self.centralwidget) self.frameConsola.setGeometry(QtCore.QRect(0, 500, 1011, 211)) self.frameConsola.setAutoFillBackground(True) self.frameConsola.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frameConsola.setFrameShadow(QtWidgets.QFrame.Raised) self.frameConsola.setObjectName("frameConsola") self.consola = QtWidgets.QPlainTextEdit(self.frameConsola) self.consola.setGeometry(QtCore.QRect(10, 0, 991, 211)) font = QtGui.QFont() font.setFamily("Consolas") font.setPointSize(11) font.setBold(True) font.setWeight(75) font.setKerning(True) font2 = QtGui.QFont() font2.setFamily("Consolas") font2.setPointSize(13) font2.setBold(True) font2.setWeight(100) font2.setKerning(True) self.consola.setFont(font2) self.consola.setAutoFillBackground(False) #self.consola.setTextFormat(QtCore.Qt.RichText) self.consola.setObjectName("consola") self.frame = QtWidgets.QFrame(self.centralwidget) self.frame.setGeometry(QtCore.QRect(-1, 0, 1001, 31)) self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) self.frame.setObjectName("frame") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 1011, 21)) self.menubar.setObjectName("menubar") self.menuArchivo = QtWidgets.QMenu(self.menubar) self.menuArchivo.setObjectName("menuArchivo") self.menuPrograma = QtWidgets.QMenu(self.menubar) self.menuPrograma.setObjectName("menuPrograma") self.menuReportes = QtWidgets.QMenu(self.menubar) self.menuReportes.setObjectName("menuReportes") self.menuAyuda = QtWidgets.QMenu(self.menubar) self.menuAyuda.setObjectName("menuAyuda") self.menuAugus = QtWidgets.QMenu(self.menubar) self.menuAugus.setObjectName("menuAugus") self.menuCMinor = QtWidgets.QMenu(self.menubar) self.menuCMinor.setObjectName("menuCMinor") self.menuReportesC = QtWidgets.QMenu(self.menubar) self.menuReportesC.setObjectName("menuReportesC") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.actionNuevo = QtWidgets.QAction(MainWindow) self.actionNuevo.setObjectName("actionNuevo") self.actionArbir = QtWidgets.QAction(MainWindow) self.actionArbir.setObjectName("actionArbir") self.actionGuardar = QtWidgets.QAction(MainWindow) self.actionGuardar.setObjectName("actionGuardar") self.actionGuardar_Como = QtWidgets.QAction(MainWindow) self.actionGuardar_Como.setObjectName("actionGuardar_Como") self.actionCerrrar = QtWidgets.QAction(MainWindow) self.actionCerrrar.setObjectName("actionCerrrar") self.actionSalir = QtWidgets.QAction(MainWindow) self.actionSalir.setObjectName("actionSalir") self.actionCopiar = QtWidgets.QAction(MainWindow) self.actionCopiar.setObjectName("actionCopiar") self.actionPegar = QtWidgets.QAction(MainWindow) self.actionPegar.setObjectName("actionPegar") self.actionCortar = QtWidgets.QAction(MainWindow) self.actionCortar.setObjectName("actionCortar") self.actionBuscar = QtWidgets.QAction(MainWindow) self.actionBuscar.setObjectName("actionBuscar") self.actionReemplazar = QtWidgets.QAction(MainWindow) self.actionReemplazar.setObjectName("actionReemplazar") self.actionEjecutar_Descendente = QtWidgets.QAction(MainWindow) self.actionEjecutar_Descendente.setObjectName("actionEjecutar_Descendente") self.actionEjecutar_Ascendente = QtWidgets.QAction(MainWindow) self.actionEjecutar_Ascendente.setObjectName("actionEjecutar_Ascendente") self.actionEjecutar_Paso_a_Paso_Ascendente = QtWidgets.QAction(MainWindow) self.actionEjecutar_Paso_a_Paso_Ascendente.setObjectName("actionEjecutar_Paso_a_Paso_Ascendente") self.actionTabla_de_Simbolos = QtWidgets.QAction(MainWindow) self.actionTabla_de_Simbolos.setObjectName("actionTabla_de_Simbolos") self.actionErrores = QtWidgets.QAction(MainWindow) self.actionErrores.setObjectName("actionErrores") self.actionAST = QtWidgets.QAction(MainWindow) self.actionAST.setObjectName("actionAST") self.actionGramatical = QtWidgets.QAction(MainWindow) self.actionGramatical.setObjectName("actionGramatical") self.actionAyuda = QtWidgets.QAction(MainWindow) self.actionAyuda.setObjectName("actionAyuda") self.actionAcercaDe = QtWidgets.QAction(MainWindow) self.actionAcercaDe.setObjectName("actionAcercaDe") self.actionTabla_de_Simbolos2 = QtWidgets.QAction(MainWindow) self.actionTabla_de_Simbolos2.setObjectName("actionTabla_de_Simbolos2") self.actionErrores2 = QtWidgets.QAction(MainWindow) self.actionErrores2.setObjectName("actionErrores2") self.actionAST2 = QtWidgets.QAction(MainWindow) self.actionAST2.setObjectName("actionAST2") self.actionGramatical2 = QtWidgets.QAction(MainWindow) self.actionGramatical2.setObjectName("actionGramatical2") self.actionOpt2 = QtWidgets.QAction(MainWindow) self.actionOpt2.setObjectName("actionOpt2") self.actionGDA = QtWidgets.QAction(MainWindow) self.actionGDA.setObjectName("actionGDA") self.actionCompilarC = QtWidgets.QAction(MainWindow) self.actionCompilarC.setObjectName("CompilarC") self.actionCargarC = QtWidgets.QAction(MainWindow) self.actionCargarC.setObjectName("CargarC") self.actionCargarA = QtWidgets.QAction(MainWindow) self.actionCargarA.setObjectName("CargarA") self.menuArchivo.addAction(self.actionNuevo) self.menuArchivo.addSeparator() self.menuArchivo.addAction(self.actionArbir) self.menuArchivo.addAction(self.actionGuardar) self.menuArchivo.addAction(self.actionGuardar_Como) self.menuArchivo.addSeparator() self.menuArchivo.addAction(self.actionCerrrar) self.menuArchivo.addAction(self.actionSalir) self.menuAugus.addAction(self.actionEjecutar_Descendente) self.menuAugus.addSeparator() self.menuAugus.addAction(self.actionEjecutar_Ascendente) self.menuAugus.addAction(self.actionEjecutar_Paso_a_Paso_Ascendente) self.menuReportes.addAction(self.actionTabla_de_Simbolos) self.menuReportes.addAction(self.actionErrores) self.menuReportes.addAction(self.actionAST) self.menuReportes.addAction(self.actionGramatical) self.menuReportesC.addAction(self.actionTabla_de_Simbolos2) self.menuReportesC.addAction(self.actionErrores2) self.menuReportesC.addAction(self.actionAST2) self.menuReportesC.addAction(self.actionGramatical2) self.menuReportesC.addAction(self.actionOpt2) self.menuReportesC.addAction(self.actionGDA) self.menuCMinor.addAction(self.actionCompilarC) self.menuCMinor.addAction(self.actionCargarC) self.menuCMinor.addAction(self.actionCargarA) self.menuAyuda.addAction(self.actionAyuda) self.menuAyuda.addAction(self.actionAcercaDe) self.menubar.addAction(self.menuArchivo.menuAction()) self.menubar.addAction(self.menuAugus.menuAction()) self.menubar.addAction(self.menuReportes.menuAction()) self.menubar.addAction(self.menuCMinor.menuAction()) self.menubar.addAction(self.menuReportesC.menuAction()) self.menubar.addAction(self.menuAyuda.menuAction()) self.__myFont = QFont() self.__myFont.setPointSize(12) #************************************************ REGLAS DEL LENGUAJE AUGUS ***************************************** self.editor = QsciScintilla() self.editor.setText("") self.editor.setLexer(None) self.editor.setUtf8(True) self.editor.setFont(self.__myFont) #AJUSTES DE TEXTO self.editor.setWrapMode(QsciScintilla.WrapWord) self.editor.setWrapVisualFlags(QsciScintilla.WrapFlagByText) self.editor.setWrapIndentMode(QsciScintilla.WrapIndentIndented) #FIN DE LINEA self.editor.setEolMode(QsciScintilla.EolWindows) self.editor.setEolVisibility(False) #SANGRIA self.editor.setIndentationsUseTabs(False) self.editor.setTabWidth(4) self.editor.setIndentationGuides(True) self.editor.setTabIndents(True) self.editor.setAutoIndent(True) self.editor.setCaretForegroundColor(QColor("#ff0000ff")) self.editor.setCaretLineVisible(True) self.editor.setCaretLineBackgroundColor(QColor("#1f0000ff")) self.editor.setCaretWidth(2) # MARGENES self.editor.setMarginType(0, QsciScintilla.NumberMargin) self.editor.setMarginWidth(0, "0000") #con este se puede quitar la linea self.editor.setMarginsForegroundColor(QColor("#ff888888")) #SE COLOCAN LAS REGLAS DEL EDITOR self.__lexer = QsciLexerRuby(self.editor) self.editor.setLexer(self.__lexer) self.__lyt = QVBoxLayout() self.frameCodigo.setLayout(self.__lyt) self.__lyt.addWidget(self.editor) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.actionNuevo.triggered.connect(self.clean) self.actionArbir.triggered.connect(self.open) self.actionGuardar.triggered.connect(self.save) self.actionGuardar_Como.triggered.connect(self.save_as) self.actionCerrrar.triggered.connect(self.clear) self.actionSalir.triggered.connect(self.exit) self.ruta_archivo = None self.actionEjecutar_Ascendente.triggered.connect(self.ascendente) self.actionEjecutar_Descendente.triggered.connect(self.descendente) self.actionTabla_de_Simbolos.triggered.connect(self.generarTabla) self.actionErrores.triggered.connect(self.generarRErrores) self.actionGramatical.triggered.connect(self.generarRGramatical) self.actionAST.triggered.connect(self.generarAST) self.actionCompilarC.triggered.connect(self.compilar) self.actionCargarA.triggered.connect(self.setAugus) self.actionCargarC.triggered.connect(self.setCMinor) self.actionErrores2.triggered.connect(self.generarRErroresC) self.actionAST2.triggered.connect(self.generarASTC) self.actionGramatical2.triggered.connect(self.generarGramaticalC) self.actionGDA.triggered.connect(self.generarGDAC) self.actionOpt2.triggered.connect(self.generarOptC) self.actionTabla_de_Simbolos2.triggered.connect(self.generarRTSC) self.actionAcercaDe.triggered.connect(self.acercade) self.actionAyuda.triggered.connect(self.ayuda) self.ts_global = TS.Entorno(None) self.ast = AST.AST([]) self.listado_gramatical = [] self.instrucciones = [] self.hilo_terminado = True self.actionEjecutar_Paso_a_Paso_Ascendente.triggered.connect(self.debugger) self.tableWidget.setRowCount(100) self.tableWidget.setColumnCount(3) self.tableWidget.setItem(0,0, QTableWidgetItem("No.")) self.tableWidget.setItem(0,1, QTableWidgetItem("Simbolo")) self.tableWidget.setItem(0, 2 , QTableWidgetItem("Valor")) self.tableWidget.setColumnWidth(0, 10) self.tableWidget.setColumnWidth(1, 75) self.tableWidget.setColumnWidth(2, 175) self.consola.setStyleSheet("background-color: black;border: 1px solid black;color:green;")
def traduccion(self): if self.codigo.text() == "": return self.editor.setText("") sys.setrecursionlimit(2147483644) self.consola.clear() ReporteErrores.func(None,True) g.textoEntrada = self.codigo.text() g.func(0,None) instrucciones = g.parse(self.codigo.text()) self.instrucciones = instrucciones ts_global = TS.Entorno(None) ast = AST.AST(instrucciones) temp.temporal(True) temp.parametro(True) temp.etiqueta(True) temp.listaContinue(-1,None) temp.listaBreak(-1,None) temp.listaReturn(-1,None) temp.listaLLamada(-1,None) temp.listaRecusion(-1,None) #PRIMERA PASADA PARA GUARDAR TODAS LAS FUNCIONES Y STRUCTS if(instrucciones != None): for ins in instrucciones: try: if(isinstance(ins,Funcion)): if(ast.existeEtiqueta(ins)): error = Error.Error("SEMANTICO","Error semantico, Ya existe la funcion "+ins.id,ins.linea,ins.columna) ReporteErrores.func(error) else: if(ins.id != "main"): ins.inicializar(ts_global,ast,self) ast.agregarEtiqueta(ins) elif(isinstance(ins,Struct)): if(ast.existeStruct(ins)): error = Error.Error("SEMANTICO","Error semantico, Ya existe el Struct "+ins.id,ins.linea,ins.columna) ReporteErrores.func(error) else: ast.agregarStruct(ins) except: pass #SE TRADUCE EL METODO MAIN main = ast.obtenerEtiqueta("main") if(main != None): self.editor.append("main:") #se corren las instrucciones globales for ins in instrucciones: try: if(not isinstance(ins,Funcion)): try: ins.traducir(ts_global,ast,self) except: pass except: pass entMain = TS.Entorno(ts_global) for ins in main.instrucciones: try: ins.traducir(entMain,ast,self) except: pass ast.entornoGlobal.tabla = {**entMain.tabla,**ast.entornoGlobal.tabla} ast.entornoGlobal.tabla = {**ts_global.tabla,**ast.entornoGlobal.tabla} else: error = Error.Error("SEMANTICO","Error semantico, No puede iniciarse el programa ya que no existe el metodo main()",0,0) ReporteErrores.func(error) listado = ReporteErrores.func(None) if(len(listado)>0): QMessageBox.critical(self.centralwidget, "Errores en Traducción", "Se obtuvieron errores en la traducción del Código Ingresado, verifique reporte de Errores de Traducción") self.ts_global = ts_global self.ast = ast self.listado_gramatical = g.func(1,None).copy()
def traducir(self, ent, arbol, ventana): funcion = arbol.obtenerEtiqueta(self.id) if (funcion == None): error = Error( "SEMANTICO", "Error semantico, no se encuentra definida una Función con el nombre " + self.id, self.linea, self.columna) ReporteErrores.func(error) return None if (len(funcion.parametros) != len(funcion.temporales)): error = Error( "SEMANTICO", "Error semantico, no se encuentra definida una Función con el nombre " + self.id, self.linea, self.columna) ReporteErrores.func(error) return None if (len(funcion.parametros) != len(self.expresiones)): error = Error( "SEMANTICO", "Error semantico, El número de parametros no son iguales a los definidos en la función " + self.id, self.linea, self.columna) ReporteErrores.func(error) return None enLlamada = TS.Entorno(ent) contador = 0 #funcion.calcularNiveles(funcion.instrucciones) #cantidad = temp.listaRecusion(None,None).count(self.id) for parametro in funcion.parametros: parametro.valor = self.expresiones[contador] parametro.temporal = funcion.temporales[contador] parametro.traducir(enLlamada, arbol, ventana) contador = contador + 1 #llamadaAnterior = temp.listaLLamada(1,None) #recursionAnterior = temp.listaRecusion(1,None) #llamadaPrevia = temp.listaLLamada(1,None) #if(recursionAnterior==self.id): llamadaAnterior = temp.listaLLamada(1, None) # recursionAnterior = temp.listaRecusion(1, None) # # if(cantidad<funcion.nivelesRecursiva): # etiquetaFuncion = temp.etiqueta() # etiquetaSalida = temp.etiqueta() # temp.listaLLamada(0,etiquetaFuncion) # temp.listaRecusion(0,self.id) # funcion.entorno = enLlamada # funcion.etiqueta = etiquetaFuncion # ventana.editor.append("\n"+"goto "+etiquetaFuncion+";") # funcion.traducir(ent,arbol,ventana) # ventana.editor.append("\n"+etiquetaSalida+":") # temp.listaLLamada(2,etiquetaFuncion) # temp.listaRecusion(2,self.id) # #else: # if(llamadaPrevia!=None): # if(llamadaAnterior!=llamadaPrevia): # ventana.editor.append("\n"+"goto "+llamadaPrevia+";") # #else: # #ventana.editor.append("\n"+"goto "+llamadaAnterior+";") #else: if (not recursionAnterior == self.id): etiquetaFuncion = temp.etiqueta() etiquetaSalida = temp.etiqueta() temp.listaLLamada(0, etiquetaFuncion) temp.listaRecusion(0, self.id) funcion.entorno = enLlamada funcion.etiqueta = etiquetaFuncion ventana.editor.append("\n" + "goto " + etiquetaFuncion + ";") funcion.traducir(ent, arbol, ventana) ventana.editor.append("\n" + etiquetaSalida + ":") temp.listaLLamada(2, etiquetaFuncion) temp.listaRecusion(2, self.id) else: # ventana.editor.append("\n" + "goto " + llamadaAnterior + ";") # arbol.entornoGlobal.tabla = { **enLlamada.tabla, **arbol.entornoGlobal.tabla }
def traducir(self,ent,arbol,ventana): tsIf = TS.Entorno(ent) resultCondition = self.condicion.traducir(tsIf,arbol,ventana) if(resultCondition == None): return None etiquetaTrue = temp.etiqueta() etiquetaFalse = temp.etiqueta() etiquetaSalida = temp.etiqueta() if(resultCondition.codigo3D!=""): ventana.editor.append("\n"+resultCondition.codigo3D) ventana.editor.append("\n"+"if("+resultCondition.temporal.utilizar()+") goto "+etiquetaTrue+";") listaElseIf = [] #SE CARGAN LAS ETIQUETAS DEL ELSE IF Y SE IMPRIMEN LAS CONDICIONES for ins in self.listaElseIF: etiquetaTrueElseIf = temp.etiqueta() resultConditionElseIf = ins.condicion.traducir(tsIf,arbol,ventana) if(resultConditionElseIf.codigo3D!=""): ventana.editor.append("\n"+resultConditionElseIf.codigo3D) ventana.editor.append("\n"+"if("+resultConditionElseIf.temporal.utilizar()+") goto "+etiquetaTrueElseIf+";") listaElseIf.append(etiquetaTrueElseIf) if(len(self.instruccionesF)==0 and len(self.listaElseIF) == 0): ventana.editor.append("\n"+"goto "+etiquetaSalida+";") if(len(self.instruccionesF)>0 and len(self.listaElseIF) == 0): ventana.editor.append("\n"+"goto "+etiquetaFalse+";") if(len(self.listaElseIF) > 0): ventana.editor.append("\n"+"goto "+etiquetaFalse+";") ventana.editor.append("\n"+etiquetaTrue+":") for ins in self.instruccionesV: try: ins.traducir(tsIf,arbol,ventana) except: pass ventana.editor.append("\n"+"goto "+etiquetaSalida+";") contador = 0 for ins in self.listaElseIF: tsElseIf = TS.Entorno(ent) ventana.editor.append("\n"+listaElseIf[contador]+":") for inss in ins.instruccionesV: try: inss.traducir(tsElseIf,arbol,ventana) except: pass ventana.editor.append("\n"+"goto "+etiquetaSalida+";") contador = contador + 1 arbol.entornoGlobal.tabla = {**tsElseIf.tabla,**arbol.entornoGlobal.tabla} if(len(self.instruccionesF)>0 and len(self.listaElseIF) > 0): ventana.editor.append("\n"+"goto "+etiquetaFalse+";") if(len(self.instruccionesF)>0): ventana.editor.append("\n"+etiquetaFalse+":") tsElse = TS.Entorno(ent) for ins in self.instruccionesF: try: ins.traducir(tsElse,arbol,ventana) except: pass arbol.entornoGlobal.tabla = {**tsElse.tabla,**arbol.entornoGlobal.tabla} ventana.editor.append("\n"+etiquetaSalida+":") arbol.entornoGlobal.tabla = {**tsIf.tabla,**arbol.entornoGlobal.tabla}